def test_parse_simple(self): a = Context.__keytransform__(UnitsContainer({'[time]': -1}), UnitsContainer({'[length]': 1})) b = Context.__keytransform__(UnitsContainer({'[length]': 1}), UnitsContainer({'[time]': -1})) s = ['@context longcontextname', '[length] -> 1 / [time]: c / value', '1 / [time] -> [length]: c / value'] c = Context.from_lines(s) self.assertEqual(c.name, 'longcontextname') self.assertEqual(c.aliases, ()) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) s = ['@context longcontextname = lc', '[length] <-> 1 / [time]: c / value'] c = Context.from_lines(s) self.assertEqual(c.name, 'longcontextname') self.assertEqual(c.aliases, ('lc', )) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) s = ['@context longcontextname = lc = lcn', '[length] <-> 1 / [time]: c / value'] c = Context.from_lines(s) self.assertEqual(c.name, 'longcontextname') self.assertEqual(c.aliases, ('lc', 'lcn', )) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c)
def test_parse_parameterized(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1.0}), UnitsContainer({"[length]": 1.0})) b = Context.__keytransform__(UnitsContainer({"[length]": 1.0}), UnitsContainer({"[time]": -1.0})) s = [ "@context(n=1) longcontextname", "[length] <-> 1 / [time]: n * c / value" ] c = Context.from_lines(s) self.assertEqual(c.defaults, {"n": 1}) self.assertEqual(c.funcs.keys(), {a, b}) self._test_ctx(c) s = [ "@context(n=1, bla=2) longcontextname", "[length] <-> 1 / [time]: n * c / value / bla", ] c = Context.from_lines(s) self.assertEqual(c.defaults, {"n": 1, "bla": 2}) self.assertEqual(c.funcs.keys(), {a, b}) # If the variable is not present in the definition, then raise an error s = [ "@context(n=1) longcontextname", "[length] <-> 1 / [time]: c / value" ] self.assertRaises(DefinitionSyntaxError, Context.from_lines, s)
def test_parse_simple(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1}), UnitsContainer({"[length]": 1})) b = Context.__keytransform__(UnitsContainer({"[length]": 1}), UnitsContainer({"[time]": -1})) s = ["@context longcontextname", "[length] -> 1 / [time]: c / value", "1 / [time] -> [length]: c / value"] c = Context.from_lines(s) self.assertEqual(c.name, "longcontextname") self.assertEqual(c.aliases, ()) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) s = ["@context longcontextname = lc", "[length] <-> 1 / [time]: c / value"] c = Context.from_lines(s) self.assertEqual(c.name, "longcontextname") self.assertEqual(c.aliases, ("lc",)) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) s = ["@context longcontextname = lc = lcn", "[length] <-> 1 / [time]: c / value"] c = Context.from_lines(s) self.assertEqual(c.name, "longcontextname") self.assertEqual(c.aliases, ("lc", "lcn")) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c)
def test_parse_parameterized(self): a = Context.__keytransform__(UnitsContainer({'[time]': -1.}), UnitsContainer({'[length]': 1.})) b = Context.__keytransform__(UnitsContainer({'[length]': 1.}), UnitsContainer({'[time]': -1.})) s = [ '@context(n=1) longcontextname', '[length] <-> 1 / [time]: n * c / value' ] c = Context.from_lines(s) self.assertEqual(c.defaults, {'n': 1}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) s = [ '@context(n=1, bla=2) longcontextname', '[length] <-> 1 / [time]: n * c / value / bla' ] c = Context.from_lines(s) self.assertEqual(c.defaults, {'n': 1, 'bla': 2}) self.assertEqual(set(c.funcs.keys()), set((a, b))) # If the variable is not present in the definition, then raise an error s = [ '@context(n=1) longcontextname', '[length] <-> 1 / [time]: c / value' ] self.assertRaises(ValueError, Context.from_lines, s)
def test_err_redefine_alias(self): for s in ("foo = bar = f", "foo = bar = _ = baz"): with self.subTest(s): with self.assertRaises(DefinitionSyntaxError) as e: Context.from_lines(["@context c", s]) self.assertEqual( str(e.exception), "Can't change a unit's symbol or aliases within a context", )
def test_parse_invalid(self): for badrow in ( "[length] = 1 / [time]: c / value", "1 / [time] = [length]: c / value", "[length] <- [time] = c / value", "[length] - [time] = c / value", ): with self.subTest(badrow): with self.assertRaises(DefinitionSyntaxError): Context.from_lines(["@context c", badrow])
def test_parse_define(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1}), UnitsContainer({"[length]": 1.0})) b = Context.__keytransform__(UnitsContainer({"[length]": 1}), UnitsContainer({"[time]": -1.0})) s = ["@context longcontextname", "[length] <-> 1 / [time]: c / value"] c = Context.from_lines(s) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c)
def test_parse_define(self): a = Context.__keytransform__(UnitsContainer({'[time]': -1}), UnitsContainer({'[length]': 1.})) b = Context.__keytransform__(UnitsContainer({'[length]': 1}), UnitsContainer({'[time]': -1.})) s = ['@context longcontextname', '[length] <-> 1 / [time]: c / value'] c = Context.from_lines(s) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c)
def test_parse_simple(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1}), UnitsContainer({"[length]": 1})) b = Context.__keytransform__(UnitsContainer({"[length]": 1}), UnitsContainer({"[time]": -1})) s = [ "@context longcontextname", "[length] -> 1 / [time]: c / value", "1 / [time] -> [length]: c / value", ] c = Context.from_lines(s) self.assertEqual(c.name, "longcontextname") self.assertEqual(c.aliases, ()) self.assertEqual(c.defaults, {}) self.assertEqual(c.funcs.keys(), {a, b}) self._test_ctx(c) s = [ "@context longcontextname = lc", "[length] <-> 1 / [time]: c / value" ] c = Context.from_lines(s) self.assertEqual(c.name, "longcontextname") self.assertEqual(c.aliases, ("lc", )) self.assertEqual(c.defaults, {}) self.assertEqual(c.funcs.keys(), {a, b}) self._test_ctx(c) s = [ "@context longcontextname = lc = lcn", "[length] <-> 1 / [time]: c / value", ] c = Context.from_lines(s) self.assertEqual(c.name, "longcontextname") self.assertEqual(c.aliases, ("lc", "lcn")) self.assertEqual(c.defaults, {}) self.assertEqual(c.funcs.keys(), {a, b}) self._test_ctx(c)
def test_parse_simple(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1}), UnitsContainer({"[length]": 1})) b = Context.__keytransform__(UnitsContainer({"[length]": 1}), UnitsContainer({"[time]": -1})) s = [ "@context longcontextname", "[length] -> 1 / [time]: c / value", "1 / [time] -> [length]: c / value", ] c = Context.from_lines(s) assert c.name == "longcontextname" assert c.aliases == () assert c.defaults == {} assert c.funcs.keys() == {a, b} self._test_ctx(c) s = [ "@context longcontextname = lc", "[length] <-> 1 / [time]: c / value" ] c = Context.from_lines(s) assert c.name == "longcontextname" assert c.aliases == ("lc", ) assert c.defaults == {} assert c.funcs.keys() == {a, b} self._test_ctx(c) s = [ "@context longcontextname = lc = lcn", "[length] <-> 1 / [time]: c / value", ] c = Context.from_lines(s) assert c.name == "longcontextname" assert c.aliases == ("lc", "lcn") assert c.defaults == {} assert c.funcs.keys() == {a, b} self._test_ctx(c)
def test_parse_parameterized(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1.0}), UnitsContainer({"[length]": 1.0})) b = Context.__keytransform__(UnitsContainer({"[length]": 1.0}), UnitsContainer({"[time]": -1.0})) s = ["@context(n=1) longcontextname", "[length] <-> 1 / [time]: n * c / value"] c = Context.from_lines(s) self.assertEqual(c.defaults, {"n": 1}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) s = ["@context(n=1, bla=2) longcontextname", "[length] <-> 1 / [time]: n * c / value / bla"] c = Context.from_lines(s) self.assertEqual(c.defaults, {"n": 1, "bla": 2}) self.assertEqual(set(c.funcs.keys()), set((a, b))) # If the variable is not present in the definition, then raise an error s = ["@context(n=1) longcontextname", "[length] <-> 1 / [time]: c / value"] self.assertRaises(ValueError, Context.from_lines, s)
def test_parse_define(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1}), UnitsContainer({"[length]": 1.0})) b = Context.__keytransform__(UnitsContainer({"[length]": 1}), UnitsContainer({"[time]": -1.0})) s = ["@context longcontextname", "[length] <-> 1 / [time]: c / value"] c = Context.from_lines(s) self.assertEqual(c.defaults, {}) self.assertEqual(c.funcs.keys(), {a, b}) self._test_ctx(c)
def test_parse_auto_inverse(self): a = Context.__keytransform__(UnitsContainer({'[time]': -1.}), UnitsContainer({'[length]': 1.})) b = Context.__keytransform__(UnitsContainer({'[length]': 1.}), UnitsContainer({'[time]': -1.})) s = ['@context longcontextname', '[length] <-> 1 / [time]: c / value'] c = Context.from_lines(s) self.assertEqual(c.defaults, {}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c)
def test_parse_auto_inverse(self): a = Context.__keytransform__(UnitsContainer({"[time]": -1.0}), UnitsContainer({"[length]": 1.0})) b = Context.__keytransform__(UnitsContainer({"[length]": 1.0}), UnitsContainer({"[time]": -1.0})) s = ["@context longcontextname", "[length] <-> 1 / [time]: c / value"] c = Context.from_lines(s) assert c.defaults == {} assert c.funcs.keys() == {a, b} self._test_ctx(c)
def test_parse_parameterized(self): a = Context.__keytransform__(UnitsContainer({'[time]': -1.}), UnitsContainer({'[length]': 1.})) b = Context.__keytransform__(UnitsContainer({'[length]': 1.}), UnitsContainer({'[time]': -1.})) s = ['@context(n=1) longcontextname', '[length] <-> 1 / [time]: n * c / value'] c = Context.from_lines(s) self.assertEqual(c.defaults, {'n': 1}) self.assertEqual(set(c.funcs.keys()), set((a, b))) self._test_ctx(c) # If the variable is not present in the definition, then raise an error s = ['@context(n=1) longcontextname', '[length] <-> 1 / [time]: c / value'] self.assertRaises(ValueError, Context.from_lines, s)
def test_parse_invalid(self, badrow): with pytest.raises(DefinitionSyntaxError): Context.from_lines(["@context c", badrow])
def test_err_to_base_unit(): expected = "Can't define base units within a context" with pytest.raises(DefinitionSyntaxError, match=expected): Context.from_lines(["@context c", "x = [d]"])
def test_err_prefix_redefinition(): expected = re.escape( "Expected <unit> = <converter>; got [d1] = [d2] * [d3]") with pytest.raises(DefinitionSyntaxError, match=expected): Context.from_lines(["@context c", "[d1] = [d2] * [d3]"])
def test_err_redefine_alias(subtests): expected = "Can't change a unit's symbol or aliases within a context" for s in ("foo = bar = f", "foo = bar = _ = baz"): with subtests.test(s): with pytest.raises(DefinitionSyntaxError, match=expected): Context.from_lines(["@context c", s])
def test_err_to_base_unit(self): with self.assertRaises(DefinitionSyntaxError) as e: Context.from_lines(["@context c", "x = [d]"]) self.assertEqual(str(e.exception), "Can't define base units within a context")
def test_err_prefix_redefinition(self): with self.assertRaises(DefinitionSyntaxError) as e: Context.from_lines(["@context c", "[d1] = [d2] * [d3]"]) self.assertEqual( str(e.exception), "Expected <unit> = <converter>; got [d1] = [d2] * [d3]")