magnetico/bencode/scanner_test.go

109 lines
2.0 KiB
Go

package bencode
import (
"bytes"
"io"
"testing"
)
type mockReader struct {
data []byte
}
func (m *mockReader) Read(b []byte) (int, error) {
if len(m.data) == 0 {
return 0, io.EOF
}
n := copy(b, m.data)
m.data = m.data[n:]
return n, nil
}
func TestScanner_Read(t *testing.T) {
t.Parallel()
tests := []struct {
name string
reader io.Reader
expected []byte
err error
}{
{
name: "Empty reader",
reader: &mockReader{},
expected: []byte{},
err: io.EOF,
},
{
name: "Read single byte",
reader: &mockReader{data: []byte{0x41}},
expected: []byte{0x41},
err: nil,
},
{
name: "Read multiple bytes",
reader: &mockReader{data: []byte{0x41, 0x42, 0x43}},
expected: []byte{0x41, 0x42, 0x43},
err: nil,
},
{
name: "Read partial bytes",
reader: &mockReader{data: []byte{0x41, 0x42, 0x43}},
expected: []byte{0x41},
err: nil,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
s := &scanner{r: test.reader}
buf := make([]byte, len(test.expected))
n, err := s.Read(buf)
if !bytes.Equal(buf, test.expected) {
t.Errorf("Expected %v, but got %v", test.expected, buf)
}
if err != test.err {
t.Errorf("Expected error %v, but got %v", test.err, err)
}
if n != len(test.expected) {
t.Errorf("Expected %d bytes to be read, but got %d", len(test.expected), n)
}
})
}
}
func TestScanner_UnreadByte(t *testing.T) {
t.Parallel()
tests := []struct {
name string
reader io.Reader
err error
}{
{
name: "Unread byte",
reader: &mockReader{data: []byte{0x41}},
err: nil,
},
{
name: "Unread multiple bytes",
reader: &mockReader{data: []byte{0x41, 0x42, 0x43}},
err: nil,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
s := &scanner{r: test.reader}
err := s.UnreadByte()
if err != test.err {
t.Errorf("Expected error %v, but got %v", test.err, err)
}
})
}
}