diff options
Diffstat (limited to 'vendor/github.com/golang/geo/r1/interval_test.go')
| -rw-r--r-- | vendor/github.com/golang/geo/r1/interval_test.go | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/vendor/github.com/golang/geo/r1/interval_test.go b/vendor/github.com/golang/geo/r1/interval_test.go new file mode 100644 index 0000000..d8b49cd --- /dev/null +++ b/vendor/github.com/golang/geo/r1/interval_test.go @@ -0,0 +1,349 @@ +/* +Copyright 2014 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 r1 + +import ( + "testing" +) + +// Some standard intervals for use throughout the tests. +var ( + unit = Interval{0, 1} + negunit = Interval{-1, 0} + half = Interval{0.5, 0.5} + empty = EmptyInterval() +) + +func TestIsEmpty(t *testing.T) { + var zero Interval + if unit.IsEmpty() { + t.Errorf("%v should not be empty", unit) + } + if half.IsEmpty() { + t.Errorf("%v should not be empty", half) + } + if !empty.IsEmpty() { + t.Errorf("%v should be empty", empty) + } + if zero.IsEmpty() { + t.Errorf("zero Interval %v should not be empty", zero) + } +} + +func TestCenter(t *testing.T) { + tests := []struct { + interval Interval + want float64 + }{ + {unit, 0.5}, + {negunit, -0.5}, + {half, 0.5}, + } + for _, test := range tests { + got := test.interval.Center() + if got != test.want { + t.Errorf("%v.Center() = %v, want %v", test.interval, got, test.want) + } + } +} + +func TestLength(t *testing.T) { + tests := []struct { + interval Interval + want float64 + }{ + {unit, 1}, + {negunit, 1}, + {half, 0}, + } + for _, test := range tests { + if l := test.interval.Length(); l != test.want { + t.Errorf("%v.Length() = %v, want %v", test.interval, l, test.want) + } + } + if l := empty.Length(); l >= 0 { + t.Errorf("empty interval has non-negative length") + } +} + +func TestIntervalContains(t *testing.T) { + tests := []struct { + interval Interval + p float64 + contains bool + interiorContains bool + }{ + { + interval: unit, + p: 0.5, + contains: true, + interiorContains: true, + }, + { + interval: unit, + p: 0, + contains: true, + interiorContains: false, + }, + { + interval: unit, + p: 1, + contains: true, + interiorContains: false, + }, + } + + for _, test := range tests { + if got := test.interval.Contains(test.p); got != test.contains { + t.Errorf("%v.Contains(%v) = %t, want %t", test.interval, test.p, got, test.contains) + } + if got := test.interval.InteriorContains(test.p); got != test.interiorContains { + t.Errorf("%v.InteriorContains(%v) = %t, want %t", test.interval, test.p, got, test.interiorContains) + } + } +} + +func TestIntervalOperations(t *testing.T) { + tests := []struct { + have Interval + other Interval + contains bool + interiorContains bool + intersects bool + interiorIntersects bool + }{ + { + have: empty, + other: empty, + contains: true, + interiorContains: true, + intersects: false, + interiorIntersects: false, + }, + { + have: empty, + other: unit, + contains: false, + interiorContains: false, + intersects: false, + interiorIntersects: false, + }, + { + have: unit, + other: half, + contains: true, + interiorContains: true, + intersects: true, + interiorIntersects: true, + }, + { + have: unit, + other: unit, + contains: true, + interiorContains: false, + intersects: true, + interiorIntersects: true, + }, + { + have: unit, + other: empty, + contains: true, + interiorContains: true, + intersects: false, + interiorIntersects: false, + }, + { + have: unit, + other: negunit, + contains: false, + interiorContains: false, + intersects: true, + interiorIntersects: false, + }, + { + have: unit, + other: Interval{0, 0.5}, + contains: true, + interiorContains: false, + intersects: true, + interiorIntersects: true, + }, + { + have: half, + other: Interval{0, 0.5}, + contains: false, + interiorContains: false, + intersects: true, + interiorIntersects: false, + }, + } + + for _, test := range tests { + if got := test.have.ContainsInterval(test.other); got != test.contains { + t.Errorf("%v.ContainsInterval(%v) = %t, want %t", test.have, test.other, got, test.contains) + } + if got := test.have.InteriorContainsInterval(test.other); got != test.interiorContains { + t.Errorf("%v.InteriorContainsInterval(%v) = %t, want %t", test.have, test.other, got, test.interiorContains) + } + if got := test.have.Intersects(test.other); got != test.intersects { + t.Errorf("%v.Intersects(%v) = %t, want %t", test.have, test.other, got, test.intersects) + } + if got := test.have.InteriorIntersects(test.other); got != test.interiorIntersects { + t.Errorf("%v.InteriorIntersects(%v) = %t, want %t", test.have, test.other, got, test.interiorIntersects) + } + } +} + +func TestIntersection(t *testing.T) { + tests := []struct { + x, y Interval + want Interval + }{ + {unit, half, half}, + {unit, negunit, Interval{0, 0}}, + {negunit, half, empty}, + {unit, empty, empty}, + {empty, unit, empty}, + } + for _, test := range tests { + if got := test.x.Intersection(test.y); !got.Equal(test.want) { + t.Errorf("%v.Intersection(%v) = %v, want equal to %v", test.x, test.y, got, test.want) + } + } +} + +func TestUnion(t *testing.T) { + tests := []struct { + x, y Interval + want Interval + }{ + {Interval{99, 100}, empty, Interval{99, 100}}, + {empty, Interval{99, 100}, Interval{99, 100}}, + {Interval{5, 3}, Interval{0, -2}, empty}, + {Interval{0, -2}, Interval{5, 3}, empty}, + {unit, unit, unit}, + {unit, negunit, Interval{-1, 1}}, + {negunit, unit, Interval{-1, 1}}, + {half, unit, unit}, + } + for _, test := range tests { + if got := test.x.Union(test.y); !got.Equal(test.want) { + t.Errorf("%v.Union(%v) = %v, want equal to %v", test.x, test.y, got, test.want) + } + } +} + +func TestAddPoint(t *testing.T) { + tests := []struct { + interval Interval + point float64 + want Interval + }{ + {empty, 5, Interval{5, 5}}, + {Interval{5, 5}, -1, Interval{-1, 5}}, + {Interval{-1, 5}, 0, Interval{-1, 5}}, + {Interval{-1, 5}, 6, Interval{-1, 6}}, + } + for _, test := range tests { + if got := test.interval.AddPoint(test.point); !got.Equal(test.want) { + t.Errorf("%v.AddPoint(%v) = %v, want equal to %v", test.interval, test.point, got, test.want) + } + } +} + +func TestClampPoint(t *testing.T) { + tests := []struct { + interval Interval + clamp float64 + want float64 + }{ + {Interval{0.1, 0.4}, 0.3, 0.3}, + {Interval{0.1, 0.4}, -7.0, 0.1}, + {Interval{0.1, 0.4}, 0.6, 0.4}, + } + for _, test := range tests { + if got := test.interval.ClampPoint(test.clamp); got != test.want { + t.Errorf("%v.ClampPoint(%v) = %v, want equal to %v", test.interval, test.clamp, got, test.want) + } + } +} + +func TestExpanded(t *testing.T) { + tests := []struct { + interval Interval + margin float64 + want Interval + }{ + {empty, 0.45, empty}, + {unit, 0.5, Interval{-0.5, 1.5}}, + {unit, -0.5, Interval{0.5, 0.5}}, + {unit, -0.51, empty}, + } + for _, test := range tests { + if got := test.interval.Expanded(test.margin); !got.Equal(test.want) { + t.Errorf("%v.Expanded(%v) = %v, want equal to %v", test.interval, test.margin, got, test.want) + } + } +} + +func TestIntervalString(t *testing.T) { + i := Interval{2, 4.5} + if s, exp := i.String(), "[2.0000000, 4.5000000]"; s != exp { + t.Errorf("i.String() = %q, want %q", s, exp) + } +} + +func TestApproxEqual(t *testing.T) { + tests := []struct { + interval Interval + other Interval + want bool + }{ + // Empty intervals. + {EmptyInterval(), EmptyInterval(), true}, + {Interval{0, 0}, EmptyInterval(), true}, + {EmptyInterval(), Interval{0, 0}, true}, + {Interval{1, 1}, EmptyInterval(), true}, + {EmptyInterval(), Interval{1, 1}, true}, + {EmptyInterval(), Interval{0, 1}, false}, + {EmptyInterval(), Interval{1, 1 + 2*epsilon}, true}, + + // Singleton intervals. + {Interval{1, 1}, Interval{1, 1}, true}, + {Interval{1, 1}, Interval{1 - epsilon, 1 - epsilon}, true}, + {Interval{1, 1}, Interval{1 + epsilon, 1 + epsilon}, true}, + {Interval{1, 1}, Interval{1 - 3*epsilon, 1}, false}, + {Interval{1, 1}, Interval{1, 1 + 3*epsilon}, false}, + {Interval{1, 1}, Interval{1 - epsilon, 1 + epsilon}, true}, + {Interval{0, 0}, Interval{1, 1}, false}, + + // Other intervals. + {Interval{1 - epsilon, 2 + epsilon}, Interval{1, 2}, false}, + {Interval{1 + epsilon, 2 - epsilon}, Interval{1, 2}, true}, + {Interval{1 - 3*epsilon, 2 + epsilon}, Interval{1, 2}, false}, + {Interval{1 + 3*epsilon, 2 - epsilon}, Interval{1, 2}, false}, + {Interval{1 - epsilon, 2 + 3*epsilon}, Interval{1, 2}, false}, + {Interval{1 + epsilon, 2 - 3*epsilon}, Interval{1, 2}, false}, + } + + for _, test := range tests { + if got := test.interval.ApproxEqual(test.other); got != test.want { + t.Errorf("%v.ApproxEqual(%v) = %t, want %t", + test.interval, test.other, got, test.want) + } + } +} |
