| package types |
| |
| import ( |
| "reflect" |
| "testing" |
| ) |
| |
| func elem(p interface{}) interface{} { |
| return reflect.ValueOf(p).Elem().Interface() |
| } |
| |
| func TestParseInt(t *testing.T) { |
| for _, tt := range []struct { |
| val string |
| mode IntMode |
| exp interface{} |
| ok bool |
| }{ |
| {"0", Dec, int(0), true}, |
| {"10", Dec, int(10), true}, |
| {"-10", Dec, int(-10), true}, |
| {"x", Dec, int(0), false}, |
| {"0xa", Hex, int(0xa), true}, |
| {"a", Hex, int(0xa), true}, |
| {"10", Hex, int(0x10), true}, |
| {"-0xa", Hex, int(-0xa), true}, |
| {"0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x |
| {"-0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x |
| {"-a", Hex, int(-0xa), true}, |
| {"-10", Hex, int(-0x10), true}, |
| {"x", Hex, int(0), false}, |
| {"10", Oct, int(010), true}, |
| {"010", Oct, int(010), true}, |
| {"-10", Oct, int(-010), true}, |
| {"-010", Oct, int(-010), true}, |
| {"10", Dec | Hex, int(10), true}, |
| {"010", Dec | Hex, int(10), true}, |
| {"0x10", Dec | Hex, int(0x10), true}, |
| {"10", Dec | Oct, int(10), true}, |
| {"010", Dec | Oct, int(010), true}, |
| {"0x10", Dec | Oct, int(0), false}, |
| {"10", Hex | Oct, int(0), false}, // need prefix to distinguish Hex/Oct |
| {"010", Hex | Oct, int(010), true}, |
| {"0x10", Hex | Oct, int(0x10), true}, |
| {"10", Dec | Hex | Oct, int(10), true}, |
| {"010", Dec | Hex | Oct, int(010), true}, |
| {"0x10", Dec | Hex | Oct, int(0x10), true}, |
| } { |
| typ := reflect.TypeOf(tt.exp) |
| res := reflect.New(typ).Interface() |
| err := ParseInt(res, tt.val, tt.mode) |
| switch { |
| case tt.ok && err != nil: |
| t.Errorf("ParseInt(%v, %#v, %v): fail; got error %v, want ok", |
| typ, tt.val, tt.mode, err) |
| case !tt.ok && err == nil: |
| t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want error", |
| typ, tt.val, tt.mode, elem(res)) |
| case tt.ok && !reflect.DeepEqual(elem(res), tt.exp): |
| t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want %v", |
| typ, tt.val, tt.mode, elem(res), tt.exp) |
| default: |
| t.Logf("ParseInt(%v, %#v, %s): pass; got %v, error %v", |
| typ, tt.val, tt.mode, elem(res), err) |
| } |
| } |
| } |