OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package memory | 5 package memory |
6 | 6 |
7 import ( | 7 import ( |
8 "testing" | 8 "testing" |
9 "time" | 9 "time" |
10 | 10 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 }, | 65 }, |
66 "nerd": { | 66 "nerd": { |
67 cat(ds.PTFloat, 103.7), | 67 cat(ds.PTFloat, 103.7), |
68 }, | 68 }, |
69 }) | 69 }) |
70 }) | 70 }) |
71 Convey("defaultIndicies", func() { | 71 Convey("defaultIndicies", func() { |
72 idxs := defaultIndicies("knd", pm) | 72 idxs := defaultIndicies("knd", pm) |
73 So(len(idxs), ShouldEqual, 5) | 73 So(len(idxs), ShouldEqual, 5) |
74 So(idxs[0].String(), ShouldEqual, "B:knd
") | 74 So(idxs[0].String(), ShouldEqual, "B:knd
") |
75 » » » » » So(idxs[1].String(), ShouldEqual, "B:knd
/-nerd") | 75 » » » » » So(idxs[1].String(), ShouldEqual, "B:knd
/nerd") |
76 » » » » » So(idxs[2].String(), ShouldEqual, "B:knd
/-wat") | 76 » » » » » So(idxs[2].String(), ShouldEqual, "B:knd
/wat") |
77 » » » » » So(idxs[3].String(), ShouldEqual, "B:knd
/nerd") | 77 » » » » » So(idxs[3].String(), ShouldEqual, "B:knd
/-nerd") |
78 » » » » » So(idxs[4].String(), ShouldEqual, "B:knd
/wat") | 78 » » » » » So(idxs[4].String(), ShouldEqual, "B:knd
/-wat") |
79 }) | 79 }) |
80 }) | 80 }) |
81 }) | 81 }) |
82 }) | 82 }) |
83 } | 83 } |
84 | 84 |
85 var rgenComplexTime = time.Date( | 85 var rgenComplexTime = time.Date( |
86 1986, time.October, 26, 1, 20, 00, 00, time.UTC) | 86 1986, time.October, 26, 1, 20, 00, 00, time.UTC) |
87 var rgenComplexKey = key("kind", "id") | 87 var rgenComplexKey = key("kind", "id") |
88 | 88 |
89 var rowGenTestCases = []struct { | 89 var rowGenTestCases = []struct { |
90 name string | 90 name string |
91 pmap ds.PropertyMap | 91 pmap ds.PropertyMap |
92 withBuiltin bool | 92 withBuiltin bool |
93 » idxs []*qIndex | 93 » idxs []*ds.IndexDefinition |
94 | 94 |
95 // These are checked in TestIndexRowGen. nil to skip test case. | 95 // These are checked in TestIndexRowGen. nil to skip test case. |
96 expected []serializedPvals | 96 expected []serializedPvals |
97 | 97 |
98 // just the collections you want to assert. These are checked in | 98 // just the collections you want to assert. These are checked in |
99 // TestIndexEntries. nil to skip test case. | 99 // TestIndexEntries. nil to skip test case. |
100 collections map[string][]kv | 100 collections map[string][]kv |
101 }{ | 101 }{ |
102 { | 102 { |
103 name: "simple including builtins", | 103 name: "simple including builtins", |
104 pmap: ds.PropertyMap{ | 104 pmap: ds.PropertyMap{ |
105 "wat": {propNI("thing"), prop("hat"), prop(100)}, | 105 "wat": {propNI("thing"), prop("hat"), prop(100)}, |
106 "nerd": {prop(103.7)}, | 106 "nerd": {prop(103.7)}, |
107 "spaz": {propNI(false)}, | 107 "spaz": {propNI(false)}, |
108 }, | 108 }, |
109 withBuiltin: true, | 109 withBuiltin: true, |
110 » » idxs: []*qIndex{ | 110 » » idxs: []*ds.IndexDefinition{ |
111 indx("knd", "-wat", "nerd"), | 111 indx("knd", "-wat", "nerd"), |
112 }, | 112 }, |
113 expected: []serializedPvals{ | 113 expected: []serializedPvals{ |
114 {{}}, // B:knd | 114 {{}}, // B:knd |
| 115 {cat(ds.PTFloat, 103.7)}, // B:kn
d/nerd |
| 116 {cat(ds.PTInt, 100), cat(ds.PTString, "hat")}, // B:kn
d/wat |
115 {icat(ds.PTFloat, 103.7)}, // B:kn
d/-nerd | 117 {icat(ds.PTFloat, 103.7)}, // B:kn
d/-nerd |
116 {icat(ds.PTString, "hat"), icat(ds.PTInt, 100)}, // B:kn
d/-wat | 118 {icat(ds.PTString, "hat"), icat(ds.PTInt, 100)}, // B:kn
d/-wat |
117 » » » {cat(ds.PTFloat, 103.7)}, // B:kn
d/nerd | 119 » » » { // C:knd/-wat/nerd |
118 » » » {cat(ds.PTInt, 100), cat(ds.PTString, "hat")}, // B:kn
d/wat | |
119 » » » { // B:knd/-wat/nerd | |
120 cat(icat(ds.PTString, "hat"), cat(ds.PTFloat, 10
3.7)), | 120 cat(icat(ds.PTString, "hat"), cat(ds.PTFloat, 10
3.7)), |
121 cat(icat(ds.PTInt, 100), cat(ds.PTFloat, 103.7))
, | 121 cat(icat(ds.PTInt, 100), cat(ds.PTFloat, 103.7))
, |
122 }, | 122 }, |
123 }, | 123 }, |
124 collections: map[string][]kv{ | 124 collections: map[string][]kv{ |
125 "idx": { | 125 "idx": { |
126 // 0 == builtin, 1 == complex | 126 // 0 == builtin, 1 == complex |
127 » » » » {cat(byte(0), "knd", byte(1), 0), []byte{}}, | 127 » » » » {cat(byte(0), "knd", byte(0), 0), []byte{}}, |
128 » » » » {cat(byte(0), "knd", byte(1), 1, byte(0), "nerd"
), []byte{}}, | 128 » » » » {cat(byte(0), "knd", byte(0), 1, byte(0), "nerd"
), []byte{}}, |
129 » » » » {cat(byte(0), "knd", byte(1), 1, byte(0), "wat")
, []byte{}}, | 129 » » » » {cat(byte(0), "knd", byte(0), 1, byte(0), "wat")
, []byte{}}, |
130 » » » » {cat(byte(0), "knd", byte(1), 1, byte(1), "nerd"
), []byte{}}, | 130 » » » » {cat(byte(0), "knd", byte(0), 1, byte(1), "nerd"
), []byte{}}, |
131 » » » » {cat(byte(0), "knd", byte(1), 1, byte(1), "wat")
, []byte{}}, | 131 » » » » {cat(byte(0), "knd", byte(0), 1, byte(1), "wat")
, []byte{}}, |
132 » » » » {cat(byte(1), "knd", byte(1), 2, byte(1), "wat",
byte(0), "nerd"), []byte{}}, | 132 » » » » {cat(byte(1), "knd", byte(0), 2, byte(1), "wat",
byte(0), "nerd"), []byte{}}, |
133 }, | 133 }, |
134 "idx:ns:" + sat(indx("knd")): { | 134 "idx:ns:" + sat(indx("knd")): { |
135 {cat(fakeKey), []byte{}}, | 135 {cat(fakeKey), []byte{}}, |
136 }, | 136 }, |
137 "idx:ns:" + sat(indx("knd", "wat")): { | 137 "idx:ns:" + sat(indx("knd", "wat")): { |
138 {cat(ds.PTInt, 100, fakeKey), []byte{}}, | 138 {cat(ds.PTInt, 100, fakeKey), []byte{}}, |
139 {cat(ds.PTString, "hat", fakeKey), cat(ds.PTInt,
100)}, | 139 {cat(ds.PTString, "hat", fakeKey), cat(ds.PTInt,
100)}, |
140 }, | 140 }, |
141 "idx:ns:" + sat(indx("knd", "-wat")): { | 141 "idx:ns:" + sat(indx("knd", "-wat")): { |
142 {cat(icat(ds.PTString, "hat"), fakeKey), []byte{
}}, | 142 {cat(icat(ds.PTString, "hat"), fakeKey), []byte{
}}, |
143 {cat(icat(ds.PTInt, 100), fakeKey), icat(ds.PTSt
ring, "hat")}, | 143 {cat(icat(ds.PTInt, 100), fakeKey), icat(ds.PTSt
ring, "hat")}, |
144 }, | 144 }, |
145 }, | 145 }, |
146 }, | 146 }, |
147 { | 147 { |
148 name: "complex", | 148 name: "complex", |
149 pmap: ds.PropertyMap{ | 149 pmap: ds.PropertyMap{ |
150 "yerp": {prop("hat"), prop(73.9)}, | 150 "yerp": {prop("hat"), prop(73.9)}, |
151 "wat": { | 151 "wat": { |
152 prop(rgenComplexTime), | 152 prop(rgenComplexTime), |
153 prop(ds.ByteString("value")), | 153 prop(ds.ByteString("value")), |
154 prop(rgenComplexKey)}, | 154 prop(rgenComplexKey)}, |
155 "spaz": {prop(nil), prop(false), prop(true)}, | 155 "spaz": {prop(nil), prop(false), prop(true)}, |
156 }, | 156 }, |
157 » » idxs: []*qIndex{ | 157 » » idxs: []*ds.IndexDefinition{ |
158 indx("knd", "-wat", "nerd", "spaz"), // doesn't match, s
o empty | 158 indx("knd", "-wat", "nerd", "spaz"), // doesn't match, s
o empty |
159 indx("knd", "yerp", "-wat", "spaz"), | 159 indx("knd", "yerp", "-wat", "spaz"), |
160 }, | 160 }, |
161 expected: []serializedPvals{ | 161 expected: []serializedPvals{ |
162 {}, // C:knd/-wat/nerd/spaz, no match | 162 {}, // C:knd/-wat/nerd/spaz, no match |
163 { // C:knd/yerp/-wat/spaz | 163 { // C:knd/yerp/-wat/spaz |
164 // thank goodness the binary serialization only
happens 1/val in the | 164 // thank goodness the binary serialization only
happens 1/val in the |
165 // real code :). | 165 // real code :). |
166 cat(cat(ds.PTString, "hat"), icat(ds.PTKey, rgen
ComplexKey), cat(ds.PTNull)), | 166 cat(cat(ds.PTString, "hat"), icat(ds.PTKey, rgen
ComplexKey), cat(ds.PTNull)), |
167 cat(cat(ds.PTString, "hat"), icat(ds.PTKey, rgen
ComplexKey), cat(ds.PTBoolFalse)), | 167 cat(cat(ds.PTString, "hat"), icat(ds.PTKey, rgen
ComplexKey), cat(ds.PTBoolFalse)), |
(...skipping 15 matching lines...) Expand all Loading... |
183 cat(cat(ds.PTFloat, 73.9), icat(ds.PTTime, rgenC
omplexTime), cat(ds.PTBoolFalse)), | 183 cat(cat(ds.PTFloat, 73.9), icat(ds.PTTime, rgenC
omplexTime), cat(ds.PTBoolFalse)), |
184 cat(cat(ds.PTFloat, 73.9), icat(ds.PTTime, rgenC
omplexTime), cat(ds.PTBoolTrue)), | 184 cat(cat(ds.PTFloat, 73.9), icat(ds.PTTime, rgenC
omplexTime), cat(ds.PTBoolTrue)), |
185 }, | 185 }, |
186 }, | 186 }, |
187 }, | 187 }, |
188 { | 188 { |
189 name: "ancestor", | 189 name: "ancestor", |
190 pmap: ds.PropertyMap{ | 190 pmap: ds.PropertyMap{ |
191 "wat": {prop("sup")}, | 191 "wat": {prop("sup")}, |
192 }, | 192 }, |
193 » » idxs: []*qIndex{ | 193 » » idxs: []*ds.IndexDefinition{ |
194 indx("knd!", "wat"), | 194 indx("knd!", "wat"), |
195 }, | 195 }, |
196 collections: map[string][]kv{ | 196 collections: map[string][]kv{ |
197 "idx:ns:" + sat(indx("knd!", "wat")): { | 197 "idx:ns:" + sat(indx("knd!", "wat")): { |
198 {cat(fakeKey.Parent(), ds.PTString, "sup", fakeK
ey), []byte{}}, | 198 {cat(fakeKey.Parent(), ds.PTString, "sup", fakeK
ey), []byte{}}, |
199 {cat(fakeKey, ds.PTString, "sup", fakeKey), []by
te{}}, | 199 {cat(fakeKey, ds.PTString, "sup", fakeKey), []by
te{}}, |
200 }, | 200 }, |
201 }, | 201 }, |
202 }, | 202 }, |
203 } | 203 } |
204 | 204 |
205 func TestIndexRowGen(t *testing.T) { | 205 func TestIndexRowGen(t *testing.T) { |
206 t.Parallel() | 206 t.Parallel() |
207 | 207 |
208 Convey("Test Index Row Generation", t, func() { | 208 Convey("Test Index Row Generation", t, func() { |
209 for _, tc := range rowGenTestCases { | 209 for _, tc := range rowGenTestCases { |
210 if tc.expected == nil { | 210 if tc.expected == nil { |
211 Convey(tc.name, nil) // shows up as 'skipped' | 211 Convey(tc.name, nil) // shows up as 'skipped' |
212 continue | 212 continue |
213 } | 213 } |
214 | 214 |
215 Convey(tc.name, func() { | 215 Convey(tc.name, func() { |
216 mvals := partiallySerialize(tc.pmap) | 216 mvals := partiallySerialize(tc.pmap) |
217 » » » » idxs := []*qIndex(nil) | 217 » » » » idxs := []*ds.IndexDefinition(nil) |
218 if tc.withBuiltin { | 218 if tc.withBuiltin { |
219 idxs = append(defaultIndicies("coolKind"
, tc.pmap), tc.idxs...) | 219 idxs = append(defaultIndicies("coolKind"
, tc.pmap), tc.idxs...) |
220 } else { | 220 } else { |
221 idxs = tc.idxs | 221 idxs = tc.idxs |
222 } | 222 } |
223 | 223 |
224 m := matcher{} | 224 m := matcher{} |
225 for i, idx := range idxs { | 225 for i, idx := range idxs { |
226 Convey(idx.String(), func() { | 226 Convey(idx.String(), func() { |
227 iGen, ok := m.match(idx, mvals) | 227 iGen, ok := m.match(idx, mvals) |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 }) | 275 }) |
276 } | 276 } |
277 | 277 |
278 type dumbItem struct { | 278 type dumbItem struct { |
279 key ds.Key | 279 key ds.Key |
280 props ds.PropertyMap | 280 props ds.PropertyMap |
281 } | 281 } |
282 | 282 |
283 var updateIndiciesTests = []struct { | 283 var updateIndiciesTests = []struct { |
284 name string | 284 name string |
285 » idxs []*qIndex | 285 » idxs []*ds.IndexDefinition |
286 data []dumbItem | 286 data []dumbItem |
287 expected map[string][][]byte | 287 expected map[string][][]byte |
288 }{ | 288 }{ |
289 { | 289 { |
290 name: "basic", | 290 name: "basic", |
291 data: []dumbItem{ | 291 data: []dumbItem{ |
292 {key("knd", 1), ds.PropertyMap{ | 292 {key("knd", 1), ds.PropertyMap{ |
293 "wat": {prop(10)}, | 293 "wat": {prop(10)}, |
294 "yerp": {prop(10)}}, | 294 "yerp": {prop(10)}}, |
295 }, | 295 }, |
(...skipping 16 matching lines...) Expand all Loading... |
312 cat(icat(ds.PTInt, 1), key("knd", 10)), | 312 cat(icat(ds.PTInt, 1), key("knd", 10)), |
313 }, | 313 }, |
314 "idx:ns:" + sat(indx("knd", "yerp")): { | 314 "idx:ns:" + sat(indx("knd", "yerp")): { |
315 cat(ds.PTInt, 200, key("knd", 10)), | 315 cat(ds.PTInt, 200, key("knd", 10)), |
316 cat(ds.PTInt, 202, key("knd", 1)), | 316 cat(ds.PTInt, 202, key("knd", 1)), |
317 }, | 317 }, |
318 }, | 318 }, |
319 }, | 319 }, |
320 { | 320 { |
321 name: "compound", | 321 name: "compound", |
322 » » idxs: []*qIndex{indx("knd", "yerp", "-wat")}, | 322 » » idxs: []*ds.IndexDefinition{indx("knd", "yerp", "-wat")}, |
323 data: []dumbItem{ | 323 data: []dumbItem{ |
324 {key("knd", 1), ds.PropertyMap{ | 324 {key("knd", 1), ds.PropertyMap{ |
325 "wat": {prop(10)}, | 325 "wat": {prop(10)}, |
326 "yerp": {prop(100)}}, | 326 "yerp": {prop(100)}}, |
327 }, | 327 }, |
328 {key("knd", 10), ds.PropertyMap{ | 328 {key("knd", 10), ds.PropertyMap{ |
329 "wat": {prop(1)}, | 329 "wat": {prop(1)}, |
330 "yerp": {prop(200)}}, | 330 "yerp": {prop(200)}}, |
331 }, | 331 }, |
332 {key("knd", 11), ds.PropertyMap{ | 332 {key("knd", 11), ds.PropertyMap{ |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 So(data[i], ShouldResemble, itm.
Key) | 382 So(data[i], ShouldResemble, itm.
Key) |
383 i++ | 383 i++ |
384 return true | 384 return true |
385 }) | 385 }) |
386 So(i, ShouldEqual, len(data)) | 386 So(i, ShouldEqual, len(data)) |
387 } | 387 } |
388 }) | 388 }) |
389 } | 389 } |
390 }) | 390 }) |
391 } | 391 } |
OLD | NEW |