def test_select(): context = Context(foo="foo", bar="bar", lst=[1, 2, 3]) assert context.select("foo") == Value("foo") assert context.select("bar") == Value("bar") assert context.select("lst") == CtxList([1, 2, 3]) assert context.select("lst.0") == Value(1) with pytest.raises(KeyNotInContext): context.select("baz") d = { "lst": [ { "foo0": "foo0", "bar0": "bar0" }, { "foo1": "foo1", "bar1": "bar1" }, ] } context = Context(d) assert context.select("lst") == CtxList(d["lst"]) assert context.select("lst.0") == CtxDict(d["lst"][0]) assert context.select("lst.1") == CtxDict(d["lst"][1]) with pytest.raises(KeyNotInContext): context.select("lst.2") for i, _ in enumerate(d["lst"]): assert context.select(f"lst.{i}.foo{i}") == Value(f"foo{i}") assert context.select(f"lst.{i}.bar{i}") == Value(f"bar{i}")
def test_merge_dict(): d1 = {"Train": {"us": {"lr": 10}}} d2 = {"Train": {"us": {"layers": 100}}} c1 = Context(d1) c2 = Context(d2) c1.merge_update(c2) assert c1.select("Train.us") == CtxDict(lr=10, layers=100) with pytest.raises(ValueError): # cannot overwrite by default c1.merge_update({"Train": {"us": {"lr": 15}}}) c1.merge_update({"Train": {"us": {"lr": 15}}}, overwrite=True) assert c1.select("Train.us") == CtxDict(lr=15, layers=100)
def test_context_setitem_getitem(): context = Context() lst = [1, 2, "three", True, pi, b"bytes", None] context["list"] = lst assert isinstance(context["list"], CtxList) assert context["list"] == CtxList(lst) for i, val in enumerate(lst): assert context["list"][i] == Value(val) d = { "foo": "foo", "bar": "bar", "list": [ { "foo0": "foo0", "bar0": "bar0" }, { "foo1": "foo1", "bar1": "bar1" }, ], } context["data"] = d assert isinstance(context["data"], CtxDict) assert context["data"] == CtxDict(d) assert context["data"]["foo"] == Value("foo") assert context["data"]["bar"] == Value("bar") assert isinstance(context["data"]["list"], CtxList) assert context["data"]["list"] == CtxList(d["list"]) for i, val in enumerate(d["list"]): c = context["data"]["list"][i] assert isinstance(c, CtxDict) assert c == CtxDict(val) assert c[f"foo{i}"] == Value(f"foo{i}") assert c[f"bar{i}"] == Value(f"bar{i}") with pytest.raises(TypeError): context["set"] = {1, 2, 3}
def test_merge_dict(): d1 = {"Train": {"us": {"lr": 10}}} d2 = {"Train": {"us": {"layers": 100}}} c1 = Context(d1) c2 = Context(d2) c1.merge_update(c2) assert c1.select("Train.us") == CtxDict(lr=10, layers=100) with pytest.raises(MergeError): # cannot overwrite by default c1.merge_update({"Train": {"us": {"lr": 15}}}) c1.merge_update({"Train": {"us": {"lr": 15}}}, overwrite=True) node = c1.select("Train.us") assert node == {"lr": 15, "layers": 100} assert isinstance(node, CtxDict) assert node["lr"] == Value(15) assert node["layers"] == Value(100)