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