| // 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) | |
| } | |
| } | |
| } | |
| } |