From 370b4cbd5559c779b06aeedc64f4494aea383d19 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Mon, 8 Jun 2026 05:31:52 +0000 Subject: internal/compress: Add --- internal/compress/flate/dict_decoder_test.go | 284 +++++++++++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 internal/compress/flate/dict_decoder_test.go (limited to 'internal/compress/flate/dict_decoder_test.go') diff --git a/internal/compress/flate/dict_decoder_test.go b/internal/compress/flate/dict_decoder_test.go new file mode 100644 index 00000000..8bc48a3e --- /dev/null +++ b/internal/compress/flate/dict_decoder_test.go @@ -0,0 +1,284 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package flate + +import ( + "bytes" + "strings" + "testing" +) + +func TestDictDecoder(t *testing.T) { + const ( + abc = "ABC\n" + fox = "The quick brown fox jumped over the lazy dog!\n" + poem = "The Road Not Taken\nRobert Frost\n" + + "\n" + + "Two roads diverged in a yellow wood,\n" + + "And sorry I could not travel both\n" + + "And be one traveler, long I stood\n" + + "And looked down one as far as I could\n" + + "To where it bent in the undergrowth;\n" + + "\n" + + "Then took the other, as just as fair,\n" + + "And having perhaps the better claim,\n" + + "Because it was grassy and wanted wear;\n" + + "Though as for that the passing there\n" + + "Had worn them really about the same,\n" + + "\n" + + "And both that morning equally lay\n" + + "In leaves no step had trodden black.\n" + + "Oh, I kept the first for another day!\n" + + "Yet knowing how way leads on to way,\n" + + "I doubted if I should ever come back.\n" + + "\n" + + "I shall be telling this with a sigh\n" + + "Somewhere ages and ages hence:\n" + + "Two roads diverged in a wood, and I-\n" + + "I took the one less traveled by,\n" + + "And that has made all the difference.\n" + ) + + poemRefs := []struct { + dist int // Backward distance (0 if this is an insertion) + length int // Length of copy or insertion + }{ + {0, 38}, + {33, 3}, + {0, 48}, + {79, 3}, + {0, 11}, + {34, 5}, + {0, 6}, + {23, 7}, + {0, 8}, + {50, 3}, + {0, 2}, + {69, 3}, + {34, 5}, + {0, 4}, + {97, 3}, + {0, 4}, + {43, 5}, + {0, 6}, + {7, 4}, + {88, 7}, + {0, 12}, + {80, 3}, + {0, 2}, + {141, 4}, + {0, 1}, + {196, 3}, + {0, 3}, + {157, 3}, + {0, 6}, + {181, 3}, + {0, 2}, + {23, 3}, + {77, 3}, + {28, 5}, + {128, 3}, + {110, 4}, + {70, 3}, + {0, 4}, + {85, 6}, + {0, 2}, + {182, 6}, + {0, 4}, + {133, 3}, + {0, 7}, + {47, 5}, + {0, 20}, + {112, 5}, + {0, 1}, + {58, 3}, + {0, 8}, + {59, 3}, + {0, 4}, + {173, 3}, + {0, 5}, + {114, 3}, + {0, 4}, + {92, 5}, + {0, 2}, + {71, 3}, + {0, 2}, + {76, 5}, + {0, 1}, + {46, 3}, + {96, 4}, + {130, 4}, + {0, 3}, + {360, 3}, + {0, 3}, + {178, 5}, + {0, 7}, + {75, 3}, + {0, 3}, + {45, 6}, + {0, 6}, + {299, 6}, + {180, 3}, + {70, 6}, + {0, 1}, + {48, 3}, + {66, 4}, + {0, 3}, + {47, 5}, + {0, 9}, + {325, 3}, + {0, 1}, + {359, 3}, + {318, 3}, + {0, 2}, + {199, 3}, + {0, 1}, + {344, 3}, + {0, 3}, + {248, 3}, + {0, 10}, + {310, 3}, + {0, 3}, + {93, 6}, + {0, 3}, + {252, 3}, + {157, 4}, + {0, 2}, + {273, 5}, + {0, 14}, + {99, 4}, + {0, 1}, + {464, 4}, + {0, 2}, + {92, 4}, + {495, 3}, + {0, 1}, + {322, 4}, + {16, 4}, + {0, 3}, + {402, 3}, + {0, 2}, + {237, 4}, + {0, 2}, + {432, 4}, + {0, 1}, + {483, 5}, + {0, 2}, + {294, 4}, + {0, 2}, + {306, 3}, + {113, 5}, + {0, 1}, + {26, 4}, + {164, 3}, + {488, 4}, + {0, 1}, + {542, 3}, + {248, 6}, + {0, 5}, + {205, 3}, + {0, 8}, + {48, 3}, + {449, 6}, + {0, 2}, + {192, 3}, + {328, 4}, + {9, 5}, + {433, 3}, + {0, 3}, + {622, 25}, + {615, 5}, + {46, 5}, + {0, 2}, + {104, 3}, + {475, 10}, + {549, 3}, + {0, 4}, + {597, 8}, + {314, 3}, + {0, 1}, + {473, 6}, + {317, 5}, + {0, 1}, + {400, 3}, + {0, 3}, + {109, 3}, + {151, 3}, + {48, 4}, + {0, 4}, + {125, 3}, + {108, 3}, + {0, 2}, + } + + var got, want bytes.Buffer + var dd dictDecoder + dd.init(1<<11, nil) + + writeCopy := func(dist, length int) { + for length > 0 { + cnt := dd.tryWriteCopy(dist, length) + if cnt == 0 { + cnt = dd.writeCopy(dist, length) + } + + length -= cnt + if dd.availWrite() == 0 { + got.Write(dd.readFlush()) + } + } + } + writeString := func(str string) { + for len(str) > 0 { + cnt := copy(dd.writeSlice(), str) + str = str[cnt:] + dd.writeMark(cnt) + if dd.availWrite() == 0 { + got.Write(dd.readFlush()) + } + } + } + + writeString(".") + want.WriteByte('.') + + str := poem + for _, ref := range poemRefs { + if ref.dist == 0 { + writeString(str[:ref.length]) + } else { + writeCopy(ref.dist, ref.length) + } + str = str[ref.length:] + } + want.WriteString(poem) + + writeCopy(dd.histSize(), 33) + want.Write(want.Bytes()[:33]) + + writeString(abc) + writeCopy(len(abc), 59*len(abc)) + want.WriteString(strings.Repeat(abc, 60)) + + writeString(fox) + writeCopy(len(fox), 9*len(fox)) + want.WriteString(strings.Repeat(fox, 10)) + + writeString(".") + writeCopy(1, 9) + want.WriteString(strings.Repeat(".", 10)) + + writeString(strings.ToUpper(poem)) + writeCopy(len(poem), 7*len(poem)) + want.WriteString(strings.Repeat(strings.ToUpper(poem), 8)) + + writeCopy(dd.histSize(), 10) + want.Write(want.Bytes()[want.Len()-dd.histSize():][:10]) + + got.Write(dd.readFlush()) + if got.String() != want.String() { + t.Errorf("final string mismatch:\ngot %q\nwant %q", got.String(), want.String()) + } +} -- cgit v1.3.1-10-gc9f91