1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package s2
16
17 import (
18 "reflect"
19 "testing"
20
21 "github.com/golang/geo/s1"
22 )
23
24 func TestContainsPointQueryVertexModelOpen(t *testing.T) {
25 index := makeShapeIndex("0:0 # -1:1, 1:1 # 0:5, 0:7, 2:6")
26 q := NewContainsPointQuery(index, VertexModelOpen)
27
28 tests := []struct {
29 pt Point
30 want bool
31 }{
32 {pt: parsePoint("0:0"), want: false},
33 {pt: parsePoint("-1:1"), want: false},
34 {pt: parsePoint("1:1"), want: false},
35 {pt: parsePoint("0:2"), want: false},
36 {pt: parsePoint("0:3"), want: false},
37 {pt: parsePoint("0:5"), want: false},
38 {pt: parsePoint("0:7"), want: false},
39 {pt: parsePoint("2:6"), want: false},
40 {pt: parsePoint("1:6"), want: true},
41 {pt: parsePoint("10:10"), want: false},
42 }
43 for _, test := range tests {
44 if got := q.Contains(test.pt); got != test.want {
45 t.Errorf("query.ContainsPoint(%v) = %v, want %v", test.pt, got, test.want)
46 }
47 }
48
49 if s, p := index.Shape(1), parsePoint("1:6"); q.ShapeContains(s, p) {
50 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, true, false)
51 }
52 if s, p := index.Shape(2), parsePoint("1:6"); !q.ShapeContains(s, p) {
53 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, false, true)
54 }
55 if s, p := index.Shape(2), parsePoint("0:5"); q.ShapeContains(s, p) {
56 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, true, false)
57 }
58 if s, p := index.Shape(2), parsePoint("0:7"); q.ShapeContains(s, p) {
59 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, true, false)
60 }
61 }
62
63 func TestContainsPointQueryVertexModelSemiOpen(t *testing.T) {
64 index := makeShapeIndex("0:0 # -1:1, 1:1 # 0:5, 0:7, 2:6")
65 q := NewContainsPointQuery(index, VertexModelSemiOpen)
66
67 tests := []struct {
68 pt Point
69 want bool
70 }{
71 {pt: parsePoint("0:0"), want: false},
72 {pt: parsePoint("-1:1"), want: false},
73 {pt: parsePoint("1:1"), want: false},
74 {pt: parsePoint("0:2"), want: false},
75 {pt: parsePoint("0:5"), want: false},
76 {pt: parsePoint("0:7"), want: true},
77 {pt: parsePoint("2:6"), want: false},
78 {pt: parsePoint("1:6"), want: true},
79 {pt: parsePoint("10:10"), want: false},
80 }
81 for _, test := range tests {
82 if got := q.Contains(test.pt); got != test.want {
83 t.Errorf("query.ContainsPoint(%v) = %v, want %v", test.pt, got, test.want)
84 }
85 }
86
87 if s, p := index.Shape(1), parsePoint("1:6"); q.ShapeContains(s, p) {
88 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, true, false)
89 }
90 if s, p := index.Shape(2), parsePoint("1:6"); !q.ShapeContains(s, p) {
91 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, false, true)
92 }
93 if s, p := index.Shape(2), parsePoint("0:5"); q.ShapeContains(s, p) {
94 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, true, false)
95 }
96 if s, p := index.Shape(2), parsePoint("0:7"); !q.ShapeContains(s, p) {
97 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, false, true)
98 }
99 }
100
101 func TestContainsPointQueryVertexModelClosed(t *testing.T) {
102 index := makeShapeIndex("0:0 # -1:1, 1:1 # 0:5, 0:7, 2:6")
103 q := NewContainsPointQuery(index, VertexModelClosed)
104
105 tests := []struct {
106 pt Point
107 want bool
108 }{
109 {pt: parsePoint("0:0"), want: true},
110 {pt: parsePoint("-1:1"), want: true},
111 {pt: parsePoint("1:1"), want: true},
112 {pt: parsePoint("0:2"), want: false},
113 {pt: parsePoint("0:5"), want: true},
114 {pt: parsePoint("0:7"), want: true},
115 {pt: parsePoint("2:6"), want: true},
116 {pt: parsePoint("1:6"), want: true},
117 {pt: parsePoint("10:10"), want: false},
118 }
119 for _, test := range tests {
120 if got := q.Contains(test.pt); got != test.want {
121 t.Errorf("query.ContainsPoint(%v) = %v, want %v", test.pt, got, test.want)
122 }
123 }
124
125 if s, p := index.Shape(1), parsePoint("1:6"); q.ShapeContains(s, p) {
126 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, true, false)
127 }
128 if s, p := index.Shape(2), parsePoint("1:6"); !q.ShapeContains(s, p) {
129 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, false, true)
130 }
131 if s, p := index.Shape(2), parsePoint("0:5"); !q.ShapeContains(s, p) {
132 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, false, true)
133 }
134 if s, p := index.Shape(2), parsePoint("0:7"); !q.ShapeContains(s, p) {
135 t.Errorf("query.ShapeContains(%v) = %v, want %v", p, false, true)
136 }
137 }
138
139 func TestContainsPointQueryContainingShapes(t *testing.T) {
140 const numVerticesPerLoop = 10
141 maxLoopRadius := kmToAngle(10)
142 centerCap := CapFromCenterAngle(randomPoint(), maxLoopRadius)
143 index := NewShapeIndex()
144
145 for i := 0; i < 100; i++ {
146 index.Add(RegularLoop(samplePointFromCap(centerCap), s1.Angle(randomFloat64())*maxLoopRadius, numVerticesPerLoop))
147 }
148
149 query := NewContainsPointQuery(index, VertexModelSemiOpen)
150
151 for i := 0; i < 100; i++ {
152 p := samplePointFromCap(centerCap)
153 var want []Shape
154
155 for j := int32(0); j < int32(len(index.shapes)); j++ {
156 shape := index.Shape(j)
157
158 loop := shape.(*Loop)
159 if loop.ContainsPoint(p) {
160 if !query.ShapeContains(shape, p) {
161 t.Errorf("index.Shape(%d).ContainsPoint(%v) = true, but query.ShapeContains(%v) = false", j, p, p)
162 }
163 want = append(want, shape)
164 } else {
165 if query.ShapeContains(shape, p) {
166 t.Errorf("query.ShapeContains(shape, %v) = true, but the original loop does not contain the point.", p)
167 }
168 }
169 }
170 got := query.ContainingShapes(p)
171 if !reflect.DeepEqual(got, want) {
172 t.Errorf("%d query.ContainingShapes(%v) = %+v, want %+v", i, p, got, want)
173 }
174 }
175 }
176
177
178
179
View as plain text