9
9
10
10
# - Imports
11
11
12
- from ..jmath .linearalgebra import *
12
+ from ..jmath .linearalgebra import Vector , Point , Line
13
+ from .tools import random_integer , random_integers , repeat
14
+ from typing import Tuple , List
15
+ from math import sqrt
13
16
14
17
# - Functions
15
18
16
- def test_vector_arithmetic ():
17
- """Tests vector addition and subtraction"""
18
- # Add/Subtract
19
- added = Vector (1 , 2 ) + Vector (3 , 4 )
20
- subtracted = Vector (1 , 2 ) - Vector (3 , 4 )
21
- # Test Add
22
- excepted = Vector (4 , 6 )
23
- assert added == excepted
24
- # Test Subtract
25
- excepted = Vector (- 2 , - 2 )
26
- assert subtracted == excepted
19
+ def vector_component_pair (len : int = random_integer ()) -> Tuple [Vector , List [int ]]:
20
+ """
21
+ Generates a vector and component pair randomly.
22
+
23
+ Parameters
24
+ ----------
27
25
26
+ len
27
+ The length vector/components to generate
28
+ """
29
+ components = random_integers (len )
30
+ return (Vector (components ), components )
31
+
32
+ @repeat
33
+ def test_vector_equality ():
34
+ """Tests that vectors are equal as expected."""
35
+ v , c = vector_component_pair ()
36
+
37
+ assert v == v
38
+ assert v == Vector (c )
39
+ assert v .components == c
40
+ assert v != v .negative ()
41
+
42
+ @repeat
43
+ def test_vector_addition ():
44
+ """Tests vector addition."""
45
+ len = random_integer ()
46
+ v1 , c1 = vector_component_pair (len )
47
+ v2 , c2 = vector_component_pair (len )
48
+
49
+ expected = Vector ([i + j for i , j in zip (c1 , c2 )])
50
+
51
+ assert (v1 + v2 ) == expected
52
+
53
+ @repeat
54
+ def test_vector_subtraction ():
55
+ """Tests vector subtraction."""
56
+ len = random_integer ()
57
+ v1 , c1 = vector_component_pair (len )
58
+ v2 , c2 = vector_component_pair (len )
59
+
60
+ expected = Vector ([i - j for i , j in zip (c1 , c2 )])
61
+
62
+ assert (v1 - v2 ) == expected
63
+
64
+ @repeat
28
65
def test_vector_scaling ():
29
66
"""Tests vector multiplication and division"""
30
- # Divide/multiply
31
- multiplied = Vector (3 , 4 ) * 4
32
- divided = Vector (1 , 2 ) / 2
67
+ # Produce initial conditions
68
+ length = random_integer (min = 3 , max = 10 )
69
+ scalor = random_integer (min = 1 , max = 10 )
70
+ v , c = vector_component_pair (length )
71
+
72
+ # Mult/div vectors
73
+ mult = v * scalor
74
+ div = v / scalor
75
+
76
+ # Compute expected
77
+ mult_expected = Vector ([scalor * i for i in c ])
78
+ div_expected = Vector ([round (i / scalor , 5 ) for i in c ])
79
+
80
+ # Round division vector to factor out floating point error
81
+ div .components = [round (i , 5 ) for i in div .components ]
82
+
33
83
# Test multiply
34
- expected = Vector (12 , 16 )
35
- assert multiplied == expected
84
+ assert mult_expected == mult
36
85
# Test divide
37
- expected = Vector (1 / 2 , 1 )
38
- assert divided == expected
86
+ assert div_expected == div
39
87
88
+ @repeat
40
89
def test_dot_product ():
41
90
"""Tests the dot product"""
42
- dot = Vector (1 , 2 ) @ Vector (3 , 4 )
43
- expected = 1 * 3 + 2 * 4
44
- assert dot == expected
91
+ # Generate vectors and components
92
+ len = random_integer ()
93
+ v1 , c1 = vector_component_pair (len )
94
+ v2 , c2 = vector_component_pair (len )
95
+
96
+ # Compute dot product
97
+ dot = v1 @ v2
98
+
99
+ # Predict dot product
100
+ predicted_dot = sum ([i * j for i , j in zip (c1 , c2 )])
101
+
102
+ assert dot == predicted_dot
45
103
46
104
def test_projection ():
47
105
"""Tests projecting vectors"""
@@ -54,19 +112,24 @@ def test_projection():
54
112
line = Line (None , vec2 )
55
113
assert vec1 .projection (line ) == expected
56
114
115
+ @repeat
57
116
def test_magnitude ():
58
117
"""Tests vector magnitude"""
59
- vector = Vector (3 , 4 , 5 , - 2 )
60
- assert round (vector .magnitude (), 2 ) == 7.35
118
+
119
+ v , c = vector_component_pair ()
120
+
121
+ # Square components, sum, and sqrt
122
+ predicted_magnitude = sqrt (sum ([i ** 2 for i in c ]))
123
+
124
+ assert round (predicted_magnitude , 5 ) == round (v .magnitude (), 5 )
61
125
126
+ @repeat
62
127
def test_vector_size ():
63
128
"""Tests that a vector will return the correct size"""
64
- # Vector with six entries
65
- vector = Vector (1 , 2 , 3 , 4 , 5 , 6 )
66
- assert len (vector ) == 6
67
- # Vector with one entry
68
- vector = Vector (0 )
69
- assert len (vector ) == 1
129
+
130
+ v , c = vector_component_pair ()
131
+
132
+ assert len (v ) == len (c )
70
133
71
134
def test_point_in_line ():
72
135
"""Tests whether a point is in a line"""
@@ -92,11 +155,18 @@ def test_angle_between():
92
155
93
156
assert vec1 .angle_between (vec2 ) == 0
94
157
158
+ @repeat
95
159
def test_negative ():
96
160
"""Test that a negative vector does indeed give one with all the components reversed"""
97
- vec = Vector (1 , 2 ).negative ()
98
- expected_vec = Vector (- 1 , - 2 )
99
- assert vec == expected_vec
161
+
162
+ # Generate vector component pair
163
+ v , c = vector_component_pair ()
164
+ # Make negative vector
165
+ v = v .negative ()
166
+ # Make components negative
167
+ c = Vector ([- i for i in c ])
168
+
169
+ assert v == c
100
170
101
171
def test_unit_vector ():
102
172
"""Tests that a unit vector is produced correctly"""
0 commit comments