misc.t 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. #!perl -T
  2. use 5.036;
  3. use Test::More;
  4. use Compression::Util qw(:all);
  5. use List::Util qw(shuffle);
  6. plan tests => 822;
  7. ##################################
  8. sub test_array ($arr) {
  9. my @copy = @$arr;
  10. is_deeply(mtf_decode(mtf_encode($arr)), $arr);
  11. is_deeply(abc_decode(abc_encode($arr)), $arr);
  12. is_deeply(ac_decode(ac_encode($arr)), $arr);
  13. is_deeply(adaptive_ac_decode(adaptive_ac_encode($arr)), $arr);
  14. is_deeply(elias_gamma_decode(elias_gamma_encode($arr)), $arr);
  15. is_deeply(elias_omega_decode(elias_omega_encode($arr)), $arr);
  16. is_deeply(fibonacci_decode(fibonacci_encode($arr)), $arr);
  17. is_deeply(delta_decode(delta_encode($arr)), $arr);
  18. is_deeply(rle4_decode(rle4_encode($arr)), $arr);
  19. is_deeply(zrle_decode(zrle_encode($arr)), $arr);
  20. is_deeply([map { ($_->[0]) x $_->[1] } @{run_length($arr)}], $arr);
  21. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr)), $arr);
  22. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr, \&delta_encode), \&delta_decode), $arr);
  23. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr, \&obh_encode), \&obh_decode), $arr);
  24. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr, \&create_ac_entry), \&decode_ac_entry), $arr);
  25. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $arr);
  26. is_deeply(lz77_decode_symbolic(lz77_encode_symbolic($arr)), $arr);
  27. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic($arr, \&delta_encode), \&delta_decode), $arr);
  28. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic($arr, \&obh_encode), \&obh_decode), $arr);
  29. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic($arr, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $arr);
  30. is_deeply(lzss_decode_symbolic(lzss_encode_symbolic($arr)), $arr);
  31. is_deeply(lzss_decode_symbolic(lzss_encode_fast($arr)), $arr);
  32. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic($arr, \&delta_encode), \&delta_decode), $arr);
  33. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic($arr, \&obh_encode), \&obh_decode), $arr);
  34. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic($arr, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $arr);
  35. my ($mtf, $alphabet) = mtf_encode($arr);
  36. is_deeply(mtf_decode(lz77_decompress_symbolic(lz77_compress_symbolic($mtf)), $alphabet), $arr);
  37. is_deeply(mtf_decode(lzss_decompress_symbolic(lzss_compress_symbolic($mtf)), $alphabet), $arr);
  38. is_deeply(obh_decode(obh_encode($arr)), $arr);
  39. is_deeply(obh_decode(obh_encode($arr, \&obh_encode), \&obh_decode), $arr);
  40. is_deeply(obh_decode(obh_encode($arr, \&create_ac_entry), \&decode_ac_entry), $arr);
  41. is_deeply(obh_decode(obh_encode($arr, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $arr);
  42. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr)), $arr);
  43. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic($arr, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $arr);
  44. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic($arr)), $arr);
  45. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic($arr, \&create_ac_entry), \&decode_ac_entry), $arr);
  46. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic($arr, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $arr);
  47. is_deeply($arr, \@copy); # make sure the array has not been modified in-place
  48. }
  49. test_array([]);
  50. test_array([1]);
  51. test_array([0]);
  52. test_array([shuffle((map { int(rand(100)) } 1 .. 20), (map { int(rand(1e6)) } 1 .. 10), 0, 5, 9, 999_999, 1_000_000, 1_000_001, 42, 1)]);
  53. foreach my $str (
  54. "abbaabbaabaabaaaa", "abbaabbaabaabaaaaz", "abbaabbaabaabaaaazz", "abbaabbaabaabaaaazzz",
  55. "abbaabbaabaabaaaazzzz", "abbaabbaabaabaaaazzzzz", "abbaabbaabaabaaaazzzzzz", 'a' x 291,
  56. join('', 'a' x 280, 'b' x 301),
  57. ) {
  58. test_array(string2symbols($str));
  59. is(bzip2_decompress(bzip2_compress($str)), $str);
  60. is(gzip_decompress(gzip_compress($str)), $str);
  61. is(gzip_decompress(gzip_compress($str, \&lzss_encode_fast)), $str);
  62. is(lzb_decompress(lzb_compress($str)), $str);
  63. is(lzb_decompress(lzb_compress($str, \&lzss_encode_fast)), $str);
  64. is(lz4_decompress(lz4_compress($str)), $str);
  65. is(lz4_decompress(lz4_compress($str, \&lzss_encode_fast)), $str);
  66. is(lz77_decompress(lz77_compress($str)), $str);
  67. is(lzss_decompress(lzss_compress($str)), $str);
  68. is(lzss_decompress(lzss_compress($str, \&create_huffman_entry, \&lzss_encode_fast)), $str);
  69. is(lzw_decompress(lzw_compress($str)), $str);
  70. is(bwt_decompress(bwt_compress($str)), $str);
  71. is(symbols2string(mrl_decompress_symbolic(mrl_compress_symbolic($str))), $str);
  72. is(lz77_decode(lz77_encode($str)), $str);
  73. is(lz77_decode(lz77_encode($str, \&lzss_encode_fast)), $str);
  74. is(lzss_decode(lzss_encode($str)), $str);
  75. is(lzss_decode(lzss_encode_fast($str)), $str);
  76. }
  77. is(bzip2_decompress(bzip2_compress('')), '');
  78. is(gzip_decompress(gzip_compress('')), '');
  79. is(gzip_decompress(gzip_compress('', \&lzss_encode_fast)), '');
  80. is(lzb_decompress(lzb_compress('')), '');
  81. is(lzb_decompress(lzb_compress('', \&lzss_encode_fast)), '');
  82. is(lzb_decompress(lzb_compress('a')), 'a');
  83. is(lzb_decompress(lzb_compress('a', \&lzss_encode_fast)), 'a');
  84. is(lz4_decompress(lz4_compress('')), '');
  85. is(lz4_decompress(lz4_compress('', \&lzss_encode_fast)), '');
  86. is(lz4_decompress(lz4_compress('a')), 'a');
  87. is(lz4_decompress(lz4_compress('a', \&lzss_encode_fast)), 'a');
  88. is(bwt_decompress(bwt_compress('a')), 'a');
  89. is(lzss_decompress(lzss_compress('a')), 'a');
  90. is(lzss_decompress(lzss_compress('a', \&create_huffman_entry, \&lzss_encode_fast)), 'a');
  91. is(lzw_decompress(lzw_compress('a')), 'a');
  92. is(bwt_decompress(bwt_compress('')), '');
  93. is(lzss_decompress(lzss_compress('')), '');
  94. is(lzss_decompress(lzss_compress('', \&create_huffman_entry, \&lzss_encode_fast)), '');
  95. is(lzw_decompress(lzw_compress('')), '');
  96. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic([])), []);
  97. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic([0])), [0]);
  98. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic('a')), [ord('a')]);
  99. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic([ord('a')])), [ord('a')]);
  100. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic('a')), [ord('a')]);
  101. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic([1])), [1]);
  102. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic([0])), [0]);
  103. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic([])), []);
  104. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic('a')), [ord('a')]);
  105. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic([1])), [1]);
  106. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic([0])), [0]);
  107. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic([])), []);
  108. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic('a')), [ord('a')]);
  109. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic([1])), [1]);
  110. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic([0])), [0]);
  111. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic([])), []);
  112. ##################################
  113. {
  114. my $str = join('', 'a' x 13, 'b' x 14, 'c' x 10, 'd' x 3, 'e' x 1, 'f' x 1, 'g' x 4);
  115. my @symbols = unpack('C*', $str);
  116. my @copy = @symbols;
  117. my $rl = run_length(\@symbols);
  118. my $rl2 = run_length(\@symbols, 10);
  119. is(scalar(@$rl), 7);
  120. is(scalar(@$rl2), 9);
  121. is_deeply([map { ($_->[0]) x $_->[1] } @$rl], \@symbols);
  122. is_deeply([map { ($_->[0]) x $_->[1] } @$rl2], \@symbols);
  123. is_deeply(rle4_decode(rle4_encode(\@symbols)), \@symbols);
  124. is_deeply(decode_huffman_entry(create_huffman_entry(\@symbols)), \@symbols);
  125. is_deeply(decode_ac_entry(create_ac_entry(\@symbols)), \@symbols);
  126. is_deeply(decode_adaptive_ac_entry(create_adaptive_ac_entry(\@symbols)), \@symbols);
  127. is(lz77_decode(lz77_encode($str)), $str);
  128. is(lz77_decode(lz77_encode($str, \&lzss_encode_fast)), $str);
  129. is(lzss_decode(lzss_encode($str)), $str);
  130. is(lzss_decode(lzss_encode_fast($str)), $str);
  131. is_deeply(lz77_decode_symbolic(lz77_encode_symbolic(\@symbols)), \@symbols);
  132. is(bzip2_decompress(bzip2_compress($str)), $str);
  133. is(gzip_decompress(gzip_compress($str)), $str);
  134. is(gzip_decompress(gzip_compress($str, \&lzss_encode_fast)), $str);
  135. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic(\@symbols)), \@symbols);
  136. is_deeply(mrl_decompress_symbolic(mrl_compress_symbolic(\@symbols, \&create_ac_entry), \&decode_ac_entry), \@symbols);
  137. is(lzw_decompress(lzw_compress($str)), $str);
  138. is(lzw_decompress(lzw_compress($str, \&delta_encode), \&delta_decode), $str);
  139. is(lzw_decompress(lzw_compress($str, \&elias_omega_encode), \&elias_omega_decode), $str);
  140. is(lzw_decompress(lzw_compress($str, \&fibonacci_encode), \&fibonacci_decode), $str);
  141. is(lzw_decompress(lzw_compress($str, \&elias_gamma_encode), \&elias_gamma_decode), $str);
  142. is(lzw_decompress(lzw_compress($str, \&create_ac_entry), \&decode_ac_entry), $str);
  143. is(lzw_decompress(lzw_compress($str, \&create_huffman_entry), \&decode_huffman_entry), $str);
  144. is(lzw_decompress(lzw_compress($str, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $str);
  145. is(lzb_decompress(lzb_compress($str)), $str);
  146. is(lzb_decompress(lzb_compress($str, \&lzss_encode_fast)), $str);
  147. is(lz4_decompress(lz4_compress($str)), $str);
  148. is(lz4_decompress(lz4_compress($str, \&lzss_encode_fast)), $str);
  149. is(lz77_decompress(lz77_compress($str)), $str);
  150. is(lz77_decompress(lz77_compress($str, \&create_ac_entry), \&decode_ac_entry), $str);
  151. is(lz77_decompress(lz77_compress($str, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $str);
  152. is(lzss_decompress(lzss_compress($str)), $str);
  153. is(lzss_decompress(lzss_compress($str, \&create_ac_entry), \&decode_ac_entry), $str);
  154. is(lzss_decompress(lzss_compress($str, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $str);
  155. is(bwt_decompress(bwt_compress($str)), $str);
  156. is(bwt_decompress(bwt_compress($str, \&create_ac_entry), \&decode_ac_entry), $str);
  157. is(bwt_decompress(bwt_compress($str, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), $str);
  158. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic(\@symbols)), \@symbols);
  159. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic(\@symbols, \&create_ac_entry), \&decode_ac_entry), \@symbols);
  160. is_deeply(bwt_decompress_symbolic(bwt_compress_symbolic(\@symbols, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), \@symbols);
  161. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic(\@symbols)), \@symbols);
  162. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic(\@symbols, \&create_huffman_entry, \&lzss_encode_fast)), \@symbols);
  163. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic(\@symbols, \&create_ac_entry), \&decode_ac_entry), \@symbols);
  164. is_deeply(lz77_decompress_symbolic(lz77_compress_symbolic(\@symbols, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), \@symbols);
  165. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic(\@symbols)), \@symbols);
  166. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic(\@symbols, \&create_huffman_entry, \&lzss_encode_fast)), \@symbols);
  167. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic(\@symbols, \&create_ac_entry), \&decode_ac_entry), \@symbols);
  168. is_deeply(lzss_decompress_symbolic(lzss_compress_symbolic(\@symbols, \&create_adaptive_ac_entry), \&decode_adaptive_ac_entry), \@symbols);
  169. is_deeply(\@symbols, \@copy); # make sure the array has not been modified in-place
  170. }
  171. ##################################
  172. {
  173. my $bitstring = "101000010000000010000000100000000001001100010000000000000010010100000000000000001";
  174. my $encoded = binary_vrl_encode($bitstring);
  175. my $decoded = binary_vrl_decode($encoded);
  176. is($decoded, $bitstring);
  177. is($encoded, "1000110101110110111010011110001010101100011110101010000111101110");
  178. }
  179. ##############################################
  180. {
  181. my $str = "INEFICIENCIES";
  182. {
  183. my $encoded = mtf_encode(string2symbols($str), [ord('A') .. ord('Z')]);
  184. my $decoded = mtf_decode($encoded, [ord('A') .. ord('Z')]);
  185. is(join(' ', @$encoded), '8 13 6 7 3 6 1 3 4 3 3 3 18');
  186. is($str, symbols2string($decoded));
  187. }
  188. {
  189. my ($encoded, $alphabet) = mtf_encode(string2symbols($str));
  190. my $decoded = mtf_decode($encoded, $alphabet);
  191. is(join(' ', @$encoded), '3 4 3 4 3 4 1 3 4 3 3 3 5');
  192. is($str, symbols2string($decoded));
  193. }
  194. }
  195. ##############################################
  196. {
  197. my $int1 = int(rand(1 << 5));
  198. my $int2 = int(rand(1 << 6));
  199. my $int3 = int(rand(1e6));
  200. my $binary = pack('b*', int2bits_lsb($int1, 5) . int2bits_lsb($int2, 6) . int2bits_lsb($int3, 32));
  201. open my $fh, '<:raw', \$binary;
  202. my $buffer = '';
  203. my $dec1 = bits2int_lsb($fh, 5, \$buffer);
  204. my $dec2 = bits2int_lsb($fh, 6, \$buffer);
  205. my $dec3 = bits2int_lsb($fh, 32, \$buffer);
  206. is($int1, $dec1);
  207. is($int2, $dec2);
  208. is($int3, $dec3);
  209. }
  210. {
  211. my $int = int(rand(1e6));
  212. my $binary = pack('b*', int2bits_lsb($int, 32));
  213. open my $fh, '<:raw', \$binary;
  214. my $dec = oct('0b' . scalar reverse read_bits_lsb($fh, 32));
  215. is($int, $dec);
  216. }
  217. {
  218. my $int = int(rand(1e6));
  219. my $binary = pack('B*', int2bits($int, 32));
  220. open my $fh, '<:raw', \$binary;
  221. my $dec = oct('0b' . read_bits($fh, 32));
  222. is($int, $dec);
  223. }
  224. {
  225. my $int = int(rand(1e6));
  226. my $binary = pack('B*', int2bits($int, 32));
  227. open my $fh, '<:raw', \$binary;
  228. my $dec = bits2int($fh, 32, \my $buffer);
  229. is($int, $dec);
  230. }
  231. {
  232. my $int = int(rand(1e6));
  233. my $binary = pack('b*', int2bits_lsb($int, 32));
  234. open my $fh, '<:raw', \$binary;
  235. my $dec = bits2int_lsb($fh, 32, \my $buffer);
  236. is($int, $dec);
  237. }
  238. {
  239. my $int = int(rand(1e6));
  240. my $binary = pack('N', $int);
  241. open my $fh, '<:raw', \$binary;
  242. my $dec = bytes2int($fh, 4);
  243. is($int, $dec);
  244. }
  245. {
  246. my $int = int(rand(1e6));
  247. my $binary = pack('b*', int2bits_lsb($int, 32));
  248. open my $fh, '<:raw', \$binary;
  249. my $dec = bytes2int_lsb($fh, 4);
  250. is($int, $dec);
  251. }
  252. {
  253. my $int = int(rand(1e6));
  254. my $binary = pack('b*', int2bits_lsb($int, 32));
  255. my $dec = bytes2int_lsb($binary, 4);
  256. is($int, $dec);
  257. }
  258. {
  259. my $int = int(rand(1e6));
  260. my $binary = pack('B*', int2bits($int, 32));
  261. my $dec = bytes2int($binary, 4);
  262. is($int, $dec);
  263. }
  264. {
  265. is(bytes2int_lsb(int2bytes_lsb(97, 1), 1), 97);
  266. is(bytes2int(int2bytes(97, 1), 1), 97);
  267. is(bytes2int(int2bytes_lsb(97, 1), 1), 97);
  268. is(bytes2int_lsb(int2bytes(97, 1), 1), 97);
  269. is(bytes2int_lsb(int2bytes_lsb(97, 1), 1), 97);
  270. is(bytes2int(int2bytes(97, 1), 1), 97);
  271. is(bytes2int(int2bytes_lsb(97, 1), 1), 97);
  272. is(bytes2int_lsb(int2bytes(97, 1), 1), 97);
  273. my $value = int(rand(1e6));
  274. is(bytes2int(int2bytes($value, 3), 3), $value);
  275. is(bytes2int_lsb(int2bytes_lsb($value, 3), 3), $value);
  276. my $int = 19225;
  277. is(bytes2int(int2bytes($int, 2), 2), $int);
  278. is(bytes2int_lsb(int2bytes_lsb($int, 2), 2), $int);
  279. is(bytes2int(int2bytes_lsb($int, 2), 2), 6475);
  280. is(bytes2int_lsb(int2bytes($int, 2), 2), 6475);
  281. }
  282. {
  283. my $int1 = int(rand(1 << 5));
  284. my $int2 = int(rand(1 << 6));
  285. my $int3 = int(rand(1e6));
  286. my $binary = pack('B*', int2bits($int1, 5) . int2bits($int2, 6) . int2bits($int3, 32));
  287. open my $fh, '<:raw', \$binary;
  288. my $buffer = '';
  289. my $dec1 = bits2int($fh, 5, \$buffer);
  290. my $dec2 = bits2int($fh, 6, \$buffer);
  291. my $dec3 = bits2int($fh, 32, \$buffer);
  292. is($int1, $dec1);
  293. is($int2, $dec2);
  294. is($int3, $dec3);
  295. }
  296. ##############################################
  297. {
  298. my $str = "foo\0bar\0abracadabra\0";
  299. open my $fh, '<:raw', \$str;
  300. my $word1 = read_null_terminated($fh);
  301. my $word2 = read_null_terminated($fh);
  302. my $word3 = read_null_terminated($fh);
  303. is($word1, "foo");
  304. is($word2, "bar");
  305. is($word3, "abracadabra");
  306. }
  307. ###############################################
  308. {
  309. is(crc32("The quick brown fox jumps over the lazy dog"), 0x414fa339);
  310. my $p1 = crc32("The quick brown fox jumps");
  311. my $p2 = crc32(" over the lazy dog", $p1);
  312. is($p2, 0x414fa339);
  313. }
  314. {
  315. # Bzip2 CRC32
  316. my $str = "Hello, world!";
  317. is(oct('0b' . int2bits_lsb(crc32(pack('b*', unpack('B*', $str))), 32)), 0x8e9a7706);
  318. }
  319. ################################################
  320. is(bzip2_decompress("BZh9\27rE8P\x90\0\0\0\0"), "");
  321. is(bzip2_decompress("BZh31AY&SY\31\x93\x9Bk\0\0\0\1\0 \0 \0!\30F\x82\xEEH\xA7\n\22\x032sm`"), "a");
  322. is(bzip2_decompress("BZh91AY&SY\xB1\xF7\@K\0\0\0\@\0\@\0 \0!\30F\x82\xEEH\xA7\n\22\26>\xE8\t`"), "\0");
  323. is(bzip2_decompress("BZh91AY&SY\xEA\xE0\x8D\xEB\0\0\0\xC1\0\0\x100\0 \0!\x98\31\x84aw\$S\x85\t\16\xAE\b\xDE\xB0"), "ab\n");
  324. is(bzip2_decompress("BZh91AY&SY\xFF\xB0\xB7\xA8\0\0\0\xC1\0\@\0\20\0\xA0\0!\x98\31\x84;\13\xB9\"\x9C(H\x7F\xD8[\xD4\0"), "boooo");
  325. is(bzip2_decompress("BZh91AY&SY\x99\xAC\"V\0\0\2W\x80\0\20`\4\0\@\0\x80\6\4\x90\0 \0\"\6\x81\x90\x80i\xA6\x89\30j\xCE\xA4\31o\x8B\xB9\"\x9C(HL\xD6\21+\0"),
  326. "Hello, World!\n");
  327. is(bzip2_decompress("BZh91AY&SY\x99\xAC\"V\0\0\2W\x80\0\20`\4\0\@\0\x80\6\4\x90\0 \0\"\6\x81\x90\x80i\xA6\x89\30j\xCE\xA4\31o\x8B\xB9\"\x9C(HL\xD6\21+\0"),
  328. "Hello, World!\n");
  329. is(
  330. bzip2_decompress(
  331. "BZh91AY&SY\x9A\x89\xB4\"\0\0\0\1\0\0` \0!\0\x82\xB1w\$S\x85\t\t\xA8\x9BB "
  332. . "BZh91AY&SY)\xD4\xF6\xAB\0\0\0\20\0\@\0 \0!\30F\x82\xEEH\xA7\n\22\5:\x9E\xD5`"
  333. . "BZh91AY&SY\xFD\xD4\xD8\x82\0\0\2\1\x80\2\@\24\0 \0!\x9Ah3M\f\xB3\x8B\xB9\"\x9C(H~\xEAlA\0"
  334. ),
  335. "hi there"
  336. );
  337. is(
  338. bzip2_decompress(
  339. "BZh91AY&SY\xEA\xE0\x8D\xEB\0\0\0\xC1\0\0\x100\0 \0!\x98\31\x84aw\$S\x85\t\16\xAE\b\xDE\xB0"
  340. . "BZh91AY&SY\x99\xAC\"V\0\0\2W\x80\0\20`\4\0\@\0\x80\6\4\x90\0 \0\"\6"
  341. . "\x81\x90\x80i\xA6\x89\30j\xCE\xA4\31o\x8B\xB9\"\x9C(HL\xD6\21+\0"
  342. ),
  343. "ab\nHello, World!\n"
  344. );
  345. is(
  346. bzip2_decompress(
  347. "BZh91AY&SY\xE9\xA6L\xBE\0\0\20\xC9\x80\n\20\2\xE0?\xFB\x8B0"
  348. . " \0\x89\fE2i\xA3&\x9A\3A)\xEA\"'\xA8h\3\xD4\xD3gxRZ\4\x8C\xDA'g,\x88\xD5\xA6"
  349. . "\x9C\xEA\xC4\30wWy\xE4\xD7\xC0\x95\xF9L\x89\5\x936'\xED\x95a\22o\%B\x90\x93"
  350. . "T\xAF\xFD\xE6\xEA)\x8D\x90\x82\xB5\x9E\x89Z\xD7X\xB19\x9D0\xC9\21s\x9E\x95"
  351. . "\1\xB2F\xE9\x98\xFD\x8A+O\xAD\xBDi\x96s\e\0\4\xA3G\xC0\xB2\4\xA6_\x8B\xB9\"\x9C(Ht\xD3&_\0"
  352. ),
  353. "abhdhdjfhfhfjfjfhhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdhdaaaaaaammmmmmmmmabababaabababaa"
  354. . "b998899987ababaababababczzzczvzczvzvzvzvzvzvzvzvzvzvzvzvzvzvzvzkdkdkdjdkdjdjdjdkdkdkdkdkdkdkdj"
  355. . "dkdkdjdjdkdjdjdjdjdjdkdmumuishdjdhdhdksjgsyshfbjcidbdbyhebdkjgsbshyehdbididhsbdjodhhdnkduf5\n"
  356. );
  357. ################################################
  358. is(gzip_decompress("\37\x8B\b\0\xB1\e\xC7f\2\3\3\0\0\0\0\0\0\0\0\0"), "");
  359. is(gzip_decompress("\37\x8B\b\0\xE9\e\xC7f\0\3K\4\0C\xBE\xB7\xE8\1\0\0\0"), "a");
  360. is(gzip_decompress("\37\x8B\b\0\23\34\xC7f\0\3c\0\0\x8D\xEF\2\xD2\1\0\0\0"), "\0");
  361. is(gzip_decompress("\37\x8B\b\0\0\0\0\0\2\3\xCB\xC8\4\0\xAC*\x93\xD8\2\0\0\0"), "hi");
  362. is(gzip_decompress("\37\x8B\b\0\xCE\32\xC7f\0\3\xCB\xC8\4\0\xAC*\x93\xD8\2\0\0\0"), "hi");
  363. is(gzip_decompress("\37\x8B\b\0\0\0\0\0\0\3\1\31\0\xE6\xFFTOBEORNOTTOBEORTOBEORNOT\nW\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  364. is(gzip_decompress("\37\x8B\b\0\0\0\0\0\0\3\13\xF1wr\xF5\17\xF2\xF3\17\x810\xE0\\.\0W\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  365. is(gzip_decompress("\37\x8B\b\0?\xD5\xC6f\0\3\13\xF1wr\xF5\17\xF2\xF3\17\t\x013B`\\.\0W\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  366. is(gzip_decompress("\37\x8B\b\b\5\xD1\xC6f\0\3/tmp/test.txt\0\13\xF1wr\xF5\17\xF2\xF3\17\t\x013B`\\.\0W\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  367. is(gzip_decompress("\37\x8B\b\bY\xD6\xC6f\0\3test.txt\0\13\xF1wr\xF5\17\xF2\xF3\17\t\x013B`\\.\0W\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  368. is(gzip_decompress("\37\x8B\b\0Y\xD6\xC6f\0\3\13\xF1wr\xF5\17\xF2\xF3\17\t\x013B`\\.\0W\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  369. is(gzip_decompress("\37\x8B\b\0Y\xD6\xC6f\2\3\13\xF1wr\xF5\17\xF2\xF3\17\t\x013B`\\.\0W\xF9\@\xF8\31\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT\n");
  370. is(gzip_decompress("\37\x8B\b\0\0\0\0\0\0\3\13\xF1wr\xF5\17\xF2\xF3\17\t\xF1wr\xF5\17\n\xF1wr\xF5\17\xF2\xF3\17\xE1\2\0W\xF9\@\xF8\31\0\0\0"),
  371. "TOBEORNOTTOBEORTOBEORNOT\n");
  372. is(
  373. gzip_decompress(
  374. "\37\x8B\b\0\0\0\0\0\0\3=\xC7\1\f\0\0\b\x82\xB0m\xDB\xB6\xADm\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xD6\xD6\xB6m[l\xCDm\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6mmss\xDB\xB6_\xF4p\x8B\x8C\xB4\36W\xF9\@\xF8\31\0\0\0"
  375. ),
  376. "TOBEORNOTTOBEORTOBEORNOT\n"
  377. );
  378. is(gzip_decompress("\37\x8B\b\0\0\0\0\0\0\3=\xC7\xB1\t\0\0\b\3\xC1\xDE\xB1\4[\37\$\xFB\xCFb\21Hw'z\xB8EFZ\17W\xF9\@\xF8\31\0\0\0"),
  379. "TOBEORNOTTOBEORTOBEORNOT\n");
  380. is(
  381. gzip_decompress(
  382. "\37\x8B\b\0\0\0\0\0\0\3\5\x80\1\f\0 \b\xC2\xB6m\xDB\xB6\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\e\e\xDB\xB6m~c\xDF\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xB6m\xDB\xD6\$e\x87\x922I\xD9\xE1\xFBW\xF9\@\xF8\31\0\0\0"
  383. ),
  384. "TOBEORNOTTOBEORTOBEORNOT\n"
  385. );
  386. is(gzip_decompress("\37\x8B\b\20\x9D\x9A\xC9f\2\3hello world\n\0KLJN\x84 \4\xE0\2\0\xE3#7]\25\0\0\0"), "abcabcabcaaaaaaaaaaa\n");
  387. is(gzip_decompress("\37\x8B\b\30\xA8\x9A\xC9f\0\3hello\0hi\n\0\xCBH\xCD\xC9\xC9W(\xCF/\xCAI\xE1\2\0-;\b\xAF\f\0\0\0"), "hello world\n");
  388. is(
  389. gzip_decompress(
  390. "\37\x8B\b\0\0\0\0\0\0\3\xCB\xC8\4\0\xAC*\x93\xD8\2\0\0\0"
  391. . "\37\x8B\b\0\0\0\0\0\0\3S\0\0E\xCFl\xE9\1\0\0\0"
  392. . "\37\x8B\b\0d\e\xC7f\2\3+\xC9H-J\5\0\x96\xE9/Z\5\0\0\0"
  393. ),
  394. "hi there"
  395. );
  396. ###################################################
  397. is(lz4_decompress("\4\"M\30d\@\xA7\0\0\0\0\5]\xCC\2"), "");
  398. is(lz4_decompress("\4\"M\30`ps\0\0\0\0"), "");
  399. is(lz4_decompress("\4\"M\30d\@\xA7\1\0\0\x80a\0\0\0\0Vt\rU"), "a");
  400. is(lz4_decompress("\4\"M\30`ps\2\0\0\0\20a\0\0\0\0"), "a");
  401. is(lz4_decompress("\4\"M\30`ps\b\0\0\x002abc\3\0\20\n\0\0\0\0"), "abcabcabc\n");
  402. is(lz4_decompress("\4\"M\30d\@\xA7\n\0\0\x80abcabcabc\n\0\0\0\0\xE9j\xA1C"), "abcabcabc\n");
  403. is(lz4_decompress("\4\"M\30`ps\13\0\0\0\xA0abcabcabc\n\0\0\0\0"), "abcabcabc\n");
  404. is(lz4_decompress("\4\"M\30`ps\f\0\0\x003abc\3\0\31a\1\0\20\n\0\0\0\0"), "abcabcabcaaaaaaaaaaaaaaa\n");
  405. is(lz4_decompress("\4\"M\30d\@\xA7\17\0\0\x003abc\3\0\6\1\0Paaaa\n\0\0\0\0G}M\xC6"), "abcabcabcaaaaaaaaaaaaaaa\n");
  406. is(lz4_decompress("\4\"M\30`\@\x82\17\0\0\x003abc\3\0\6\1\0Paaaa\n\0\0\0\0"), "abcabcabcaaaaaaaaaaaaaaa\n");
  407. is(lz4_decompress("\4\"M\30p\@\xAD\17\0\0\x003abc\3\0\6\1\0Paaaa\n\xF6\xFE\xFE0\0\0\0\0"), "abcabcabcaaaaaaaaaaaaaaa\n");
  408. is(lz4_decompress("\4\"M\30t\@\xBD\17\0\0\x003abc\3\0\5\1\0Paaaaa\a\x8A+\xDD\0\0\0\0\\\13\x81\xFE"), "abcabcabcaaaaaaaaaaaaaaa");
  409. is(lz4_decompress("\4\"M\30t\@\xBD\26\0\0\0\x92TOBEORNOT\t\0\x90TOBEORNOTb\xC52\32\0\0\0\0\x9Dn#B"), "TOBEORNOTTOBEORTOBEORNOT");
  410. is(lz4_decompress("\4\"M\30d\@\xA7\26\0\0\0\x92TOBEORNOT\t\0\x90TOBEORNOT\0\0\0\0\x9Dn#B"), "TOBEORNOTTOBEORTOBEORNOT");
  411. is(lz4_decompress("\4\"M\30`ps\21\0\0\0\x92TOBEORNOT\t\0\4\17\0\20T\0\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT");
  412. is(lz4_decompress("\4\"M\30`\@\x82\26\0\0\0\x92TOBEORNOT\t\0\x90TOBEORNOT\0\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT");
  413. is(lz4_decompress("\4\"M\30p\@\xAD\26\0\0\0\x92TOBEORNOT\t\0\x90TOBEORNOTb\xC52\32\0\0\0\0"), "TOBEORNOTTOBEORTOBEORNOT");
  414. is(
  415. lz4_decompress("\4\"M\30d\@\xA7\16\0\0\x80Hello, World!\n\0\0\0\0\xE8C\xD0\x9E" . "\4\"M\30d\@\xA7\27\0\0\0\xE5Hello, World! \16\0Prld!\n\0\0\0\0\x9FL\"T"),
  416. "Hello, World!\nHello, World! Hello, World!\n"
  417. );
  418. is(
  419. lz4_decompress(
  420. "\4\"M\30`ps\b\0\0\x002abc\3\0\20\n\0\0\0\0"
  421. . "\4\"M\30d\@\xA7\17\0\0\x003abc\3\0\6\1\0Paaaa\n\0\0\0\0G}M\xC6"
  422. . "\4\"M\30d\@\xA7\26\0\0\0\x92TOBEORNOT\t\0\x90TOBEORNOT\0\0\0\0\x9Dn#B"
  423. . "\4\"M\30t\@\xBD\17\0\0\x003abc\3\0\5\1\0Paaaaa\a\x8A+\xDD\0\0\0\0\\\13\x81\xFE"
  424. ),
  425. "abcabcabc\n" . "abcabcabcaaaaaaaaaaaaaaa\n" . "TOBEORNOTTOBEORTOBEORNOT" . "abcabcabcaaaaaaaaaaaaaaa"
  426. );
  427. ###################################################
  428. {
  429. my $data = do {
  430. open my $fh, '<:raw', __FILE__;
  431. local $/;
  432. <$fh>;
  433. };
  434. is(gzip_decompress(gzip_compress($data)), $data);
  435. is(gzip_decompress(gzip_compress($data, \&lzss_encode_fast)), $data);
  436. is(bzip2_decompress(bzip2_compress($data)), $data);
  437. is(lzss_decompress(lzss_compress($data)), $data);
  438. is(lzss_decompress(lzss_compress($data, \&create_huffman_entry, \&lzss_encode_fast)), $data);
  439. is(lzb_decompress(lzb_compress($data)), $data);
  440. is(lzb_decompress(lzb_compress($data, \&lzss_encode_fast)), $data);
  441. is(lz4_decompress(lz4_compress($data)), $data);
  442. is(lz4_decompress(lz4_compress($data, \&lzss_encode_fast)), $data);
  443. is(bwt_decompress(bwt_compress($data)), $data);
  444. is(mrl_decompress(mrl_compress($data)), $data);
  445. is(lz77_decompress(lz77_compress($data)), $data);
  446. is(lz77_decompress(lz77_compress($data, \&create_huffman_entry, \&lzss_encode_fast)), $data);
  447. is(lzw_decompress(lzw_compress($data)), $data);
  448. }
  449. ###################################################