def _get_root_units(self, input_units, check_nonmult=True): if not input_units: return Decimal('1'), UnitsContainer() # The cache is only done for check_nonmult=True if check_nonmult and input_units in self._root_units_cache: return self._root_units_cache[input_units] accumulators = [Decimal('1'), defaultdict(Decimal)] self._get_root_units_recurse(input_units, Decimal('1'), accumulators) factor = accumulators[0] units = UnitsContainer(dict( (k, v) for k, v in accumulators[1].items() if v != Decimal('0'))) if check_nonmult: for unit in units.keys(): if not self._units[unit].converter.is_multiplicative: return None, units if check_nonmult: self._root_units_cache[input_units] = factor, units return factor, units
def test_unitcontainer_arithmetic(self): x = UnitsContainer(meter=1) y = UnitsContainer(second=1) z = UnitsContainer(meter=1, second=-2) self._test_not_inplace(op.mul, x, y, UnitsContainer(meter=1, second=1)) self._test_not_inplace(op.truediv, x, y, UnitsContainer(meter=1, second=-1)) self._test_not_inplace(op.pow, z, 2, UnitsContainer(meter=2, second=-4)) self._test_not_inplace(op.pow, z, -2, UnitsContainer(meter=-2, second=4)) self._test_inplace(op.imul, x, y, UnitsContainer(meter=1, second=1)) self._test_inplace(op.itruediv, x, y, UnitsContainer(meter=1, second=-1)) self._test_inplace(op.ipow, z, 2, UnitsContainer(meter=2, second=-4)) self._test_inplace(op.ipow, z, -2, UnitsContainer(meter=-2, second=4))
def test_dict_conversion(self): assert to_units_container(dict(m=1)) == UnitsContainer(m=1)
def test_quantity_conversion(self): from pint.registry import UnitRegistry ureg = UnitRegistry() assert to_units_container(ureg.Quantity( 1, UnitsContainer(m=1))) == UnitsContainer(m=1)
def test_str_conversion(self): assert to_units_container("m") == UnitsContainer(m=1)
def test_baseunit_definition(self): x = Definition.from_string("meter = [length]") self.assertIsInstance(x, UnitDefinition) self.assertTrue(x.is_base) self.assertEqual(x.reference, UnitsContainer({"[length]": 1}))
def test_convert_parse_str(self): ureg = self.ureg self.assertEqual( ureg.convert(1, 'meter', 'inch'), ureg.convert(1, UnitsContainer(meter=1), UnitsContainer(inch=1)))
def test_unit_repr(self): x = self.U_(UnitsContainer(meter=1)) self.assertEqual(str(x), 'meter') self.assertEqual(repr(x), "<Unit('meter')>")
def test_parse_single(self): self.assertEqual(self.ureg.parse_expression("meter"), self.Q_(1, UnitsContainer(meter=1.0))) self.assertEqual(self.ureg.parse_expression("second"), self.Q_(1, UnitsContainer(second=1.0)))
def test_dimensionality(self): x = self.U_("m") self.assertEqual(x.dimensionality, UnitsContainer({"[length]": 1}))
def test_parse_mul_div(self): self.assertEqual(self.ureg.parse_expression('meter*meter'), self.Q_(1, UnitsContainer(meter=2.))) self.assertEqual(self.ureg.parse_expression('meter**2'), self.Q_(1, UnitsContainer(meter=2.))) self.assertEqual(self.ureg.parse_expression('meter*second'), self.Q_(1, UnitsContainer(meter=1., second=1))) self.assertEqual(self.ureg.parse_expression('meter/second'), self.Q_(1, UnitsContainer(meter=1., second=-1))) self.assertEqual(self.ureg.parse_expression('meter/second**2'), self.Q_(1, UnitsContainer(meter=1., second=-2)))
def test_convert_parse_str(self): ureg = self.ureg assert ureg.convert(1, "meter", "inch") == ureg.convert( 1, UnitsContainer(meter=1), UnitsContainer(inch=1) )
def test_unit_repr(self): x = self.U_(UnitsContainer(meter=1)) assert str(x) == "meter" assert repr(x) == "<Unit('meter')>"
def test_parse_prefix(self): assert self.ureg.parse_expression("kilometer") == self.Q_( 1, UnitsContainer(kilometer=1.0) )
def test_parse_plural(self): assert self.ureg.parse_expression("meters") == self.Q_( 1, UnitsContainer(meter=1.0) )
def test_parse_complex(self): self.assertEqual(self.ureg.parse_expression('kilometre'), self.Q_(1, UnitsContainer(kilometer=1.))) self.assertEqual(self.ureg.parse_expression('kilometres'), self.Q_(1, UnitsContainer(kilometer=1.)))
def test_parse_alias(self): self.assertEqual(self.ureg.parse_expression("metre"), self.Q_(1, UnitsContainer(meter=1.0)))
def test_parse_factor(self): self.assertEqual(self.ureg.parse_expression('42*meter'), self.Q_(42, UnitsContainer(meter=1.))) self.assertEqual(self.ureg.parse_expression('meter*42'), self.Q_(42, UnitsContainer(meter=1.)))
def test_convert_parse_str(self): ureg = self.ureg self.assertEqual( ureg.convert(1, "meter", "inch"), ureg.convert(1, UnitsContainer(meter=1), UnitsContainer(inch=1)), )
def test_baseunit_definition(self): x = Definition.from_string("meter = [length]") assert isinstance(x, UnitDefinition) assert x.is_base assert x.reference == UnitsContainer({"[length]": 1})
def test_dimensionality(self): x = self.U_('m') self.assertEqual(x.dimensionality, UnitsContainer({'[length]': 1}))
def test_invalid(self): with pytest.raises(TypeError): UnitsContainer({1: 2}) with pytest.raises(TypeError): UnitsContainer({"1": "2"}) d = UnitsContainer() with pytest.raises(TypeError): d.__mul__(list()) with pytest.raises(TypeError): d.__pow__(list()) with pytest.raises(TypeError): d.__truediv__(list()) with pytest.raises(TypeError): d.__rtruediv__(list())
def test_creation(self): for arg in ('meter', UnitsContainer(meter=1), self.U_('m')): self.assertEqual(self.U_(arg)._units, UnitsContainer(meter=1)) self.assertRaises(TypeError, self.U_, 1)
def test_uc_conversion(self): a = UnitsContainer(m=1) assert to_units_container(a) is a
def test_deepcopy(self): x = self.U_(UnitsContainer(meter=1)) self.assertEqual(x, copy.deepcopy(x))
def test_unit_conversion(self): from pint import Unit assert to_units_container(Unit( UnitsContainer(m=1))) == UnitsContainer(m=1)
def test_parse_single(self): self.assertEqual(self.ureg.parse_expression('meter'), self.Q_(1, UnitsContainer(meter=1.))) self.assertEqual(self.ureg.parse_expression('second'), self.Q_(1, UnitsContainer(second=1.)))
def test_unitcontainer_bool(self): assert UnitsContainer(meter=1, second=2) assert not UnitsContainer()
def test_parse_plural(self): self.assertEqual(self.ureg.parse_expression('meters'), self.Q_(1, UnitsContainer(meter=1.)))
def test_parse_prefix(self): self.assertEqual(self.ureg.parse_expression('kilometer'), self.Q_(1, UnitsContainer(kilometer=1.)))
def test_parse_alias(self): assert self.ureg.parse_expression("metre") == self.Q_( 1, UnitsContainer(meter=1.0) )