@@ -255,6 +255,53 @@ int testDeclaredPayloadConsumption()
255255 return 0 ;
256256}
257257
258+ int testHuffmanFragmentedRoundTrip ()
259+ {
260+ cout << endl
261+ << " === Huffman fragmented round-trip test ===" << endl;
262+ const uint size = 1 << 20 ;
263+ vector<kanzi::byte> values (size);
264+ vector<kanzi::byte> decoded (size, kanzi::byte (0 ));
265+ uint32 state = 0x12345678 ;
266+
267+ for (uint i = 0 ; i < size; i++) {
268+ state = (state * 1103515245U ) + 12345U ;
269+ values[i] = kanzi::byte (state >> 24 );
270+ }
271+
272+ stringbuf buffer;
273+ iostream ios (&buffer);
274+ DefaultOutputBitStream obs (ios, 1 << 15 );
275+ HuffmanEncoder encoder (obs);
276+
277+ if (encoder.encode (&values[0 ], 0 , size) != int (size)) {
278+ cout << " Encoding error in Huffman fragmented round-trip test" << endl;
279+ return 1 ;
280+ }
281+
282+ encoder.dispose ();
283+ obs.close ();
284+ ios.rdbuf ()->pubseekpos (0 );
285+ DefaultInputBitStream ibs (ios, 1 << 15 );
286+ HuffmanDecoder decoder (ibs);
287+
288+ if (decoder.decode (&decoded[0 ], 0 , size) != int (size)) {
289+ cout << " Decoding error in Huffman fragmented round-trip test" << endl;
290+ return 1 ;
291+ }
292+
293+ decoder.dispose ();
294+ ibs.close ();
295+
296+ if (memcmp (&values[0 ], &decoded[0 ], size) != 0 ) {
297+ cout << " Mismatch in Huffman fragmented round-trip test" << endl;
298+ return 1 ;
299+ }
300+
301+ cout << " Huffman fragmented round-trip test passed" << endl;
302+ return 0 ;
303+ }
304+
258305class ConstantPredictor FINAL : public Predictor
259306{
260307public:
@@ -614,6 +661,7 @@ int TestEntropyCodec_main(int argc, const char* argv[])
614661 try {
615662 res |= testBinaryEntropyBufferGrowth ();
616663 res |= testDeclaredPayloadConsumption ();
664+ res |= testHuffmanFragmentedRoundTrip ();
617665 vector<string> codecs;
618666 bool doPerf = true ;
619667
0 commit comments