diff options
Diffstat (limited to 'vendor/github.com/golang/geo/s2/polyline_test.go')
| -rw-r--r-- | vendor/github.com/golang/geo/s2/polyline_test.go | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/vendor/github.com/golang/geo/s2/polyline_test.go b/vendor/github.com/golang/geo/s2/polyline_test.go new file mode 100644 index 0000000..6c9a5ee --- /dev/null +++ b/vendor/github.com/golang/geo/s2/polyline_test.go @@ -0,0 +1,144 @@ +/* +Copyright 2016 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 ( + "math" + "testing" + + "github.com/golang/geo/r3" +) + +func TestPolylineBasics(t *testing.T) { + empty := Polyline{} + if empty.RectBound() != EmptyRect() { + t.Errorf("empty.RectBound() = %v, want %v", empty.RectBound(), EmptyRect()) + } + if len(empty) != 0 { + t.Errorf("empty Polyline should have no vertices") + } + empty.Reverse() + if len(empty) != 0 { + t.Errorf("reveresed empty Polyline should have no vertices") + } + + latlngs := []LatLng{ + LatLngFromDegrees(0, 0), + LatLngFromDegrees(0, 90), + LatLngFromDegrees(0, 180), + } + + semiEquator := PolylineFromLatLngs(latlngs) + //if got, want := semiEquator.Interpolate(0.5), Point{r3.Vector{0, 1, 0}}; !got.ApproxEqual(want) { + // t.Errorf("semiEquator.Interpolate(0.5) = %v, want %v", got, want) + //} + semiEquator.Reverse() + if got, want := semiEquator[2], (Point{r3.Vector{1, 0, 0}}); !got.ApproxEqual(want) { + t.Errorf("semiEquator[2] = %v, want %v", got, want) + } +} + +func TestPolylineShape(t *testing.T) { + var shape Shape = makePolyline("0:0, 1:0, 1:1, 2:1") + if got, want := shape.NumEdges(), 3; got != want { + t.Errorf("%v.NumEdges() = %v, want %d", shape, got, want) + } + + if got, want := shape.numChains(), 1; got != want { + t.Errorf("%v.numChains() = %d, want %d", shape, got, want) + } + if got, want := shape.chainStart(0), 0; got != want { + t.Errorf("%v.chainStart(0) = %d, want %d", shape, got, want) + } + if got, want := shape.chainStart(1), 3; got != want { + t.Errorf("%v.chainStart(1) = %d, want %d", shape, got, want) + } + + v2, v3 := shape.Edge(2) + if want := PointFromLatLng(LatLngFromDegrees(1, 1)); !v2.ApproxEqual(want) { + t.Errorf("%v.Edge(%d) point A = %v want %v", shape, 2, v2, want) + } + if want := PointFromLatLng(LatLngFromDegrees(2, 1)); !v3.ApproxEqual(want) { + t.Errorf("%v.Edge(%d) point B = %v want %v", shape, 2, v3, want) + } + + if shape.HasInterior() { + t.Errorf("polylines should not have an interior") + } + if shape.ContainsOrigin() { + t.Errorf("polylines should not contain the origin") + } + + if shape.dimension() != polylineGeometry { + t.Errorf("polylines should have PolylineGeometry") + } + + empty := &Polyline{} + if got, want := empty.NumEdges(), 0; got != want { + t.Errorf("%v.NumEdges() = %d, want %d", empty, got, want) + } + if got, want := empty.numChains(), 0; got != want { + t.Errorf("%v.numChains() = %d, want %d", empty, got, want) + } +} + +func TestPolylineLengthAndCentroid(t *testing.T) { + // Construct random great circles and divide them randomly into segments. + // Then make sure that the length and centroid are correct. Note that + // because of the way the centroid is computed, it does not matter how + // we split the great circle into segments. + + for i := 0; i < 100; i++ { + // Choose a coordinate frame for the great circle. + f := randomFrame() + + var line Polyline + for theta := 0.0; theta < 2*math.Pi; theta += math.Pow(randomFloat64(), 10) { + p := Point{f.row(0).Mul(math.Cos(theta)).Add(f.row(1).Mul(math.Sin(theta)))} + if len(line) == 0 || !p.ApproxEqual(line[len(line)-1]) { + line = append(line, p) + } + } + + // Close the circle. + line = append(line, line[0]) + + length := line.Length() + if got, want := math.Abs(length.Radians()-2*math.Pi), 2e-14; got > want { + t.Errorf("%v.Length() = %v, want < %v", line, got, want) + } + + centroid := line.Centroid() + if got, want := centroid.Norm(), 2e-14; got > want { + t.Errorf("%v.Norm() = %v, want < %v", centroid, got, want) + } + } +} + +func TestPolylineIntersectsCell(t *testing.T) { + pline := Polyline{ + Point{r3.Vector{1, -1.1, 0.8}.Normalize()}, + Point{r3.Vector{1, -0.8, 1.1}.Normalize()}, + } + + for face := 0; face < 6; face++ { + cell := CellFromCellID(CellIDFromFace(face)) + if got, want := pline.IntersectsCell(cell), face&1 == 0; got != want { + t.Errorf("%v.IntersectsCell(%v) = %v, want %v", pline, cell, got, want) + } + } +} |
