forked from blockloop/scan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalues_test.go
143 lines (121 loc) · 4.34 KB
/
values_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
142
143
package scan
import (
"reflect"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestValuesScansOnlyCols(t *testing.T) {
type person struct {
Name string
Age int
}
p := &person{Name: "Brett"}
vals, err := Values([]string{"Name"}, p)
require.NoError(t, err)
assert.EqualValues(t, []interface{}{"Brett"}, vals)
}
func TestValuesScansDBTags(t *testing.T) {
type person struct {
Name string `db:"n"`
}
p := &person{Name: "Brett"}
vals, err := Values([]string{"n"}, p)
require.NoError(t, err)
assert.EqualValues(t, []interface{}{"Brett"}, vals)
}
func TestValuesReturnsErrorWhenPassingNonPointer(t *testing.T) {
_, err := Values([]string{"Name"}, "")
require.Error(t, err)
assert.Contains(t, err.Error(), "pointer")
}
func TestValuesReturnsErrorWhenRetrievingUnexportedValues(t *testing.T) {
type person struct {
name string
}
fieldName := "name"
_, err := Values([]string{fieldName}, &person{name: "Brett"})
require.Error(t, err)
assert.Contains(t, err.Error(), fieldName)
}
func TestValuesWorksWithBothTagAndFieldName(t *testing.T) {
type person struct {
Name string `db:"n"`
}
p := &person{Name: "Brett"}
vals, err := Values([]string{"Name", "n"}, p)
require.NoError(t, err)
assert.EqualValues(t, []interface{}{"Brett", "Brett"}, vals)
}
func TestValuesReturnsAllFieldNames(t *testing.T) {
s := new(largeStruct)
exp := reflect.Indirect(reflect.ValueOf(s)).NumField()
cols, err := Columns(s)
assert.NoError(t, err)
vals, err := Values(cols, s)
require.NoError(t, err)
assert.EqualValues(t, exp, len(vals))
}
func TestValuesReadsFromCacheFirst(t *testing.T) {
person := struct {
Name string
}{
Name: "Brett",
}
v := reflect.Indirect(reflect.ValueOf(&person))
valuesCache.Store(v, map[string]int{"Name": 0})
vals, err := Values([]string{"Name"}, &person)
require.NoError(t, err)
assert.EqualValues(t, []interface{}{"Brett"}, vals)
}
// benchmarks
func BenchmarkValuesLargeStruct(b *testing.B) {
ls := &largeStruct{ID: "test", Index: 88, UUID: "test", IsActive: false, Balance: "test", Picture: "test", Age: 88, EyeColor: "test", Name: "test", Gender: "test", Company: "test", Email: "test", Phone: "test", Address: "test", About: "test", Registered: "test", Latitude: 0.566439688205719, Longitude: 0.48440760374069214, Greeting: "test", FavoriteFruit: "test", AID: "test", AIndex: 19, AUUID: "test", AIsActive: true, ABalance: "test", APicture: "test", AAge: 12, AEyeColor: "test", AName: "test", AGender: "test", ACompany: "test", AEmail: "test", APhone: "test", AAddress: "test", AAbout: "test", ARegistered: "test", ALatitude: 0.16338545083999634, ALongitude: 0.24648870527744293, AGreeting: "test", AFavoriteFruit: "test"}
cols, err := Columns(ls)
assert.NoError(b, err)
for i := 0; i < b.N; i++ {
Values(cols, ls)
}
}
type largeStruct struct {
ID string `db:"id"`
Index int `db:"index"`
UUID string `db:"uuid"`
IsActive bool `db:"isActive"`
Balance string `db:"balance"`
Picture string `db:"picture"`
Age int `db:"age"`
EyeColor string `db:"eyeColor"`
Name string `db:"name"`
Gender string `db:"gender"`
Company string `db:"company"`
Email string `db:"email"`
Phone string `db:"phone"`
Address string `db:"address"`
About string `db:"about"`
Registered string `db:"registered"`
Latitude float64 `db:"latitude"`
Longitude float64 `db:"longitude"`
Greeting string `db:"greeting"`
FavoriteFruit string `db:"favoriteFruit"`
AID string `db:"aid"`
AIndex int `db:"aindex"`
AUUID string `db:"auuid"`
AIsActive bool `db:"aisActive"`
ABalance string `db:"abalance"`
APicture string `db:"apicture"`
AAge int `db:"aage"`
AEyeColor string `db:"aeyeColor"`
AName string `db:"aname"`
AGender string `db:"agender"`
ACompany string `db:"acompany"`
AEmail string `db:"aemail"`
APhone string `db:"aphone"`
AAddress string `db:"aaddress"`
AAbout string `db:"aabout"`
ARegistered string `db:"aregistered"`
ALatitude float64 `db:"alatitude"`
ALongitude float64 `db:"alongitude"`
AGreeting string `db:"agreeting"`
AFavoriteFruit string `db:"afavoriteFruit"`
}