78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
package bencode
|
|
|
|
import "testing"
|
|
import "reflect"
|
|
|
|
type random_decode_test struct {
|
|
data string
|
|
expected interface{}
|
|
}
|
|
|
|
var random_decode_tests = []random_decode_test{
|
|
{"i57e", int64(57)},
|
|
{"i-9223372036854775808e", int64(-9223372036854775808)},
|
|
{"5:hello", "hello"},
|
|
{"29:unicode test проверка", "unicode test проверка"},
|
|
{"d1:ai5e1:b5:helloe", map[string]interface{}{"a": int64(5), "b": "hello"}},
|
|
{"li5ei10ei15ei20e7:bencodee",
|
|
[]interface{}{int64(5), int64(10), int64(15), int64(20), "bencode"}},
|
|
{"ldedee", []interface{}{map[string]interface{}{}, map[string]interface{}{}}},
|
|
{"le", []interface{}{}},
|
|
}
|
|
|
|
func TestRandomDecode(t *testing.T) {
|
|
for _, test := range random_decode_tests {
|
|
var value interface{}
|
|
err := Unmarshal([]byte(test.data), &value)
|
|
if err != nil {
|
|
t.Error(err)
|
|
continue
|
|
}
|
|
if !reflect.DeepEqual(test.expected, value) {
|
|
t.Errorf("got: %v (%T), expected: %v (%T)\n",
|
|
value, value, test.expected, test.expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func check_error(t *testing.T, err error) {
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func assert_equal(t *testing.T, x, y interface{}) {
|
|
if !reflect.DeepEqual(x, y) {
|
|
t.Errorf("got: %v (%T), expected: %v (%T)\n", x, x, y, y)
|
|
}
|
|
}
|
|
|
|
type unmarshaler_int struct {
|
|
x int
|
|
}
|
|
|
|
func (this *unmarshaler_int) UnmarshalBencode(data []byte) error {
|
|
return Unmarshal(data, &this.x)
|
|
}
|
|
|
|
type unmarshaler_string struct {
|
|
x string
|
|
}
|
|
|
|
func (this *unmarshaler_string) UnmarshalBencode(data []byte) error {
|
|
this.x = string(data)
|
|
return nil
|
|
}
|
|
|
|
func TestUnmarshalerBencode(t *testing.T) {
|
|
var i unmarshaler_int
|
|
var ss []unmarshaler_string
|
|
check_error(t, Unmarshal([]byte("i71e"), &i))
|
|
assert_equal(t, i.x, 71)
|
|
check_error(t, Unmarshal([]byte("l5:hello5:fruit3:waye"), &ss))
|
|
assert_equal(t, ss[0].x, "5:hello")
|
|
assert_equal(t, ss[1].x, "5:fruit")
|
|
assert_equal(t, ss[2].x, "3:way")
|
|
|
|
}
|