2017-05-06 13:43:24 +02:00
package bencode
import "testing"
func TestEncode ( t * testing . T ) {
type encodeTestCase struct {
in interface { }
out string
err bool
}
type eT struct {
A string
X string ` bencode:"D" `
Y string ` bencode:"B" `
Z string ` bencode:"C" `
}
type sortProblem struct {
A string
B string ` bencode:"," `
}
var encodeCases = [ ] encodeTestCase {
//integers
{ 10 , ` i10e ` , false } ,
{ - 10 , ` i-10e ` , false } ,
{ 0 , ` i0e ` , false } ,
{ int ( 10 ) , ` i10e ` , false } ,
{ int8 ( 10 ) , ` i10e ` , false } ,
{ int16 ( 10 ) , ` i10e ` , false } ,
{ int32 ( 10 ) , ` i10e ` , false } ,
{ int64 ( 10 ) , ` i10e ` , false } ,
{ uint ( 10 ) , ` i10e ` , false } ,
{ uint8 ( 10 ) , ` i10e ` , false } ,
{ uint16 ( 10 ) , ` i10e ` , false } ,
{ uint32 ( 10 ) , ` i10e ` , false } ,
{ uint64 ( 10 ) , ` i10e ` , false } ,
//strings
{ "foo" , ` 3:foo ` , false } ,
{ "barbb" , ` 5:barbb ` , false } ,
{ "" , ` 0: ` , false } ,
//lists
{ [ ] interface { } { "foo" , 20 } , ` l3:fooi20ee ` , false } ,
{ [ ] interface { } { 90 , 20 } , ` li90ei20ee ` , false } ,
{ [ ] interface { } { [ ] interface { } { "foo" , "bar" } , 20 } , ` ll3:foo3:barei20ee ` , false } ,
{ [ ] map [ string ] int {
{ "a" : 0 , "b" : 1 } ,
{ "c" : 2 , "d" : 3 } ,
} , ` ld1:ai0e1:bi1eed1:ci2e1:di3eee ` , false } ,
{ [ ] [ ] byte {
2017-05-24 09:15:07 +02:00
{ '0' , '2' , '4' , '6' , '8' } ,
{ 'a' , 'c' , 'e' } ,
2017-05-06 13:43:24 +02:00
} , ` l5:024683:acee ` , false } ,
//boolean
{ true , "i1e" , false } ,
{ false , "i0e" , false } ,
//dicts
{ map [ string ] interface { } {
"a" : "foo" ,
"c" : "bar" ,
"b" : "tes" ,
} , ` d1:a3:foo1:b3:tes1:c3:bare ` , false } ,
{ eT { "foo" , "bar" , "far" , "boo" } , ` d1:A3:foo1:B3:far1:C3:boo1:D3:bare ` , false } ,
{ map [ string ] [ ] int {
"a" : { 0 , 1 } ,
"b" : { 2 , 3 } ,
} , ` d1:ali0ei1ee1:bli2ei3eee ` , false } ,
{ struct { A , b int } { 1 , 2 } , "d1:Ai1ee" , false } ,
//raw
{ RawMessage ( ` i5e ` ) , ` i5e ` , false } ,
{ [ ] RawMessage {
RawMessage ( ` i5e ` ) ,
RawMessage ( ` 5:hello ` ) ,
RawMessage ( ` ldededee ` ) ,
} , ` li5e5:helloldededeee ` , false } ,
{ map [ string ] RawMessage {
"a" : RawMessage ( ` i5e ` ) ,
"b" : RawMessage ( ` 5:hello ` ) ,
"c" : RawMessage ( ` ldededee ` ) ,
} , ` d1:ai5e1:b5:hello1:cldededeee ` , false } ,
//problem sorting
{ sortProblem { A : "foo" , B : "bar" } , ` d1:A3:foo1:B3:bare ` , false } ,
}
for i , tt := range encodeCases {
data , err := EncodeString ( tt . in )
if ! tt . err && err != nil {
t . Errorf ( "#%d: Unexpected err: %v" , i , err )
continue
}
if tt . err && err == nil {
t . Errorf ( "#%d: Expected err is nil" , i )
continue
}
if tt . out != data {
t . Errorf ( "#%d: Val: %q != %q" , i , data , tt . out )
}
}
}
func TestEncodeOmit ( t * testing . T ) {
type encodeTestCase struct {
in interface { }
out string
err bool
}
type eT struct {
A string ` bencode:",omitempty" `
B int ` bencode:",omitempty" `
C * int ` bencode:",omitempty" `
}
var encodeCases = [ ] encodeTestCase {
{ eT { } , ` de ` , false } ,
{ eT { A : "a" } , ` d1:A1:ae ` , false } ,
{ eT { B : 5 } , ` d1:Bi5ee ` , false } ,
{ eT { C : new ( int ) } , ` d1:Ci0ee ` , false } ,
}
for i , tt := range encodeCases {
data , err := EncodeString ( tt . in )
if ! tt . err && err != nil {
t . Errorf ( "#%d: Unexpected err: %v" , i , err )
continue
}
if tt . err && err == nil {
t . Errorf ( "#%d: Expected err is nil" , i )
continue
}
if tt . out != data {
t . Errorf ( "#%d: Val: %q != %q" , i , data , tt . out )
}
}
}