def test_two_vectors(arrays): array_a, array_b = arrays vector_a = Vector(array_a) is_perpendicular = vector_a.is_perpendicular(array_b) is_parallel = vector_a.is_parallel(array_b) # Two non-zero vectors cannot be both perpendicular and parallel. assert not (is_perpendicular and is_parallel) angle = vector_a.angle_between(array_b) if is_perpendicular: assert math.isclose(angle, np.pi / 2) if is_parallel: assert math.isclose(angle, 0, abs_tol=ATOL) or math.isclose( angle, np.pi, rel_tol=1e-6) # The zero vector is perpendicular and parallel to any other vector. vector_zero = np.zeros(vector_a.size) assert vector_a.is_perpendicular(vector_zero) assert vector_a.is_parallel(vector_zero) # The angle with the zero vector is undefined. message_expected = "The vectors must have non-zero magnitudes." with pytest.raises(ValueError, match=message_expected): vector_a.angle_between(vector_zero) # The projection of vector B onto A is parallel to A. vector_b_projected = vector_a.project_vector(array_b) assert vector_a.is_parallel(vector_b_projected) # The projection is zero if vectors A and B are perpendicular. if is_perpendicular: assert vector_b_projected.is_zero(abs_tol=ATOL)
def test_is_perpendicular(array_u, array_v, bool_expected): """Test checking if vector u is perpendicular to vector v.""" vector_u = Vector(array_u) assert vector_u.is_perpendicular(array_v) == bool_expected