1package types 2 3import ( 4 "reflect" 5 "testing" 6) 7 8func elem(p interface{}) interface{} { 9 return reflect.ValueOf(p).Elem().Interface() 10} 11 12func TestParseInt(t *testing.T) { 13 for _, tt := range []struct { 14 val string 15 mode IntMode 16 exp interface{} 17 ok bool 18 }{ 19 {"0", Dec, int(0), true}, 20 {"10", Dec, int(10), true}, 21 {"-10", Dec, int(-10), true}, 22 {"x", Dec, int(0), false}, 23 {"0xa", Hex, int(0xa), true}, 24 {"a", Hex, int(0xa), true}, 25 {"10", Hex, int(0x10), true}, 26 {"-0xa", Hex, int(-0xa), true}, 27 {"0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x 28 {"-0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x 29 {"-a", Hex, int(-0xa), true}, 30 {"-10", Hex, int(-0x10), true}, 31 {"x", Hex, int(0), false}, 32 {"10", Oct, int(010), true}, 33 {"010", Oct, int(010), true}, 34 {"-10", Oct, int(-010), true}, 35 {"-010", Oct, int(-010), true}, 36 {"10", Dec | Hex, int(10), true}, 37 {"010", Dec | Hex, int(10), true}, 38 {"0x10", Dec | Hex, int(0x10), true}, 39 {"10", Dec | Oct, int(10), true}, 40 {"010", Dec | Oct, int(010), true}, 41 {"0x10", Dec | Oct, int(0), false}, 42 {"10", Hex | Oct, int(0), false}, // need prefix to distinguish Hex/Oct 43 {"010", Hex | Oct, int(010), true}, 44 {"0x10", Hex | Oct, int(0x10), true}, 45 {"10", Dec | Hex | Oct, int(10), true}, 46 {"010", Dec | Hex | Oct, int(010), true}, 47 {"0x10", Dec | Hex | Oct, int(0x10), true}, 48 } { 49 typ := reflect.TypeOf(tt.exp) 50 res := reflect.New(typ).Interface() 51 err := ParseInt(res, tt.val, tt.mode) 52 switch { 53 case tt.ok && err != nil: 54 t.Errorf("ParseInt(%v, %#v, %v): fail; got error %v, want ok", 55 typ, tt.val, tt.mode, err) 56 case !tt.ok && err == nil: 57 t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want error", 58 typ, tt.val, tt.mode, elem(res)) 59 case tt.ok && !reflect.DeepEqual(elem(res), tt.exp): 60 t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want %v", 61 typ, tt.val, tt.mode, elem(res), tt.exp) 62 default: 63 t.Logf("ParseInt(%v, %#v, %s): pass; got %v, error %v", 64 typ, tt.val, tt.mode, elem(res), err) 65 } 66 } 67} 68