-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathptr_test.go
141 lines (138 loc) · 4.1 KB
/
ptr_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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package config
import (
"fmt"
"reflect"
"testing"
)
func TestPtrSetter(t *testing.T) {
creator := newPtrSetterCreator(intSetterCreator{t: int32Type})
ptrStr := func(val *int32) string {
if val == nil {
return "<nil>"
}
return fmt.Sprintf("&%d", *val)
}
t.Run("String", func(t *testing.T) {
// We always start out with a nil pointer. If the pointer was non-nil,
// we wouldn't need to use the ptrSetter in the first place...
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
if text := s.String(); text != "" {
t.Errorf("Returned string %s for nil value", text)
}
s.SetInt(99)
if text := s.String(); text != "99" {
t.Errorf("Returned string %s for value %s", text, ptrStr(val))
}
if text := (&ptrSetter{}).String(); text != "" {
t.Errorf("Returning string %s for zero setter", text)
}
})
t.Run("Set", func(t *testing.T) {
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
if err := s.Set("notanint"); err == nil {
t.Error("Setting notanint did not fail with error")
}
if val != nil {
t.Errorf("Setting notanint unexpectedly changed value to %s", ptrStr(val))
}
if err := s.Set("99"); err != nil {
t.Errorf("Setting 99 failed with error %s", err)
}
if val == nil && *val != 99 {
t.Errorf("Setting 99 resulted in value %s", ptrStr(val))
}
})
t.Run("SetInt", func(t *testing.T) {
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
bigInt := int64(1<<63 - 1)
if err := s.SetInt(bigInt); err == nil {
t.Errorf("Setting %d did not fail with error", bigInt)
}
if val != nil {
t.Errorf("Setting %d unexpectedly changed value to %s", bigInt, ptrStr(val))
}
if err := s.SetInt(99); err != nil {
t.Errorf("Setting 99 failed with error %s", err)
}
if val == nil || *val != 99 {
t.Errorf("Setting 99 resulted in value %s", ptrStr(val))
}
})
t.Run("SetUint", func(t *testing.T) {
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
bigUint := uint64(1<<64 - 1)
if err := s.SetUint(bigUint); err == nil {
t.Errorf("Setting %d did not fail with error", bigUint)
}
if val != nil {
t.Errorf("Setting %d unexpectedly changed value to %s", bigUint, ptrStr(val))
}
if err := s.SetUint(99); err != nil {
t.Errorf("Setting 99 failed with error %s", err)
}
if val == nil || *val != 99 {
t.Errorf("Setting 99 resulted in value %s", ptrStr(val))
}
})
t.Run("SetFloat", func(t *testing.T) {
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
if err := s.SetFloat(99.99); err == nil {
t.Error("Setting 99.99 did not fail with error")
}
bigFloat := 1.797693134862315708145274237317043567981e+308
if err := s.SetFloat(bigFloat); err == nil {
t.Errorf("Setting %e did not fail with error", bigFloat)
}
if val != nil {
t.Errorf("Setting %e unexpectedly changed value to %s", bigFloat, ptrStr(val))
}
if err := s.SetFloat(99); err != nil {
t.Errorf("Setting 99 failed with error %s", err)
}
if val == nil || *val != 99 {
t.Errorf("Setting 99 resulted in value %s", ptrStr(val))
}
})
t.Run("SetBool", func(t *testing.T) {
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
if err := s.SetBool(true); err != nil {
t.Errorf("Setting true failed with error %s", err)
}
if val == nil || *val != 1 {
t.Errorf("Setting true resulted in value %s", ptrStr(val))
}
if err := s.SetBool(false); err != nil {
t.Errorf("Setting false failed with error %s", err)
}
if val == nil || *val != 0 {
t.Errorf("Setting false resulted in value %s", ptrStr(val))
}
})
t.Run("Get", func(t *testing.T) {
var val *int32
s := creator.Setter(reflect.ValueOf(&val).Elem(), "")
switch d := s.Get().(type) {
case *int32:
if d != nil {
t.Errorf("Getting nil value returned %s", ptrStr(d))
}
default:
t.Errorf("Getting nil value returned %v (type %T)", d, d)
}
s.SetInt(99)
switch d := s.Get().(type) {
case *int32:
if d == nil || *d != 99 {
t.Errorf("Getting value &99 returned %s", ptrStr(d))
}
default:
t.Errorf("Getting nil value returned %v (type %T)", d, d)
}
})
}