kmath/tests/linea.py

174 lines
4.4 KiB
Python

import sys
import numpy
import pytest
import kmath.linea as vec
def fequal(a, b):
eq = numpy.isclose(a, b, vec.EQUALITY_TOLERANCE)
if isinstance(eq, numpy.ndarray):
return eq.all()
return eq
def test_equality():
v1 = vec.Vector(1, 2, 3)
v2 = vec.Vector(1, 2)
v3 = vec.Vector(1, 2, 3)
v4 = vec.Vector(3, 4, 5)
assert (v1 == v3)
with pytest.raises(vec.NonConformantVectors):
assert v1 != v2
assert (v1 != v4)
# Video 4
def test_basic_operations():
v1 = vec.Vector(8.218, -9.341)
v2 = vec.Vector(-1.129, 2.111)
v3 = vec.Vector(7.089, -7.230)
assert (v1 + v2 == v3)
v1 = vec.Vector(7.119, 8.215)
v2 = vec.Vector(-8.223, 0.878)
v3 = vec.Vector(15.3420, 7.3370)
assert (v1 - v2 == v3)
v1 = vec.Vector(1.671, -1.012, -0.318)
k = 7.41
v2 = vec.Vector(12.3821, -7.4989, -2.3564)
assert (k * v1 == v2)
assert (v1 * k == v2)
# Video 6
def test_magnitude():
v1 = vec.Vector(-0.221, 7.437)
assert (fequal(v1.magnitude(), 7.4403))
v2 = vec.Vector(5.581, -2.136)
unit = vec.Vector(0.933935214087, -0.357442325262)
assert (v2.unit() == unit)
v3 = vec.Vector(8.813, -1.331, -6.247)
assert (fequal(v3.magnitude(), 10.8842))
v4 = vec.Vector(1.996, 3.108, -4.554)
unit = vec.Vector(.340401295943, 0.530043701298, -0.776647044953)
assert (v4.unit() == unit)
v5 = vec.Vector(0, 0, 0)
with pytest.raises(ValueError):
v5.unit()
# Video 8
def test_dot_product():
v1 = vec.Vector(1, 2, -1)
v2 = vec.Vector(3, 1, 0)
assert (fequal(vec.dot(v1, v2), 5))
assert (fequal(v1.dot(v2), 5))
v1 = vec.Vector(7.887, 4.138)
v2 = vec.Vector(-8.802, 6.776)
assert (fequal(vec.dot(v1, v2), -41.382))
v3 = vec.Vector(-5.955, -4.904, -1.874)
v4 = vec.Vector(-4.496, -8.755, 7.103)
assert (fequal(vec.dot(v3, v4), 56.3971))
v5 = vec.Vector(3.183, -7.627)
v6 = vec.Vector(-2.668, 5.319)
assert (fequal(vec.angle(v5, v6), 3.072))
v7 = vec.Vector(7.35, 0.221, 5.188)
v8 = vec.Vector(2.751, 8.259, 3.985)
theta = vec.angle(v7, v8, in_degrees=True)
assert (fequal(theta, 60.2758))
v9 = vec.Vector(0, 0)
with pytest.raises(ValueError):
v1.angle_with(v9)
# Video 10.
def test_parallel_orthogonal():
v1 = vec.Vector(-7.579, -7.88)
v2 = vec.Vector(22.737, 23.64)
assert (v1.parallel_to(v2))
assert (not v1.orthogonal_to(v2))
v3 = vec.Vector(-2.029, 9.97, 4.172)
v4 = vec.Vector(-9.231, -6.639, -7.245)
assert (not v3.parallel_to(v4))
assert (not v3.orthogonal_to(v4))
v5 = vec.Vector(-2.328, -7.284, -1.214)
v6 = vec.Vector(-1.821, 1.072, -2.94)
assert (not v5.parallel_to(v6))
assert (v5.orthogonal_to(v6))
v7 = vec.Vector(2.118, 4.827)
v8 = vec.Vector(0, 0)
assert v7.parallel_to(v8)
assert v7.orthogonal_to(v8)
# Video 12
def test_projection():
# sanity check
v1 = vec.Vector(1, 3)
v2 = vec.Vector(3, 3)
v3 = v1.project_parallel(v2)
v4 = v1.project_orthogonal(v2)
assert v3 + v4 == v1
v1 = vec.Vector(3.039, 1.879)
v2 = vec.Vector(0.825, 2.036)
v3 = vec.Vector(1.0826, 2.6717)
assert v1.project_parallel(v2) == v3
v4 = vec.Vector(-9.88, -3.264, -8.159)
v5 = vec.Vector(-2.155, -9.353, -9.473)
v6 = vec.Vector(-8.350, 3.376, -1.434)
assert v4.project_orthogonal(v5) == v6
v7 = vec.Vector(3.009, -6.172, 3.692, -2.510)
v8 = vec.Vector(6.404, -9.144, 2.759, 8.718)
v9 = vec.Vector(1.969, -2.811, 0.848, 2.680)
assert v7.project_parallel(v8) == v9
v10 = vec.Vector(1.040, -3.361, 2.844, -5.190)
assert v7.project_orthogonal(v8) == v10
assert (v9 + v10) == v7
def test_cross_product():
# sanity check
v1 = vec.Vector(5, 3, -2)
v2 = vec.Vector(-1, 0, 3)
v3 = vec.Vector(9, -13, 3)
assert vec.cross(v1, v2) == v3
v1 = vec.Vector(8.462, 7.893, -8.187)
v2 = vec.Vector(6.984, -5.975, 4.778)
v3 = vec.Vector(-11.205, -97.609, -105.685)
assert vec.cross(v1, v2) == v3
v4 = vec.Vector(-8.987, -9.838, 5.031)
v5 = vec.Vector(-4.268, -1.861, -8.866)
area = 142.122
assert fequal(vec.area_parallelogram(v4, v5), area)
v6 = vec.Vector(1.500, 9.547, 3.691)
v7 = vec.Vector(-6.007, 0.124, 5.772)
area = 42.565
assert fequal(vec.area_triangle(v6, v7), area)
if __name__ == '__main__':
sys.exit(pytest.main(["-qq"]))