mirror of https://github.com/tgragnato/magnetico
109 lines
2.0 KiB
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)
|
|
}
|
|
})
|
|
}
|
|
}
|