-
Notifications
You must be signed in to change notification settings - Fork 182
/
Copy pathpointcompression_test.go
111 lines (101 loc) · 3.13 KB
/
pointcompression_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
// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package s2
import (
"bytes"
"reflect"
"testing"
)
func TestFacesIterator(t *testing.T) {
iter := facesIterator{faces: []faceRun{{1, 1}, {2, 2}, {0, 1}}}
var got []int
for iter.next() {
got = append(got, iter.curFace)
}
want := []int{1, 2, 2, 0}
if !reflect.DeepEqual(got, want) {
t.Errorf("facesIterator produced sequence %v, want %v", got, want)
}
}
func makeSnappedPoints(nvertices int, level int) []Point {
const radiusKM = 0.1
center := PointFromCoords(1, 1, 1)
pts := regularPoints(center, kmToAngle(radiusKM), nvertices)
for i, pt := range pts {
id := CellFromPoint(pt).ID()
if level < id.Level() {
pts[i] = id.Parent(level).Point()
}
}
return pts
}
func TestPointsCompression(t *testing.T) {
loop100Mixed15 := makeSnappedPoints(100, MaxLevel)
for i := 0; i < 15; i++ {
loop100Mixed15[3*i] = CellFromPoint(loop100Mixed15[3*i]).ID().Parent(4).Point()
}
tests := []struct {
label string
pts []Point
level int
}{
{"loop4", makeSnappedPoints(4, MaxLevel), MaxLevel},
{"loop4unsnapped", makeSnappedPoints(4, 4), MaxLevel},
// Radius is 100m, so points are about 141 meters apart.
// Snapping to level 14 will move them by < 47m.
{"loop4Level14", makeSnappedPoints(4, 14), 14},
{"loop100", makeSnappedPoints(100, MaxLevel), MaxLevel},
{"loop100Unsnapped", makeSnappedPoints(100, 100), MaxLevel},
{"loop100Mixed15", loop100Mixed15, MaxLevel},
}
NextTest:
for _, tt := range tests {
sitis := (&Loop{vertices: tt.pts}).xyzFaceSiTiVertices()
var buf bytes.Buffer
e := &encoder{w: &buf}
encodePointsCompressed(e, sitis, tt.level)
if e.err != nil {
t.Errorf("encodePointsCompressed (%s): %v", tt.label, e.err)
continue
}
d := &decoder{r: &buf}
got := make([]Point, len(tt.pts))
decodePointsCompressed(d, tt.level, got)
if d.err != nil {
t.Errorf("decodePointsCompressed (%s): %v", tt.label, d.err)
}
for i, want := range tt.pts {
if !got[i].ApproxEqual(want) {
t.Errorf("decodePointsCompressed(encodePointsCompressed) for %s at %d: got %v want %v", tt.label, i, got[i], want)
continue NextTest
}
}
}
}
func TestZigzag(t *testing.T) {
tab := []struct {
signed int32
unsigned uint32
}{
{0, 0}, {-1, 1}, {1, 2}, {-2, 3}, {2147483647, 4294967294}, {-2147483648, 4294967295},
}
for _, tt := range tab {
if s := zigzagDecode(tt.unsigned); s != tt.signed {
t.Errorf("zigzagDecode(%d) = %d, want %d", tt.unsigned, s, tt.signed)
}
if u := zigzagEncode(tt.signed); u != tt.unsigned {
t.Errorf("zigzagEncode(%d) = %d, want %d", tt.signed, u, tt.unsigned)
}
}
}