1from sympy.physics.units import DimensionSystem, joule, second, ampere
2from sympy.testing.pytest import warns_deprecated_sympy
3
4from sympy import Rational, S
5from sympy.physics.units.definitions import c, kg, m, s
6from sympy.physics.units.definitions.dimension_definitions import length, time
7from sympy.physics.units.quantities import Quantity
8from sympy.physics.units.unitsystem import UnitSystem
9
10
11def test_definition():
12    # want to test if the system can have several units of the same dimension
13    dm = Quantity("dm")
14    base = (m, s)
15    # base_dim = (m.dimension, s.dimension)
16    ms = UnitSystem(base, (c, dm), "MS", "MS system")
17    ms.set_quantity_dimension(dm, length)
18    ms.set_quantity_scale_factor(dm, Rational(1, 10))
19
20    assert set(ms._base_units) == set(base)
21    assert set(ms._units) == {m, s, c, dm}
22    # assert ms._units == DimensionSystem._sort_dims(base + (velocity,))
23    assert ms.name == "MS"
24    assert ms.descr == "MS system"
25
26
27def test_str_repr():
28    assert str(UnitSystem((m, s), name="MS")) == "MS"
29    assert str(UnitSystem((m, s))) == "UnitSystem((meter, second))"
30
31    assert repr(UnitSystem((m, s))) == "<UnitSystem: (%s, %s)>" % (m, s)
32
33
34def test_print_unit_base():
35    A = Quantity("A")
36    A.set_global_relative_scale_factor(S.One, ampere)
37
38    Js = Quantity("Js")
39    Js.set_global_relative_scale_factor(S.One, joule*second)
40
41    mksa = UnitSystem((m, kg, s, A), (Js,))
42    with warns_deprecated_sympy():
43        assert mksa.print_unit_base(Js) == m**2*kg*s**-1/1000
44
45
46def test_extend():
47    ms = UnitSystem((m, s), (c,))
48    Js = Quantity("Js")
49    Js.set_global_relative_scale_factor(1, joule*second)
50    mks = ms.extend((kg,), (Js,))
51
52    res = UnitSystem((m, s, kg), (c, Js))
53    assert set(mks._base_units) == set(res._base_units)
54    assert set(mks._units) == set(res._units)
55
56
57def test_dim():
58    dimsys = UnitSystem((m, kg, s), (c,))
59    assert dimsys.dim == 3
60
61
62def test_is_consistent():
63    dimension_system = DimensionSystem([length, time])
64    us = UnitSystem([m, s], dimension_system=dimension_system)
65    assert us.is_consistent == True
66