114 lines
1.6 KiB
Go
114 lines
1.6 KiB
Go
package bencode
|
|
|
|
import "testing"
|
|
|
|
func TestDecode(t *testing.T) {
|
|
tests := []struct {
|
|
in string
|
|
want any
|
|
err bool
|
|
}{
|
|
{
|
|
in: "4:spam",
|
|
want: "spam",
|
|
},
|
|
{
|
|
in: "0:",
|
|
want: "",
|
|
},
|
|
{
|
|
in: "i42e",
|
|
want: int64(42),
|
|
},
|
|
{
|
|
in: "i-42e",
|
|
want: int64(-42),
|
|
},
|
|
{
|
|
in: "i0e",
|
|
want: int64(0),
|
|
},
|
|
{
|
|
in: "",
|
|
err: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.in, func(t *testing.T) {
|
|
got, _, err := Decode([]byte(tt.in))
|
|
if tt.err {
|
|
if err == nil {
|
|
t.Error("expected error")
|
|
}
|
|
return
|
|
}
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if got != tt.want {
|
|
t.Errorf("got %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestEncode(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
in any
|
|
want string
|
|
}{
|
|
{
|
|
name: "string",
|
|
in: "spam",
|
|
want: "4:spam",
|
|
},
|
|
{
|
|
name: "empty string",
|
|
in: "",
|
|
want: "0:",
|
|
},
|
|
{
|
|
name: "int",
|
|
in: int64(42),
|
|
want: "i42e",
|
|
},
|
|
{
|
|
name: "negative int",
|
|
in: int64(-42),
|
|
want: "i-42e",
|
|
},
|
|
{
|
|
name: "list",
|
|
in: []any{"a", "b"},
|
|
want: "l1:a1:be",
|
|
},
|
|
{
|
|
name: "empty list",
|
|
in: []any{},
|
|
want: "le",
|
|
},
|
|
{
|
|
name: "dict",
|
|
in: map[string]any{"b": int64(2), "a": int64(1)},
|
|
want: "d1:ai1e1:bi2ee",
|
|
},
|
|
{
|
|
name: "empty dict",
|
|
in: map[string]any{},
|
|
want: "de",
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := Encode(tt.in)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
if string(got) != tt.want {
|
|
t.Errorf("got %s, want %s", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|