forked from synthesio/zconfig
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser_test.go
99 lines (84 loc) · 2.52 KB
/
parser_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package zconfig
import (
"reflect"
"regexp"
"testing"
"time"
)
func TestParseString(t *testing.T) {
for _, c := range []struct {
raw interface{}
res interface{}
err bool
}{
// Not Parseable
{raw: 1, res: "", err: true},
// Mismatched types
{raw: "foo", res: float64(0), err: true},
// Strings
{raw: "foo", res: "foo", err: false},
// String slices
{raw: "foo", res: []string{"foo"}, err: false},
{raw: "foo ", res: []string{"foo"}, err: false},
{raw: "foo , bar ", res: []string{"foo", "bar"}, err: false},
{raw: " baz,foo , bar ", res: []string{"baz", "foo", "bar"}, err: false},
// Int slices
{raw: "10", res: []int{10}, err: false},
{raw: "10 ", res: []int{10}, err: false},
{raw: "10 , 20 ", res: []int{10, 20}, err: false},
{raw: " 10,20 , 30 ", res: []int{10, 20, 30}, err: false},
// Int64 slices
{raw: "10", res: []int64{10}, err: false},
{raw: "10 ", res: []int64{10}, err: false},
{raw: "10 , 20 ", res: []int64{10, 20}, err: false},
{raw: " 10,20 , 30 ", res: []int64{10, 20, 30}, err: false},
// Numeric types
{raw: "1", res: int(1), err: false},
{raw: "1", res: int8(1), err: false},
{raw: "1", res: int16(1), err: false},
{raw: "1", res: int32(1), err: false},
{raw: "1", res: int64(1), err: false},
{raw: "1", res: uint(1), err: false},
{raw: "1", res: uint8(1), err: false},
{raw: "1", res: uint16(1), err: false},
{raw: "1", res: uint32(1), err: false},
{raw: "1", res: uint64(1), err: false},
{raw: "1", res: float32(1), err: false},
{raw: "1", res: float64(1), err: false},
// Boolean types
{raw: "true", res: true, err: false},
{raw: "T", res: true, err: false},
{raw: "false", res: false, err: false},
{raw: "F", res: false, err: false},
// Regexp
{raw: "/a/", res: regexp.MustCompile("/a/"), err: false},
// Unmarshalers
{raw: "2019-01-11T15:01:31Z", res: time.Date(2019, time.January, 11, 15, 01, 31, 000, time.UTC), err: false},
} {
var typ = reflect.TypeOf(c.res)
var ptr = false
if typ.Kind() == reflect.Ptr {
ptr = true
typ = typ.Elem()
}
var res = reflect.New(typ).Interface()
err := ParseString(c.raw, res)
if (err != nil) != c.err {
if c.err {
t.Errorf("ParseString(%+v): should fail", c.raw)
} else {
t.Errorf("ParseString(%+v): unexpected error %v", c.raw, err)
}
continue
}
if c.err {
continue
}
if !ptr {
res = reflect.ValueOf(res).Elem().Interface()
}
if !reflect.DeepEqual(res, c.res) {
t.Errorf("ParseString(%+v): wanted %+v, got %+v", c.raw, c.res, res)
}
}
}