...

Source file src/github.com/golang/geo/s2/contains_point_query_test.go

Documentation: github.com/golang/geo/s2

     1  // Copyright 2018 Google Inc. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    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}, // contained vertex
    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  			// All the shapes we added were of type loop.
   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  // TODO(roberts): Remaining tests
   178  // TestContainsPointQueryVisitIncidentEdges
   179  

View as plain text