-
Notifications
You must be signed in to change notification settings - Fork 0
/
cache_test.go
109 lines (103 loc) · 2.25 KB
/
cache_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
package pgtools
import (
"container/list"
"reflect"
"testing"
)
func TestWildcardCache(t *testing.T) {
old := wildcardsCache
t.Cleanup(func() {
wildcardsCache = old // Restore default caching.
})
const maxCached = 3
wildcardsCache = &lru{
cap: maxCached,
m: map[reflect.Type]*list.Element{},
l: list.New(),
}
mocks := []struct {
v any
want string
cachedItems int
}{
{
v: struct {
Automatic string
Tagged string `db:"tagged"`
OneTwo string // OneTwo should be one_two in the database.
CamelCase string `db:"CamelCase"` // CamelCase should not be normalized to camel_case.
Ignored string `db:"-"`
}{},
want: `"automatic","tagged","one_two","CamelCase"`,
cachedItems: 1,
},
{
v: struct {
Automatic string
Tagged string `db:"tagged"`
OneTwo string // OneTwo should be one_two in the database.
CamelCase string `db:"CamelCase"` // CamelCase should not be normalized to camel_case.
Ignored string `db:"-"`
}{},
want: `"automatic","tagged","one_two","CamelCase"`,
cachedItems: 1,
},
{
v: struct {
Number int
}{},
want: `"number"`,
cachedItems: 2,
},
{
v: struct {
Name string
}{},
want: `"name"`,
cachedItems: 3,
},
{
v: struct {
A string
B string
C string
}{},
want: `"a","b","c"`,
cachedItems: 3,
},
{
v: struct {
Name string
}{},
want: `"name"`,
cachedItems: 3,
},
{
v: struct {
Name string
Age int
}{},
want: `"name","age"`,
cachedItems: 3,
},
}
for _, m := range mocks {
orig := Wildcard(m.v)
cached := Wildcard(m.v)
if orig != m.want {
t.Errorf("wanted %v, got %v instead", m.want, orig)
}
if orig != cached {
t.Errorf("wanted cached value %v, got %v instead", m.want, cached)
}
if wildcardsCache.l.Len() != len(wildcardsCache.m) {
t.Error("cache doubly linked list and map length should match")
}
if len(wildcardsCache.m) > maxCached {
t.Errorf("cache should contain %d once full, got %d instead", maxCached, len(wildcardsCache.m))
}
if len(wildcardsCache.m) != m.cachedItems {
t.Errorf("wanted %d cached items, found %d", m.cachedItems, len(wildcardsCache.m))
}
}
}