@@ -27,13 +27,12 @@ func TestCovererRandomCells(t *testing.T) {
27
27
28
28
// Test random cell ids at all levels.
29
29
for i := 0 ; i < 10000 ; i ++ {
30
- id := CellID (randomUint64 ())
31
- for ! id .IsValid () {
32
- id = CellID (randomUint64 ())
33
- }
30
+ id := randomCellID ()
34
31
covering := rc .Covering (Region (CellFromCellID (id )))
35
32
if len (covering ) != 1 {
36
33
t .Errorf ("Iteration %d, cell ID token %s, got covering size = %d, want covering size = 1" , i , id .ToToken (), len (covering ))
34
+ // if the covering isn't len 1, the next check will panic
35
+ break
37
36
}
38
37
if (covering )[0 ] != id {
39
38
t .Errorf ("Iteration %d, cell ID token %s, got covering = %v, want covering = %v" , i , id .ToToken (), covering , id )
@@ -115,7 +114,7 @@ func checkCoveringTight(t *testing.T, r Region, cover CellUnion, checkTight bool
115
114
}
116
115
117
116
func TestCovererRandomCaps (t * testing.T ) {
118
- rc := & RegionCoverer {}
117
+ rc := & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 1 , MaxCells : 1 }
119
118
for i := 0 ; i < 1000 ; i ++ {
120
119
rc .MinLevel = int (rand .Int31n (maxLevel + 1 ))
121
120
rc .MaxLevel = int (rand .Int31n (maxLevel + 1 ))
@@ -194,6 +193,111 @@ func TestRegionCovererSimpleRegionCovering(t *testing.T) {
194
193
}
195
194
}
196
195
196
+ func TestRegionCovererIsCanonical (t * testing.T ) {
197
+ tests := []struct {
198
+ cells []string
199
+ cov * RegionCoverer
200
+ want bool
201
+ }{
202
+ // InvalidCellID
203
+ {cells : []string {"1/" }, cov : NewRegionCoverer (), want : true },
204
+ {cells : []string {"invalid" }, cov : NewRegionCoverer (), want : false },
205
+ // Unsorted
206
+ {cells : []string {"1/1" , "1/3" }, cov : NewRegionCoverer (), want : true },
207
+ {cells : []string {"1/3" , "1/1" }, cov : NewRegionCoverer (), want : false },
208
+
209
+ // Overlapping
210
+ {cells : []string {"1/2" , "1/33" }, cov : NewRegionCoverer (), want : true },
211
+ {cells : []string {"1/3" , "1/33" }, cov : NewRegionCoverer (), want : false },
212
+
213
+ // MinLevel
214
+ {
215
+ cells : []string {"1/31" },
216
+ cov : & RegionCoverer {MinLevel : 2 , MaxLevel : 30 , LevelMod : 1 , MaxCells : 8 },
217
+ want : true ,
218
+ },
219
+ {
220
+ cells : []string {"1/3" },
221
+ cov : & RegionCoverer {MinLevel : 2 , MaxLevel : 30 , LevelMod : 1 , MaxCells : 8 },
222
+ want : false ,
223
+ },
224
+
225
+ // MaxLevel
226
+ {
227
+ cells : []string {"1/31" },
228
+ cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 2 , LevelMod : 1 , MaxCells : 8 },
229
+ want : true ,
230
+ },
231
+ {
232
+ cells : []string {"1/312" },
233
+ cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 2 , LevelMod : 1 , MaxCells : 8 },
234
+ want : false ,
235
+ },
236
+
237
+ // LevelMod
238
+ {
239
+ cells : []string {"1/31" },
240
+ cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 2 , MaxCells : 8 },
241
+ want : true ,
242
+ },
243
+ {
244
+ cells : []string {"1/312" },
245
+ cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 2 , MaxCells : 8 },
246
+ want : false ,
247
+ },
248
+
249
+ // MaxCells
250
+ {cells : []string {"1/1" , "1/3" }, cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 1 , MaxCells : 2 }, want : true },
251
+ {cells : []string {"1/1" , "1/3" , "2/" }, cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 1 , MaxCells : 2 }, want : false },
252
+ {cells : []string {"1/123" , "2/1" , "3/0122" }, cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 1 , MaxCells : 2 }, want : true },
253
+
254
+ // Normalized
255
+ // Test that no sequence of cells could be replaced by an ancestor.
256
+ {
257
+ cells : []string {"1/01" , "1/02" , "1/03" , "1/10" , "1/11" },
258
+ cov : NewRegionCoverer (),
259
+ want : true ,
260
+ },
261
+ {
262
+ cells : []string {"1/00" , "1/01" , "1/02" , "1/03" , "1/10" },
263
+ cov : NewRegionCoverer (),
264
+ want : false ,
265
+ },
266
+
267
+ {
268
+ cells : []string {"0/22" , "1/01" , "1/02" , "1/03" , "1/10" },
269
+ cov : NewRegionCoverer (),
270
+ want : true ,
271
+ },
272
+ {
273
+ cells : []string {"0/22" , "1/00" , "1/01" , "1/02" , "1/03" },
274
+ cov : NewRegionCoverer (),
275
+ want : false ,
276
+ },
277
+
278
+ {
279
+ cells : []string {"1/1101" , "1/1102" , "1/1103" , "1/1110" , "1/1111" , "1/1112" ,
280
+ "1/1113" , "1/1120" , "1/1121" , "1/1122" , "1/1123" , "1/1130" ,
281
+ "1/1131" , "1/1132" , "1/1133" , "1/1200" },
282
+ cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 2 , MaxCells : 20 },
283
+ want : true ,
284
+ },
285
+ {
286
+ cells : []string {"1/1100" , "1/1101" , "1/1102" , "1/1103" , "1/1110" , "1/1111" ,
287
+ "1/1112" , "1/1113" , "1/1120" , "1/1121" , "1/1122" , "1/1123" ,
288
+ "1/1130" , "1/1131" , "1/1132" , "1/1133" },
289
+ cov : & RegionCoverer {MinLevel : 0 , MaxLevel : 30 , LevelMod : 2 , MaxCells : 20 },
290
+ want : false ,
291
+ },
292
+ }
293
+ for _ , test := range tests {
294
+ cu := makeCellUnion (test .cells ... )
295
+ if got := test .cov .IsCanonical (cu ); got != test .want {
296
+ t .Errorf ("IsCanonical(%v) = %t, want %t" , cu , got , test .want )
297
+ }
298
+ }
299
+ }
300
+
197
301
const numCoveringBMRegions = 1000
198
302
199
303
func BenchmarkRegionCovererCoveringCap (b * testing.B ) {
@@ -278,14 +382,6 @@ func benchmarkRegionCovererCovering(b *testing.B, genLabel func(n int) string, g
278
382
// TODO(roberts): Differences from C++
279
383
// func TestRegionCovererAccuracy(t *testing.T) {
280
384
// func TestRegionCovererFastCoveringHugeFixedLevelCovering(t *testing.T) {
281
- // func TestRegionCovererIsCanonicalInvalidS2CellId(t *testing.T) {
282
- // func TestRegionCovererIsCanonicalUnsorted(t *testing.T) {
283
- // func TestRegionCovererIsCanonicalOverlapping(t *testing.T) {
284
- // func TestRegionCovererIsCanonicalMinLevel(t *testing.T) {
285
- // func TestRegionCovererIsCanonicalMaxLevel(t *testing.T) {
286
- // func TestRegionCovererIsCanonicalLevelMod(t *testing.T) {
287
- // func TestRegionCovererIsCanonicalMaxCells(t *testing.T) {
288
- // func TestRegionCovererIsCanonicalNormalized(t *testing.T) {
289
385
// func TestRegionCovererCanonicalizeCoveringUnsortedDuplicateCells(t *testing.T) {
290
386
// func TestRegionCovererCanonicalizeCoveringMaxLevelExceeded(t *testing.T) {
291
387
// func TestRegionCovererCanonicalizeCoveringWrongLevelMod(t *testing.T) {
0 commit comments