157 lines
3.7 KiB
Go
157 lines
3.7 KiB
Go
|
|
package geo
|
||
|
|
|
||
|
|
import (
|
||
|
|
"math"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/stretchr/testify/assert"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestExtendVerticalLineSegments(t *testing.T) {
|
||
|
|
p1 := &Point{0, 0}
|
||
|
|
p2 := &Point{0, 1}
|
||
|
|
|
||
|
|
v := p1.VectorTo(p2)
|
||
|
|
v = v.Multiply(2)
|
||
|
|
p2New := p1.AddVector(v)
|
||
|
|
expected := Point{0, 2}
|
||
|
|
assert.Equal(t, expected, *p2New)
|
||
|
|
|
||
|
|
v = p2.VectorTo(p1)
|
||
|
|
v = v.Multiply(2)
|
||
|
|
p1New := p2.AddVector(v)
|
||
|
|
expected = Point{0, -1}
|
||
|
|
assert.Equal(t, expected, *p1New)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestExtendHorizontalLineSegment(t *testing.T) {
|
||
|
|
p1 := &Point{0, 0}
|
||
|
|
p2 := &Point{1, 0}
|
||
|
|
|
||
|
|
v := p1.VectorTo(p2)
|
||
|
|
v = v.Multiply(1.5)
|
||
|
|
p2New := p1.AddVector(v)
|
||
|
|
expected := Point{1.5, 0}
|
||
|
|
assert.Equal(t, expected, *p2New)
|
||
|
|
|
||
|
|
v = p2.VectorTo(p1)
|
||
|
|
v = v.Multiply(1.5)
|
||
|
|
p1New := p2.AddVector(v)
|
||
|
|
expected = Point{-0.5, 0}
|
||
|
|
assert.Equal(t, expected, *p1New)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestExtendDiagonalLineSegment(t *testing.T) {
|
||
|
|
p1 := &Point{0, 0}
|
||
|
|
p2 := &Point{3, 1}
|
||
|
|
|
||
|
|
v := p1.VectorTo(p2)
|
||
|
|
v = v.Multiply(2)
|
||
|
|
p2New := p1.AddVector(v)
|
||
|
|
expected := Point{6, 2}
|
||
|
|
assert.Equal(t, expected, *p2New)
|
||
|
|
|
||
|
|
v = p2.VectorTo(p1)
|
||
|
|
v = v.Multiply(2)
|
||
|
|
p1New := p2.AddVector(v)
|
||
|
|
expected = Point{-3, -1}
|
||
|
|
assert.Equal(t, expected, *p1New)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorAdd(t *testing.T) {
|
||
|
|
a := NewVector(1, 2)
|
||
|
|
b := NewVector(3, 4)
|
||
|
|
|
||
|
|
c := a.Add(b)
|
||
|
|
|
||
|
|
assert.Truef(t, c.equals(NewVector(4, 6)), "Expected Vector %v to be (4, 6)", c)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorMinus(t *testing.T) {
|
||
|
|
a := NewVector(1, 2)
|
||
|
|
b := NewVector(3, 4)
|
||
|
|
|
||
|
|
c := a.Minus(b)
|
||
|
|
|
||
|
|
assert.Truef(t, c.equals(NewVector(-2, -2)), "Expected Vector %v to be (-2, -2)", c)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorMultiply(t *testing.T) {
|
||
|
|
a := NewVector(1, 2)
|
||
|
|
|
||
|
|
c := a.Multiply(3)
|
||
|
|
|
||
|
|
assert.Truef(t, c.equals(NewVector(3, 6)), "Expected Vector %v to be (3, 6)", c)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorLength(t *testing.T) {
|
||
|
|
a := NewVector(3, 4)
|
||
|
|
|
||
|
|
assert.Equal(t, 5.0, a.Length())
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestNewVectorFromProperties(t *testing.T) {
|
||
|
|
a := NewVectorFromProperties(3, math.Pi/3) // 60 degrees
|
||
|
|
if !a.equals(NewVector(2.59807621135, 1.5)) {
|
||
|
|
t.Errorf("expected Vector to be close to (2.59807, 1.5), got %v", a)
|
||
|
|
}
|
||
|
|
|
||
|
|
b := NewVectorFromProperties(3, -math.Pi/3) // -60 degrees
|
||
|
|
if !b.equals(NewVector(-2.59807621135, 1.5)) {
|
||
|
|
t.Errorf("expected Vector to be close to (-2.59807, 1.5), got %v", b)
|
||
|
|
}
|
||
|
|
|
||
|
|
c := NewVectorFromProperties(3, math.Pi*2/3) // 120 degrees
|
||
|
|
if !c.equals(NewVector(2.59807621135, -1.5)) {
|
||
|
|
t.Errorf("expected Vector to be close to (2.59807, -1.5), got %v", c)
|
||
|
|
}
|
||
|
|
|
||
|
|
d := NewVectorFromProperties(3, -math.Pi*2/3) // -120 degrees
|
||
|
|
if !d.equals(NewVector(-2.59807621135, -1.5)) {
|
||
|
|
t.Errorf("expected Vector to be close to (-2.59807, -1.5), got %v", c)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorUnit(t *testing.T) {
|
||
|
|
a := NewVector(3, 4).Unit()
|
||
|
|
expected := NewVector(3.0/5, 4.0/5)
|
||
|
|
assert.Truef(t, a.equals(expected), "Expected (%f, %f) Vector, got %v", 3/5.0, 4/5.0, a)
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorAddLength(t *testing.T) {
|
||
|
|
a := NewVector(3, 4)
|
||
|
|
b := a.AddLength(8)
|
||
|
|
|
||
|
|
if PrecisionCompare(b.Length(), 13.0, PRECISION) != 0 {
|
||
|
|
t.Fatalf("Expected new Vector to have length 13, got %v", b.Length())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorEquals(t *testing.T) {
|
||
|
|
a := NewVector(1, 2)
|
||
|
|
assert.True(t, a.equals(a), "Expected Vector to be equal to itself")
|
||
|
|
assert.True(t, a.equals(NewVector(1.0, 2.0)), "Expected Vector to be equal to different Vector with same components")
|
||
|
|
assert.False(t, a.equals(NewVector(1, 2, 3)), "Expected Vector to be different if different component count")
|
||
|
|
assert.False(t, a.equals(NewVector(2, 2)), "Expected Vector to be different if components are different")
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestVectorToPoint(t *testing.T) {
|
||
|
|
v := NewVector(3.789, -0.731)
|
||
|
|
p := v.ToPoint()
|
||
|
|
|
||
|
|
assert.Equal(t, v[0], p.X)
|
||
|
|
assert.Equal(t, v[1], p.Y)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (a Vector) equals(other Vector) bool {
|
||
|
|
if len(a) != len(other) {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
for i := 0; i < len(a); i++ {
|
||
|
|
if PrecisionCompare(a[i], other[i], PRECISION) != 0 {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true
|
||
|
|
}
|