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") }