def test_v3_mul(): xyz = V3(1, 2, 3) * si.meters assert make(V3(2, 4, 6), si.meters).approx(xyz * 2) assert make(V3(2, 4, 6), si.meters).approx(2 * xyz) with pytest.raises(TypeError): xyz * xyz
def test_create_and_extract(): mass = make(100, SIUnit.Unit(kg=1)) acceleration = make(1, SIUnit.Unit(m=1, s=-2)) force = 100 * si.newtons assert force.quantity == 100 assert force.get_as(si.kilonewtons) == 0.1 assert force == mass * acceleration
def test_qv2_unit(): qv2 = make(V2(100, 0), si.meters) assert make(V2(1, 0), si.unity) == qv2.unit() qv2 = qv2.cvt_to(si.millimeters) assert make(V2(1, 0), si.unity) == qv2.unit() assert qv2 == abs(qv2) * qv2.unit()
def test_qv2_is_orthogonal(): qv2 = make(V2(1, 1), si.meters) assert qv2.is_orthogonal(make(V2(-1, 1), si.meters)) assert qv2.is_orthogonal(V2(-1, 1)) assert not qv2.is_orthogonal(make(V2(1, 0), si.meters)) assert not qv2.is_orthogonal(V2(1, 0)) with pytest.raises(TypeError): V2(1, 0).is_orthogonal(qv2)
def test_qv2_rotate(): vector = V2(1, 0) qv2 = make(vector, si.meters) qv2 = qv2.rotate(eta * si.radians) assert make(V2(0, 1), si.meters).approx(qv2) qv2 = qv2.rotate(eta * si.radians) assert make(V2(-1, 0), si.meters).approx(qv2) qv2 = qv2.rotate(eta * si.radians) assert make(V2(0, -1), si.meters).approx(qv2)
def test_qv2_angle(): qv_x = make(V2(1, 0), si.meters) qv_y = make(V2(0, 1), si.meters) qv_xy = make(V2(1, 1), si.meters) assert pytest.approx(eta) == qv_x.angle(qv_y).get_as(si.radians) assert pytest.approx(eta / 2) == qv_x.angle(qv_xy).get_as(si.radians) assert pytest.approx(eta / 2) == qv_y.angle(qv_xy).get_as(si.radians) assert pytest.approx(eta) == qv_x.angle(V2(0, 1)).get_as(si.radians) with pytest.raises(TypeError): V2(0, 1).angle(qv_x)
def test_v3_sub(): xyz = V3(1, 2, 3) * si.meters assert make(V3(0, 0, 0), si.meters).approx(xyz - xyz) with pytest.raises(TypeError): xyz - V3(1, 2, 3)
def test_v3_add(): xyz = V3(1, 2, 3) * si.meters assert make(V3(2, 4, 6), si.meters).approx(xyz + xyz) with pytest.raises(TypeError): xyz + V3(1, 2, 3)
def test_qv2_div(): qv2 = make(V2(11, 21), si.meters) div_value = qv2 / 2 assert V2(5.5, 10.5).approx(div_value.get_as(si.meters)) qv2 /= 2 assert V2(5.5, 10.5).approx(qv2.get_as(si.meters))
def test_qv2_is_parallel(): qv2 = make(V2(1, 1), si.meters) assert qv2.is_parallel(make(V2(2, 2), si.meters)) assert qv2.is_parallel(make(V2(-1, -1), si.meters)) assert not qv2.is_parallel(make(V2(1, 0), si.meters)) assert not qv2.is_parallel(make(V2(0, 1), si.meters)) assert qv2.is_parallel(V2(2, 2)) assert qv2.is_parallel(V2(-1, -1)) assert not qv2.is_parallel(V2(1, 0)) assert not qv2.is_parallel(V2(0, 1)) with pytest.raises(TypeError): V2(1, 1).is_parallel(qv2)
def test_v3_div(): xyz = V3(2, 4, 6) * si.meters assert make(V3(1, 2, 3), si.meters).approx(xyz / 2) with pytest.raises(TypeError): 2 / xyz with pytest.raises(TypeError): xyz / None
def test_qv2_mul(): qv2 = make(V2(3, 4), si.meters) mul_value = qv2 * 2 assert V2(6, 8).approx(mul_value.get_as(si.meters)) mul_value = 2 * qv2 assert V2(6, 8).approx(mul_value.get_as(si.meters)) qv2 *= 2 assert V2(6, 8).approx(qv2.get_as(si.meters))
def test_create(): xyz = make(V3(1, 2, 3), si.meters) assert V3(1, 2, 3) * si.meters == xyz assert V3(1, 2, 3) == xyz.get_as(si.meters) assert V3(1000, 2000, 3000) == xyz.get_as(si.millimeters) assert V2(1, 2) * si.meters == xyz.xy() assert V2(2, 3) * si.meters == xyz.yz() assert V2(1, 3) * si.meters == xyz.xz()
def test_q_np(): distances = make(np.array([1, 2, 3, 4, 5, 6, 7]), si.meters) distances *= 2 value = distances.get_as(si.meters) assert np.array_equal(value, np.array([2, 4, 6, 8, 10, 12, 14])) assert distances[0].approx(2 * si.meters) assert distances[6].approx(14 * si.meters) assert min(distances).approx(2 * si.meters) assert max(distances).approx(14 * si.meters)
def test_qv2_create(): vector = V2(1, 0) vector_q = make(vector, si.meters) assert vector == vector_q.get_as(si.meters) assert V2(1000, 0) == vector_q.get_as(si.millimeters) vector_q = vector * si.meters assert vector == vector_q.get_as(si.meters) vector_q = si.meters * vector assert vector == vector_q.get_as(si.meters)
def test_q_matmul(): from operator import matmul distances = make(np.array([1, 2, 3]), si.meters) value = matmul(distances, distances) assert value.get_as(si.meters ** 2) == 14 value = matmul(distances, np.array([1, 2, 3])) assert value.get_as(si.meters ** 1) == 14 with pytest.raises(TypeError): # numpy really should just return NotImplemented instead of throwing a TypeError value = matmul(np.array([1, 2, 3]), distances) assert value.get_as(si.meters ** 1) == 14
def test_q_copying(): a = 100 * si.meters b = copy(a) c = deepcopy(a) assert a is not b assert a is not c assert a == b assert a == c class Ref: def __init__(self, value): self.value = value def __eq__(self, other): return self.value == other.value ref = Ref(100) ref_ref = Ref(Ref(100)) rq = make(ref, si.meters) rc = copy(rq) assert rq == rc assert rq is not rc rqq = make(ref_ref, si.meters) rqc = copy(rqq) rqd = deepcopy(rqq) assert rqq is not rqc assert rqq == rqc ref_ref.value.value = 50 assert rqq == rqc assert rqq != rqd
def test_qv2_manhattan_dinstance(): qv2 = make(V2(10, 10), si.meters) assert 20 == qv2.manhattan_distance().get_as(si.meters) assert 20000 == qv2.manhattan_distance().get_as(si.millimeters)
def test_qv2_magnitude(): qv2 = make(V2(3, 4), si.meters) assert 5 == qv2.magnitude().get_as(si.meters)
def test_qv2_cross_product(): qv2 = make(V2(1, 1), si.meters) cross_product = qv2.cross(qv2) assert not isinstance(cross_product, V2Quantity) assert 0 == cross_product.get_as(si.meters**2)
def test_qv2_dot_product(): qv2 = make(V2(3, 4), si.meters) dot_product = qv2.dot(qv2) assert not isinstance(dot_product, V2Quantity) assert 25 == dot_product.get_as(si.meters**2)
def angle(self, other): if not hasattr(other, "quantity"): return make(self.quantity.angle(other), si.radians) return make(self.quantity.angle(other.quantity), si.radians)
def unit(self): return make(self.quantity.unit(), si.unity)
def test_v3_cross(): x = V3(1, 0, 0) * si.meters y = V3(0, 1, 0) * si.meters assert make(V3(0, 0, 1), si.meters**2).approx(x.cross(y)) assert make(V3(0, 0, -1), si.meters**2).approx(y.cross(x))
def cross(self, other): return make(self.quantity.cross(other.quantity), self.units * other.units)
def magnitude(self): return make(self.quantity.magnitude(), self.units)
def manhattan_distance(self): return make(self.quantity.manhattan_distance(), self.units)
def dot(self, other): return make(self.quantity.dot(other.quantity), self.units * other.units)
def rotate(self, angle): return make(self.quantity.rotate(angle.get_as(si.radians)), self.units)