diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-07-23 22:18:06 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-07-23 22:18:06 +0900 |
| commit | 390f3b2daee0f81d97c4451015d08758418eba34 (patch) | |
| tree | 11173206c253e760096391f9aea19cf4318256e3 /internal/zstd/window_test.go | |
| parent | 5d3e47d8e71b6c269f26c1dfe5b2de2e57f670d9 (diff) | |
internal/pkg: decompress zstd streams
This uses internal/zstd until compress/zstd becomes available.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/zstd/window_test.go')
| -rw-r--r-- | internal/zstd/window_test.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/internal/zstd/window_test.go b/internal/zstd/window_test.go new file mode 100644 index 00000000..afa2eefc --- /dev/null +++ b/internal/zstd/window_test.go @@ -0,0 +1,72 @@ +// Copyright 2023 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 zstd + +import ( + "bytes" + "fmt" + "testing" +) + +func makeSequence(start, n int) (seq []byte) { + for i := 0; i < n; i++ { + seq = append(seq, byte(start+i)) + } + return +} + +func TestWindow(t *testing.T) { + for size := 0; size <= 3; size++ { + for i := 0; i <= 2*size; i++ { + a := makeSequence('a', i) + for j := 0; j <= 2*size; j++ { + b := makeSequence('a'+i, j) + for k := 0; k <= 2*size; k++ { + c := makeSequence('a'+i+j, k) + + t.Run(fmt.Sprintf("%d-%d-%d-%d", size, i, j, k), func(t *testing.T) { + testWindow(t, size, a, b, c) + }) + } + } + } + } +} + +// testWindow tests window by saving three sequences of bytes to it. +// Third sequence tests read offset that can become non-zero only after second save. +func testWindow(t *testing.T, size int, a, b, c []byte) { + var w window + w.reset(size) + + w.save(a) + w.save(b) + w.save(c) + + var tail []byte + tail = append(tail, a...) + tail = append(tail, b...) + tail = append(tail, c...) + + if len(tail) > size { + tail = tail[len(tail)-size:] + } + + if w.len() != uint32(len(tail)) { + t.Errorf("wrong data length: got: %d, want: %d", w.len(), len(tail)) + } + + var from, to uint32 + for from = 0; from <= uint32(len(tail)); from++ { + for to = from; to <= uint32(len(tail)); to++ { + got := w.appendTo(nil, from, to) + want := tail[from:to] + + if !bytes.Equal(got, want) { + t.Errorf("wrong data at [%d:%d]: got %q, want %q", from, to, got, want) + } + } + } +} |
