def test_modifier_supply(): class A: foo = 0 bar = 0 class B: a = Unique(A) mod1 = InstanceModifier(A).thatSets(foo=1) mod2 = InstanceModifier(A).thatSets(bar=1) b1 = Builder(B).withA(mod1, mod2).build() b2 = Builder(B).withA([mod1, mod2]).build() b3 = Builder(B).withA(*[mod1, mod2]).build() b4 = Builder(B).withA([mod1], [mod2]).build() b5 = Builder(B).withA([mod1], mod2).build() def test(b): assert b.a.foo == 1 assert b.a.bar == 1 test(b1) test(b2) test(b3) test(b4) test(b5)
def test_reuse(): d1 = Builder(Down).withA(InstanceModifier(Up).thatSets(id=1)).build() # assert d1 in d1.up.downs FIXME: this should work d2 = Builder(Down).withA(InstanceModifier(Up).thatSets(id=1)).build() d3 = Builder(Down).withA(InstanceModifier(Up).thatSets(id=2)).build() assert d1.up == d2.up # assert d1 in d2.up.downs FIXME: this should work # assert d2 in d2.up.downs FIXME: this should work assert d1.up != d3.up
def test_reused_keys_mod(): builder = Builder(ReusingKey).withA( InstanceModifier(A).thatSets(b='ololo')) rk1 = builder.build() rk2 = builder.build() rk3 = builder.withA(InstanceModifier(A).thatSets(b='hahaha')).build() assert isinstance(rk1.a, A) assert isinstance(rk2.a, A) assert isinstance(rk3.a, A) assert rk1.a == rk2.a assert rk1.b == rk2.b assert rk1.a != rk3.a
def test_class_modifiers_over_lambda(): modifier = InstanceModifier(A).thatDoes(lambda a: setattr(a, 'value', 8)) a = Builder(A).withA(modifier).build() assert isinstance(a, A) assert a.value == 8
def test_thatSetsCarefully_is_careful(): with pytest.raises(AssertionError) as e: Builder(CarefulA).withA( InstanceModifier(CarefulA).thatCarefullySets(foo='bar')).build() assert 'foo' in e.value.message assert 'missing' in e.value.message
def test_thatSets(): class A: pass a = Builder(A).withA(InstanceModifier(A).thatSets(ololo=1, hahaha=2)).build() assert a.ololo == 1 assert a.hahaha == 2
def test_one_of(): class A: a = 0 b = Uplink() class B: values = Collection(A) A.b.linksTo(B, B.values) b = Builder(B).withA(NumberOf(B.values, 3)).\ withA(OneOf(B.values, InstanceModifier(A).thatSets(a=8))).\ withA(OneOf(B.values, InstanceModifier(A).thatSets(a=5))).\ build() assert len(b.values) == 3 assert len([a for a in b.values if a.a == 8]) == 1 assert len([a for a in b.values if a.a == 5]) == 1
def test_another_modifier(): class A: a = 0 b = Uplink() class B: values = Collection(A) A.b.linksTo(B, B.values) b = Builder(B).withA(NumberOf(B.values, 1)).\ withA(Another(B.values, InstanceModifier(A).thatSets(a=4))).\ withA(Another(B.values, InstanceModifier(A).thatSets(a=28))).build() assert len(b.values) == 3 assert len([a for a in b.values if a.a == 0]) == 1 assert len([a for a in b.values if a.a == 4]) == 1 assert len([a for a in b.values if a.a == 28]) == 1
def test_class_modifier_as_class(): def set_value(instance): A.value = 5 M = InstanceModifier(A).thatDoes(set_value) a = Builder(A).withA(M).build() assert isinstance(a, A) assert a.value == 5
def test_modifies_dont_affect_given(): class A: value = 0 class B: a = Unique(A) myA = A() myA.value = 1 b = Builder(B).withA(Given(B.a, myA)).withA( InstanceModifier(A).thatSets(value=5)).build() assert b.a.value == 1 assert b.a == myA
def test_sum(): mod_1 = InstanceModifier(A).thatSets(x=1) mod_2 = InstanceModifier(B).thatSets(x=1) assert mod_1 + mod_2 == [mod_1, mod_2]
def test_thatSetsCarefully_works(): a = Builder(CarefulA).withA( InstanceModifier(CarefulA).thatCarefullySets(ololo=1, hahaha=2)).build() assert a.ololo == 1 assert a.hahaha == 2
from builders.construct import Collection, Unique, Maybe class A(ValuesMixin): a = 1 class B: a = Unique(A) ma = Maybe(Unique(A)) aa = Collection(A) def foo(a): pass @pytest.mark.parametrize('modifier', [ InstanceModifier(A).thatDoes(foo), InstanceModifier(A).thatSets(a=2), InstanceModifier(A).thatCarefullySets(a=2), A.values(a=2), NumberOf(B.aa, 2), HavingIn(B.aa, A()), Given(B.a, A()), Enabled(B.ma), OneOf(B.aa, [[]]) ]) def test_modifier(modifier): assert pickle.loads(pickle.dumps(modifier))
def test_modifier_over_collection(): modifier = InstanceModifier(B).thatDoes(lambda b: setattr(b, 'value', 8)) d = Builder(D).withA(modifier).build() for b in d.bs: assert b.value == 8
def test_simple_setter(): modifier = InstanceModifier(B).thatDoes(lambda b: setattr(b, 'value', 1)) built = Builder(B).withA(modifier).build() assert built.value == 1