#!perl -w
# vim: ft=perl
# (C) 2005 XDA Developers  itsme@xs4all.nl
use strict;
$|=1;
# NOTE: the commented out tests were there for experimenting, they are expected to fail
#
my $loaded;

my $t= 1;

BEGIN { $|=1; print "1..36\n"; }
END { print "not ok $t\n" unless $loaded; }
use XdaDevelopers::CompressUtils;
$loaded = 1;
print "ok $t\n";
$t++;

print "\n ... with 3 data ... \n";
my $compressed3_a = pack("H*", "500000430000a0deaa0000021101030000010073796e632e610076616e74676f2e63406f6d0050000001007a414301479501560204020102781e1ef0a300b303010100");
my $uncompressed3_a=pack("H*", "deaa000002000001deaa0000010073796e632e6176616e74676f2e636f6d005000000000004176616e74476f2e636f6d004176616e74476f00000000000000021e1ef000000100000000000000000000");
testdecompress("rom3uncompress",  $compressed3_a, $uncompressed3_a);
#testdecompress("rom4uncompress",  $compressed3, $uncompressed3, 1);
#testdecompress("romuncompress_v3",  $compressed3, $uncompressed3);
#testdecompress("romuncompress_v4",  $compressed3, $uncompressed3, 1);
#testdecompress("romuncompress_v5",  $compressed3, $uncompressed3);
#testdecompress("rom3uncompressRom", $compressed3, $uncompressed3, 1);
#testdecompress("DoCeCompressDecode",$compressed3, $uncompressed3);

my $compressed3_b = pack("H*", "4800003e0000003010c30001140040d2801200021c61f09200f1a961181122002861b893014a0c61e816021812a20235a561ec1203000461fc9303020261");
my $uncompressed3_b=pack("H*", "3010C300011400408010C300021C0040F010C300000100401811C30001280040B811C300010C0040E811C300010C00401812C30001350040EC12C30000040040FC12C30000020040");
testdecompress("rom3uncompress",  $compressed3_b, $uncompressed3_b);

print "\n ... with 4 data ... \n";

# test example v4 decompression
my $compressed4= pack("H*", "f10000ba000010000000f1000000a4000000f10000005b80808d0010120f00000000230300400f434042447fa2be18b405aa2c93398451e5dae6b2756f12e5ef008400000400008846002008102e1de1c05810737dc25447fb3ba1f800000000000090010319cfccd721dfef10bf9f53ee829013b718099b96bc25250e8c6d11a0d8776e79d2660cde2ed289c99dda44bf14316eeadfeedeb0ece0e26cbc43e6cf2f5c2f10897a26cdbc2708bd4e7d42e13d8a9e2afcf26f00e0");
my $uncompressed4= pack("H*", "3c7374696e6765722d636f6e74726f6c70616e656c2d646f633e0d0a093c63706c2d7469746c65207265733d223330303430222f3e0d0a093c63706c2d6c696e6b20687265663d2273796e635f7363686564756c652e63706c2e786d6c22207265733d223330303337222f3e0d0a093c63706c2d6c696e6b20687265663d2273796e635f70632e63706c2e786d6c22207265733d223330303336222f3e0d0a093c63706c2d6c696e6b20687265663d2273796e635f7365727665722e63706c2e786d6c22207265733d223330303538222f3e0d0a3c2f7374696e6765722d636f6e74726f6c70616e656c2d646f633e0d0a");

#testdecompress("rom3uncompress",  $compressed4, $uncompressed4, 1);
testdecompress("rom4uncompress",  $compressed4, $uncompressed4, 1);
testdecompress("rom4uncompress",  $compressed4, $uncompressed4, 1);
#testdecompress("romuncompress_v3",  $compressed4, $uncompressed4);
#NOLIBS - testdecompress("romuncompress_v4",  $compressed4, $uncompressed4, 1);
#testdecompress("romuncompress_v5",  $compressed4, $uncompressed4);
#testdecompress("rom3uncompressRom", $compressed4, $uncompressed4, 1);  <-- no longer supported
#testdecompress("DoCeCompressDecode",$compressed4, $uncompressed4);

print "\n ... with 5 XPR data ... \n";

my $compressed5_xpr= pack("H*",   "0086a20a424d86000300461800281800101c00010002c30003b8000f0000aea10007006180808000c0c0c000ffff010008ffff00aa07002aa8aaaa0aa0aaaa8282aaaaa00aaaaaa82a3b007900b900f900070001");
my $uncompressed5_xpr= pack("H*", "424d860000000000000046000000280000001000000010000000010002000000000000030000280f0000ae10000000000000000000000000000080808000c0c0c000ffffff00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2aa8aaaa0aa0aaaa8282aaaaa00aaaaaa82aaaaaa00aaaaa8282aaaa0aa0aaaa2aa8aaaaaaaaaaaaaaaaaaaaaaaaaa");

#testdecompress("rom3uncompress",  $compressed5_xpr, $uncompressed5_xpr, 1);
#testdecompress("rom4uncompress",  $compressed5_xpr, $uncompressed5_xpr, 1);
#testdecompress("romuncompress_v3",  $compressed5_xpr, $uncompressed5_xpr);
#testdecompress("romuncompress_v4",  $compressed5_xpr, $uncompressed5_xpr);
#testdecompress("romuncompress_v5",  $compressed5_xpr, $uncompressed5_xpr);
#testdecompress("rom3uncompressRom", $compressed5_xpr, $uncompressed5_xpr);
#NOLIBS - testdecompress("DoCeCompressDecode",$compressed5_xpr, $uncompressed5_xpr);
testdecompress("XPR_DecompressDecode",$compressed5_xpr, $uncompressed5_xpr);

my $compressed_xph=   pack("H*", "00000000000770000000000000000000a496a09987907877778889090977770870786798780a7777077786899a0000005067566767986656a655657889aaa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090900000000000000000000000000000a0a0000000000008898a90a00000000999a99aa00aa0000877879999909aa7078999a999a09aa7a879a0a900000a9a0879989000a000090779909a000000a9986779999aaa9aa8098aa00a0000000a00000000000000000000000000000000000000000000000000000000000000000ec897a3dd4ed3572559ea6957870109e594b9032a4c48e70b442884211ebc0979711355c600ccc28e732470dddce7b3ded8e4ed4f998186690129a1e03c6860918978d1831956482615066c9e6e8338dc981c3548c031aacc7b4ddd7a5db4cd6ea6c259a314a36b00d4ea0b215caac29309d23cfcd6196127cad691206753ba5a65016211949c036a67ab5b7fbecfbe9c322c24e8fddeeb30921d3f756d86c6e40adaa9267da42070d8307aadb15b0985f4376c8b51951010ceaf66c3280e9a7421282e180d4354dc256bda2fa934aa41d9394197d112c3d26904aa7320b8a637be551035561a2f64b4af6806acbe408e6228eae13f749b7226523149d4be02be5e68ecf4788219b931027409b4f93c0192184001c6a4380330ca524139486266964e3f34a4c344a503f896cd2b1cee02944859d76c2455e60b4d783f3ef4e239bc92e3ff75b12f21e9052dee552b2045a514ce2d017bf1f624685009d334fa8d4df51a941f548356d85c487ba2a7f73b2c3d693273503060ee516a2b271884e6760ae1669a7fde8d6c68bce8c1ce29ed4cbdab3a4d7b1d2385067f8647f6098319dc3145c3c99c59550f60c260e27362451486309d14a493a5235063612937011aa19591ec14b1bb790565287cfa1371a1d7fb15a5ec9106b9535a7cac489adc5513443c2592de5739950845aa219ba096684816450cb59232aaf9075ae53725ea4ca00956b521f6f397361621b029aabc9d6b9927704479f56e1e5a59bedf6628f576acbbac42cf87565f9cff9e5b052badab847c71e5c40fac369e8ebb8c68807e87a98f4e5659bc83bdf80f48ca43bb2a8ccaa4b8e88340bf376de00e88e2c7a68d64c20edc5877137a3439847bb410304be3b6065c5f2064d9ada807dd36b616133070d7916baace59c29d67646cbca68c37fff765bacb473d3164dfaebf3f01cc478bc0ef2abfdbea3b0a4415f3ebc87ef047668830b4f19d09e969801c58426b419a12d05963719de84135a05d01a19dd980534918f6fa0af26f2e0c81585255344de37543c19025488abf1"
   ."ba2059f918eaeb44d1f0492995a01c6e21712987618fcc6256e8d8954d9b776ca174847c55d4aa58b7225d6d94470cc984eb38d6e765883daf05e11c1263e4c706857caabf59c440854fc55b588c2c60b6044086bb544acfc4fc0ab25db64399656857dea30145ffbc2dabbd6e7d44855dc48eb3901b50b343a0c705fa48f0037d0abe99c2d9c0b981c59063ab710d7dfbf85b1f214ab4288b717ac060ec8158dffce78c3413770bcc80a4485988b21ca9d72642332e663f2e1f80c3ec406fe311ff99bfe13e00c5e99b22cc24d6659e557bda796417010a5c4ef29e245b73fa4c83703ef27b9b500355d75bd893cc2c2141a88c8b2136c0b99b4ae83e7b6d18a3936162368350767d901291a96181ba844201dc98a4faae2e87bb11863cb51ad50e4d8458bf7d74ab50601c0cf1108c20d447890d1daadfdd9811a11cfd94788e4b91838e95f3ce02153de7fd2c7e3c6eb0ec11664faf033ccf63273f9e1171579fa7b427da061028b0b05fa1ba2dfa1e3b90f411fd551fe89f3e097a29d7100c817ebf72bada5a6d030bf1013930693ac9ddcbea6c885dc9efeec74999a31f271bf517ff9be16d6b1fe4d86d7f4405ced07f3e8fe44c54829b69b8fcf4dba162c8c0bfadaf186b27d49809120fcc429e031a2fe6e00eb42fe877e1255b94bdb1a883e94c2330669f8b9fb61329196de9f374d82e37fb77c8094c74456e78ed769a06617dbfdf0c618fc7df105d95001e4d6d016f6b7f9fffe6685bdacc37e70a6b6f3b6137be1fddefb933c6a150be2b870787fcc5cb28af3c5001ef4324d864ffc06f6d6fbe1ca3a218c4fec91f894952b4ce7523a7dce1a040e2bd81f3ffb0ae05c95f06fe9c04b427735b6730b9ccd1f4c0edfb53df74a1df97340f59045839d24b498e95d7ed00100000");
my $uncompressed_xph= pack("H*", "3c212d2d0d0a436f7079726967687420286329204d6963726f736f667420436f72706f726174696f6e2e2020416c6c207269676874732072657365727665642e0d0a2d2d3e0d0a3c212d2d0d0a557365206f6620746869732073616d706c6520736f7572636520636f6465206973207375626a65637420746f20746865207465726d73206f6620746865204d6963726f736f66740d0a6c6963656e73652061677265656d656e7420756e64657220776869636820796f75206c6963656e73656420746869732073616d706c6520736f7572636520636f64652e2049660d0a796f7520646964206e6f742061636365707420746865207465726d73206f6620746865206c6963656e73652061677265656d656e742c20796f7520617265206e6f740d0a617574686f72697a656420746f2075736520746869732073616d706c6520736f7572636520636f64652e20466f7220746865207465726d73206f6620746865206c6963656e73652c0d0a706c656173652073656520746865206c6963656e73652061677265656d656e74206265747765656e20796f7520616e64204d6963726f736f6674206f722c206966206170706c696361626c652c0d0a73656520746865204c4943454e53452e525446206f6e20796f757220696e7374616c6c206d65646961206f722074686520726f6f74206f6620796f757220746f6f6c7320696e7374616c6c6174696f6e2e0d0a5448452053414d504c4520534f5552434520434f44452049532050524f564944454420224153204953222c2057495448204e4f2057415252414e544945532e0d0a2d2d3e0d0a3c21444f43545950452068746d6c205055424c494320222d2f2f574150464f52554d2f2f445444205848544d4c204d6f62696c6520312e302f2f454e222022687474703a2f2f7777772e776170666f72756d2e6f72672f4454442f7868746d6c2d6d6f62696c6531302e647464223e0d0a3c48544d4c3e0d0a3c6d65746120687474702d65717569763d436f6e74656e742d5479706520636f6e74656e743d22746578742f68746d6c3b20636861727365743d57696e646f77732d31323532223e0d0a3c484541443e0d0a3c5449544c453e0d0a41626f757420496e7465726e6574204578706c6f72657220666f722057696e646f77732043450d0a3c2f5449544c453e0d0a0d0a3c736372697074206c616e67756167653d226a617661736372697074223e0d0a7661722062726f777365724e616d65203d206e6176696761746f722e6170704e616d650d0a7661722062726f7773657256657273696f6e203d206e6176696761746f722e61707056657273696f6e0d0a7661722062726f7773657256657273696f6e4e756d203d207061727365466c6f617428"
   ."62726f7773657256657273696f6e290d0a76617220636f64654e616d653d6e6176696761746f722e617070436f64654e616d650d0a76617220757365724167656e743d6e6176696761746f722e757365724167656e740d0a76617220706c6174666f726d3d6e6176696761746f722e706c6174666f726d0d0a76617220637075436c6173733d6e6176696761746f722e637075436c6173730d0a0d0a66756e6374696f6e20476574536372697074456e67696e65496e666f28297b0d0a20202076617220733b0d0a20202073203d2022223b0d0a20202073202b3d20536372697074456e67696e652829202b20222076657273696f6e20223b0d0a20202073202b3d20536372697074456e67696e654d616a6f7256657273696f6e2829202b20222e223b0d0a20202073202b3d20536372697074456e67696e654d696e6f7256657273696f6e2829202b20222e223b0d0a20202073202b3d20536372697074456e67696e654275696c6456657273696f6e28293b0d0a20202072657475726e2873293b0d0a7d0d0a0d0a766172206a7356657273696f6e3d312e300d0a3c2f7363726970743e0d0a3c736372697074206c616e67756167653d224a617661536372697074312e31223e0d0a202020766172206a7356657273696f6e3d312e310d0a3c2f7363726970743e0d0a3c736372697074206c616e67756167653d224a617661536372697074312e32223e0d0a202020766172206a7356657273696f6e3d312e320d0a3c2f7363726970743e0d0a3c736372697074206c616e67756167653d224a617661536372697074312e33223e0d0a202020766172206a7356657273696f6e3d312e330d0a3c2f7363726970743e0d0a3c736372697074206c616e67756167653d224a617661536372697074312e34223e0d0a202020766172206a7356657273696f6e3d312e340d0a3c2f7363726970743e0d0a3c736372697074206c616e67756167653d224a617661536372697074312e35223e0d0a202020766172206a7356657273696f6e3d312e350d0a3c2f7363726970743e0d0a0d0a3c2f484541443e0d0a0d0a3c424f4459206267636f6c6f723d222346464646464622207363726f6c6c3d6e6f207374796c653d226261636b67726f756e643a236666666666663b206261636b67726f756e642d696d6167653a75726c282761626f757462672e67696627293b206261636b67726f756e642d7265706561743a6e6f2d7265706561743b206261636b67726f756e642d706f736974696f6e3a20626f74746f6d207269676874223e0d0a3c212d2d0d0a3c696d67207372633d2262616e6e65722e6769662220616c743d225468616e6b20796f7520666f72207573696e6720496e7465726e6574204578706c6f726572203620666f722057696e646f77"
   ."7320434522207374796c653d22706f736974696f6e3a6162736f6c7574653b20746f703a303b206c6566743a303b223e0d0a3c7461626c6520626f726465723d30207374796c653d22706f736974696f6e3a6162736f6c7574653b20746f703a3135303b206c6566743a38303b223e0d0a2d2d3e0d0a3c7461626c6520626f726465723d302077696474683d313030253e0d0a3c54523e0d0a3c54443e3c2f54443e0d0a3c54442069643d4c6f676f20636f6c7370616e3d333e3c696d67207372633d2262616e6e65722e6769662220616c743d225468616e6b20796f7520666f72207573696e6720496e7465726e6574204578706c6f726572203620666f722057696e646f7773204345223e3c2f54443e0d0a3c54443e3c2f54443e0d0a3c2f54523e0d0a3c54523e0d0a3c54443e3c2f54443e0d0a3c54443e3c2f54443e0d0a3c54442069643d50726f64496e666f416c69676e20636f6c7370616e3d3320616c69676e3d6c6566743e0d0a203c49442069643d50726f64756374496e666f313e0d0a203c7370616e2069643d50726f64496e666f5374796c65207374796c653d2257494454483a203335656d3b20434f4c4f523a20626c61636b3b20464f4e543a20387074205461686f6d612c204d53205368656c6c20446c67223e0d0a0d0a2020203c736372697074206c616e67756167653d226a617661736372697074223e0d0a202020646f63756d656e742e777269746520282242726f777365723a203c623e222b2062726f777365724e616d65202b223c2f623e3c62723e22290d0a202020646f63756d656e742e7772697465202822506c6174666f726d3a203c623e222b20706c6174666f726d202b223c2f623e3c62723e22290d0a202020646f63756d656e742e777269746520282243505520636c6173733a203c623e222b20637075436c617373202b223c2f623e3c62723e22290d0a202020646f63756d656e742e777269746520282256657273696f6e3a203c623e222b2062726f7773657256657273696f6e202b223c2f623e3c62723e22290d0a202020646f63756d656e742e777269746520282255736572204167656e743a203c623e222b20757365724167656e74202b223c2f623e3c62723e22290d0a202020646f63756d656e742e77726974652028224a6176615363726970743a203c623e222b206a7356657273696f6e202b223c2f623e3c62723e22290d0a0d0a202020766172207665723b0d0a202020766572203d20476574536372697074456e67696e65496e666f28290d0a202020646f63756d656e742e777269746528223c623e22202b20766572202b20223c2f623e22293b0d0a0d0a2020203c2f7363726970743e0d0a2020203c6e6f7363726970743e536372697074206e6f7420737570706f72746564"
   ."2e3c2f6e6f7363726970743e0d0a0d0a2020203c534352495054204c414e47554147453d225642536372697074223e0d0a20202046756e6374696f6e20476574536372697074456e67696e65496e666f0d0a20202020202044696d20730d0a20202020202073203d20222220202027204275696c6420737472696e672077697468206e656365737361727920696e666f2e0d0a20202020202073203d20536372697074456e67696e65202620222056657273696f6e20220d0a20202020202073203d2073202620536372697074456e67696e654d616a6f7256657273696f6e202620222e220d0a20202020202073203d2073202620536372697074456e67696e654d696e6f7256657273696f6e202620222e220d0a20202020202073203d2073202620536372697074456e67696e654275696c6456657273696f6e0d0a202020202020476574536372697074456e67696e65496e666f203d2073202020272052657475726e2074686520726573756c74732e0d0a202020456e642046756e6374696f6e0d0a0d0a2020202044696d207665720d0a20202020766572203d20476574536372697074456e67696e65496e666f0d0a20202020646f63756d656e742e77726974652028223c62723e3c623e22202b20766572202b20223c2f623e2220290d0a2020203c2f7363726970743e0d0a2020203c2f7370616e3e0d0a3c2f54443e0d0a3c2f54523e0d0a3c54523e0d0a3c54443e3c2f54443e0d0a3c54443e3c2f54443e0d0a3c54443e0d0a203c7370616e2069643d436f70797269676874207374796c653d2257494454483a203235656d3b20434f4c4f523a20626c61636b3b20464f4e543a20387074205461686f6d612c204d53205368656c6c20446c67223e0d0a436f707972696768742026636f70793b32303036204d6963726f736f667420436f72706f726174696f6e2e0d0a203c2f7370616e3e0d0a3c2f54443e0d0a3c54442069643d6f6b2d627574746f6e20616c69676e3d72696768743e3c2f54443e0d0a3c54643e3c2f54443e0d0a3c2f54523e0d0a3c2f7461626c653e0d0a3c2f7370616e3e0d0a3c2f424f44593e0d0a3c2f48544d4c3e0d0a");

#my $cdata= XdaDevelopers::CompressUtils::XPH_CompressEncode($uncompressed_xph);
#printf("XPH: %s\n", unpack("H*", $cdata));
testdecompress("XPH_DecompressDecode",$compressed_xph, $uncompressed_xph);

print "\n ... with 5 LZX data ... \n";

my $compressed5_lzx= pack("H*","a8000000e50000005b80808d0010510e00000000330300500e452754dc6b2ec802a1674a659ba437edabaaca70b708aaffa9ffff40700000000000cd0d0030017121812726329885cc964e4915aaff3ffeff800000000000000001104200ff42ffff22fd4129593663b748a75aa83093ef5a2f386c5fc730e6b2c2b784cc5b4737b11c19fa20fcbcec0a96fe28c0efa35af83b80076ba675ffa73ea7954b7f8164a204e6787cb945ef110893d06e0040");
my $uncompressed5_lzx= pack("H*","4d4d4920416c6c0d0a5452414345434c4153532046460d0a4d4d490d0a0d0a4d4d20416c6c0d0a5452414345434c4153532046460d0a4d4d0d0a0d0a474d4d20414c4c0d0a5452414345434c4153532046460d0a474d4d0d0a0d0a434320416c6c0d0a5452414345434c4153532046460d0a43430d0a0d0a534d5320416c6c0d0a5452414345434c4153532046460d0a534d530d0a0d0a5353204576656e740d0a5452414345434c4153532030320d0a53530d0a0d0a4c31205374642054726163650d0a434f4e464947204c315f504152414d533d3c302c3132373e0d0a4353540d0a0d0a");

my $compressed5_lzx2= pack("H*","58010000800200005b80808d002000280810008100002300005040006f5fde7b13b4caeaa261155ab84448500885d5a81245c08d17b9270a11b82870258d6a4b52b517842112e555a26a818ba12b914b402400000600a86804a0ef814da29200046a24238ac45291913c18898891a492195efd3b10fe00400000000000002166cff6679366df7cea30a3fdd43f5ee8453669084355a26514e3c2ad887a05c7e815598f0e4189975af781b70d839429b9b0f04254142c4bb1620ca1086e876472e6f206b4c5daa11cf49660bb0de4a8a18824380ec8c619d76bef840304e5a7bc915530e5038a1a7eca4dc27c885076fe6077021795a66f0a75495f397a39a9cc0b4ac9680bb334ac0e2548c1daed9e19714695e6505a3a1e4517ca7456d4ab1ec4a5bdcb748456ce09637fe5f12e51ffd930b0704af368da3db7a52952a6e342544451953e47a642587753b626f3be27f830bbdcfedf97bfd0b0fababa8bdca7"); # 
my $uncompressed5_lzx2= pack("H*", "d0010080240000805407008055070080c80100807e0500801002008011020080c4000080c50000803f0000802c0400807b0300801e01008001010080000100802a040080e0000080dd000080ab020080a10200804e0300800801008003010080020100801d0100805b0300806a03008060030080610300806403008005020080cd020080800300808f04008014040080a4000080a000008024020080b5000080a7000080a1000080a9000080a2000080a500008014020080c6000080a8000080a6000080990400802f0400801d02008019020080ef01008038000080890500800d03008007030080c8000080ca000080cb000080cc00008053070080cd0100805a030080c0020080c00000800f010080fb0000801702008056030080fd00008013000080190000809603008090030080d3030080c8030080cc030080d403008012020080d70300808006008097030080930300802502008014000080ce0400802b0200804200008029020080a30600804b000080df050080cf0100803d0000805e03008057000080ee01008002000080050000800400008003000080f101008046040080470400809d0200809f020080a5020080040200809c0200802100008023000080a0020080c701008016040080310400800000000086530000745300000000000000000000ac50bd0300000000000000000000000000000000000000000000000000000000ffffffff9b4fffff64b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
#testdecompress("rom3uncompress",  $compressed5_lzx, $uncompressed5_lzx, 1);
#testdecompress("rom4uncompress",  $compressed5_lzx, $uncompressed5_lzx, 1);
#testdecompress("romuncompress_v3",  $compressed5_lzx, $uncompressed5_lzx);
#testdecompress("romuncompress_v4",  $compressed5_lzx, $uncompressed5_lzx);
#testdecompress("romuncompress_v5",  $compressed5_lzx, $uncompressed5_lzx);
#testdecompress("rom3uncompressRom", $compressed5_lzx, $uncompressed5_lzx);
#testdecompress("DoCeCompressDecode",$compressed5_lzx, $uncompressed5_lzx);
testdecompress("LZX_DecompressDecode",$compressed5_lzx, $uncompressed5_lzx);
testdecompress("LZX_DecompressDecode",$compressed5_lzx2, $uncompressed5_lzx2);
print "\n ... testing function pairs ... \n";


#NOLIBS - testpair(qw(romuncompress_v3 romcompress_v3), $uncompressed4, 1);
testpair(qw(rom3uncompress rom3compress), $uncompressed4, 1);
testpair(qw(rom4uncompress rom4compress), $uncompressed4, 1);
#NOLIBS - testpair(qw(DoCeCompressDecode DoCeCompressEncode), $uncompressed4, 0);
testpair(qw(LZX_DecompressDecode LZX_CompressEncode), $uncompressed5_lzx, 0);
testpair(qw(XPR_DecompressDecode XPR_CompressEncode), $uncompressed5_xpr, 0);
testpair(qw(XPH_DecompressDecode XPH_CompressEncode), $uncompressed_xph, 0);

# this function apparently works differently, it crashes.
#testpair(qw(DoXpressDecode DoXpressEncode));

# add 3 to total test count for each testdecompress call
sub testdecompress {
    my ($decompress, $compressed, $uncompressed, $testsize)= @_;

    print "testing decompress: $decompress\n";

    # test if decompressing 'compressed' results in 'uncompressed'
    my $test1= eval("XdaDevelopers::CompressUtils::$decompress(\$compressed, length(\$uncompressed))");
    print "not " if (!defined $test1);
    print "ok $t - decompress defined\n";
    $t++;

    if (!defined $test1) {
        print "not ok $t - decompress value undef\n"; 
        $t++;
    }
    else {
        print "not " if ($test1 ne $uncompressed);
        print "ok $t - decompress value\n";
        $t++;
    }

    return if (!$testsize);

    # test if too short len results in undef
    my $test2= eval("XdaDevelopers::CompressUtils::$decompress(\$compressed, length(\$uncompressed)-1)");
    print "not " if (defined $test2);
    print "ok $t - decompress size\n";
    $t++;
}
# add 4 to total test count for each testpair call
sub testpair {
    my ($decompress, $compress, $orig, $testtwice)= @_;

    print "testing pair: $decompress  $compress\n";

    # test if compress works
    my $test1= eval("XdaDevelopers::CompressUtils::$compress(\$orig)");
    print "not " if (!defined $test1);
    print "ok $t - pair compress\n";
    $t++;

    # test if twice compression results in undef ( data will not shrink more )
    if (!defined $test1) {
        print "not ok $t\n";
        $t++;
        print "not ok $t\n";
        $t++;
        print "not ok $t\n";
        $t++;
        return;
    }
    if ($testtwice) {
        my $test2= eval("XdaDevelopers::CompressUtils::$compress(\$test1)");
        print "not " if (defined $test2);
        print "ok $t - pair compress twice\n";
        $t++;
    }

    #printf("%s -> %s\n", $compress, unpack("H*", $test1));
    # test if v3 decompress works
    my $test3= eval("XdaDevelopers::CompressUtils::$decompress(\$test1, length(\$orig))");
    print "not " if (!defined $test3);
    print "ok $t - pair decompress defined\n";
    $t++;

    if (!defined $test3) {
        print "not ok $t\n";
        $t++;
    }
    else {
        print "not " if ($test3 ne $orig);
        print "ok $t - pair decompress value\n";
        $t++;
    }
}


