about summary refs log tree commit diff stats
path: root/internal/buffer/buffer_test.go
diff options
context:
space:
mode:
authorAlan Pearce2025-01-29 22:00:45 +0100
committerAlan Pearce2025-01-29 23:27:45 +0100
commit3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb (patch)
tree14c424b8ef8b9238e69393cd7da1d0af6833526e /internal/buffer/buffer_test.go
parenta93b5ad88ea3cf742cf03fdeeb95f63865f08374 (diff)
downloadwebsite-3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb.tar.lz
website-3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb.tar.zst
website-3162ceaa0f7997742f8c2fce1c9660e8e86ad5bb.zip
use buffers as interface to storage
Diffstat (limited to 'internal/buffer/buffer_test.go')
-rw-r--r--internal/buffer/buffer_test.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/internal/buffer/buffer_test.go b/internal/buffer/buffer_test.go
new file mode 100644
index 0000000..9cddeca
--- /dev/null
+++ b/internal/buffer/buffer_test.go
@@ -0,0 +1,88 @@
+package buffer
+
+import (
+	"io"
+	"testing"
+)
+
+func TestWrite(t *testing.T) {
+	b := Buffer{}
+	data := []byte("test")
+
+	n, err := b.Write(data)
+	if n != len(data) || err != nil {
+		t.Errorf("Write failed: expected %d bytes, got %d, error: %v", len(data), n, err)
+	}
+
+	if b.Len() != len(data) {
+		t.Errorf("Len is incorrect after write: expected %d, got %d", len(data), b.Len())
+	}
+
+	if string(b.Bytes()) != "test" {
+		t.Error("Bytes returned after write do not match written data")
+	}
+}
+
+func TestRead(t *testing.T) {
+	b := NewBuffer([]byte("testdata"))
+	p := make([]byte, 3)
+	n, err := b.Read(p)
+
+	if n != 3 || string(p[:n]) != "tes" {
+		t.Errorf("Read returned incorrect data: expected 'tes', got '%s'", p[:n])
+	}
+
+	b.Reset()
+	b.Write([]byte("abc"))
+	p = make([]byte, 2)
+	n, err = b.Read(p)
+
+	if n != 2 || string(p) != "ab" {
+		t.Errorf("Read after reset failed: expected 'ab', got '%s'", p)
+	}
+
+	b.pos = b.len
+	n, err = b.Read(p)
+	if n != 0 || err != io.EOF {
+		t.Errorf("Reading beyond buffer did not return EOF: n=%d, err=%v", n, err)
+	}
+}
+
+func TestReset(t *testing.T) {
+	b := NewBuffer([]byte("test"))
+	b.Write([]byte("data"))
+
+	if b.Len() != 8 || b.pos != 0 {
+		t.Errorf("Initial buffer state incorrect: len=%d, pos=%d", b.Len(), b.pos)
+	}
+
+	b.Reset()
+	if b.Len() != 0 || b.pos != 0 {
+		t.Errorf("Reset did not clear buffer correctly: len=%d, pos=%d", b.Len(), b.pos)
+	}
+}
+
+func TestSeek(t *testing.T) {
+	b := NewBuffer([]byte("test"))
+	tests := []struct {
+		offset int64
+		whence int
+		expect int64
+		err    error
+	}{
+		{2, io.SeekStart, 2, nil},
+		{-1, io.SeekCurrent, 1, nil},
+		{-2, io.SeekEnd, int64(len("test") - 2), nil},
+		{5, io.SeekStart, int64(len("test")), nil},
+		{-10, io.SeekEnd, 0, nil},
+		{0, 999, 0, io.EOF}, // Invalid whence test
+	}
+
+	for _, tt := range tests {
+		pos, err := b.Seek(tt.offset, tt.whence)
+		if pos != tt.expect || (err != tt.err && !((err == nil) && (tt.err == nil))) {
+			t.Errorf("Seek(%d, %d): expected %d with error %v, got %d and %v",
+				tt.offset, tt.whence, tt.expect, tt.err, pos, err)
+		}
+	}
+}