def test_remove(self): Foo, Bar = self.get_entities() bar = Bar() foo1 = Foo() foo2 = Foo() events = EventLog() events.listen( foo1_related=foo1.related, foo1_unrelated=foo1.unrelated, foo2_related=foo2.related, foo2_unrelated=foo2.unrelated, bar_related=bar.related, bar_unrelated=bar.unrelated, ) foo1.bar = bar foo2.bar = bar events.clear() bar.foos.remove(foo1) event = events.pop(0) self.assertEqual(event.slot, foo1.unrelated) self.assertEqual(event.related_object, bar) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar.unrelated) self.assertEqual(event.related_object, foo1) self.assertEqual(event.member, Bar.foos) self.assertFalse(events) self.assertTrue(foo1.bar is None) self.assertTrue(foo2.bar is bar) self.assertEqual(bar.foos, [foo2]) bar.foos.remove(foo2) event = events.pop(0) self.assertEqual(event.slot, foo2.unrelated) self.assertEqual(event.related_object, bar) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar.unrelated) self.assertEqual(event.related_object, foo2) self.assertEqual(event.member, Bar.foos) self.assertFalse(events) self.assertTrue(foo1.bar is None) self.assertTrue(foo2.bar is None) self.assertEqual(bar.foos, [])
def test_member_added_event(self): from cocktail.schema import Schema, String foo = Schema("foo") spam = Schema("spam") spam.inherit(foo) events = EventLog() events.listen(foo.member_added, spam.member_added) bar = String("bar") foo.add_member(bar) scrum = String("scrum") foo.add_member(scrum) event = events.pop(0) self.assertEqual(event.slot, foo.member_added) self.assertEqual(event.member, bar) event = events.pop(0) self.assertEqual(event.slot, foo.member_added) self.assertEqual(event.member, scrum) self.assertFalse(events)
def test_set(self): Foo, Bar = self.get_entities() foo = Foo() bar = Bar() events = EventLog() events.listen(foo_related=foo.related, foo_unrelated=foo.unrelated, bar_related=bar.related, bar_unrelated=bar.unrelated) foo.bar = bar event = events.pop(0) self.assertEqual(event.slot, bar.related) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) event = events.pop(0) self.assertEqual(event.slot, foo.related) self.assertEqual(event.related_object, bar) self.assertEqual(event.member, Foo.bar) self.assertFalse(events) self.assertTrue(foo.bar is bar) self.assertTrue(bar.foo is foo)
def test_inherited_event(self): from cocktail.schema import Schema foo = Schema() events = EventLog() events.listen(foo_inherited=foo.inherited) # Basic inheritance bar = Schema() bar.inherit(foo) event = events.pop(0) self.assertEqual(event.slot, foo.inherited) self.assertEqual(event.schema, bar) events.listen(bar_inherited=bar.inherited) # Nested inheritance spam = Schema() spam.inherit(bar) event = events.pop(0) self.assertEqual(event.slot, foo.inherited) self.assertEqual(event.schema, spam) event = events.pop(0) self.assertEqual(event.slot, bar.inherited) self.assertEqual(event.schema, spam) # Multiple inheritance scrum = Schema() events.listen(scrum_inherited=scrum.inherited) snutch = Schema() snutch.inherit(foo, scrum) event = events.pop(0) self.assertEqual(event.slot, foo.inherited) self.assertEqual(event.schema, snutch) event = events.pop(0) self.assertEqual(event.slot, scrum.inherited) self.assertEqual(event.schema, snutch)
def test_set_none(self): Foo, Bar = self.get_entities() foo = Foo() bar = Bar() # Register test event handlers events = EventLog() events.listen(foo_related=foo.related, foo_unrelated=foo.unrelated, bar_related=bar.related, bar_unrelated=bar.unrelated) # Set foo.bar = bar events.clear() # Set back to None foo.bar = None event = events.pop(0) self.assertEqual(event.slot, bar.unrelated) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) event = events.pop(0) self.assertEqual(event.slot, foo.unrelated) self.assertEqual(event.related_object, bar) self.assertEqual(event.member, Foo.bar) self.assertFalse(events) self.assertTrue(foo.bar is None) self.assertTrue(bar.foo is None) # Try it again from the other side foo.bar = bar events.clear() bar.foo = None event = events.pop(0) self.assertEqual(event.slot, foo.unrelated) self.assertEqual(event.related_object, bar) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar.unrelated) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) self.assertFalse(events) self.assertTrue(foo.bar is None) self.assertTrue(bar.foo is None)
def test_replace_appending(self): Foo, Bar = self.get_entities() bar1 = Bar() bar2 = Bar() foo1 = Foo() foo2 = Foo() events = EventLog() events.listen(foo1_related=foo1.related, foo1_unrelated=foo1.unrelated, foo2_related=foo2.related, foo2_unrelated=foo2.unrelated, bar1_related=bar1.related, bar1_unrelated=bar1.unrelated, bar2_related=bar2.related, bar2_unrelated=bar2.unrelated) foo1.bar = bar1 foo2.bar = bar1 events.clear() # First replacement bar2.foos.append(foo1) event = events.pop(0) self.assertEqual(event.slot, bar1.unrelated) self.assertEqual(event.related_object, foo1) self.assertEqual(event.member, Bar.foos) event = events.pop(0) self.assertEqual(event.slot, foo1.unrelated) self.assertEqual(event.related_object, bar1) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, foo1.related) self.assertEqual(event.related_object, bar2) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar2.related) self.assertEqual(event.related_object, foo1) self.assertEqual(event.member, Bar.foos) self.assertFalse(events) self.assertTrue(foo1.bar is bar2) self.assertTrue(foo2.bar is bar1) self.assertEqual(bar1.foos, [foo2]) self.assertEqual(bar2.foos, [foo1]) # Second replacement bar2.foos.append(foo2) event = events.pop(0) self.assertEqual(event.slot, bar1.unrelated) self.assertEqual(event.related_object, foo2) self.assertEqual(event.member, Bar.foos) event = events.pop(0) self.assertEqual(event.slot, foo2.unrelated) self.assertEqual(event.related_object, bar1) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, foo2.related) self.assertEqual(event.related_object, bar2) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar2.related) self.assertEqual(event.related_object, foo2) self.assertEqual(event.member, Bar.foos) self.assertFalse(events) self.assertTrue(foo1.bar is bar2) self.assertTrue(foo2.bar is bar2) self.assertEqual(bar1.foos, []) self.assertEqual(bar2.foos, [foo1, foo2])
def test_replace(self): Foo, Bar = self.get_entities() foo = Foo() bar1 = Bar() bar2 = Bar() # Register test event handlers events = EventLog() events.listen(foo_related=foo.related, foo_unrelated=foo.unrelated, bar1_related=bar1.related, bar1_unrelated=bar1.unrelated, bar2_related=bar2.related, bar2_unrelated=bar2.unrelated) foo.bar = bar1 events.clear() # First replacement foo.bar = bar2 event = events.pop(0) self.assertEqual(event.slot, bar1.unrelated) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) event = events.pop(0) self.assertEqual(event.slot, foo.unrelated) self.assertEqual(event.related_object, bar1) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar2.related) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) event = events.pop(0) self.assertEqual(event.slot, foo.related) self.assertEqual(event.related_object, bar2) self.assertEqual(event.member, Foo.bar) self.assertFalse(events) self.assertTrue(foo.bar is bar2) self.assertTrue(bar1.foo is None) self.assertTrue(bar2.foo is foo) # Second replacement bar1.foo = foo event = events.pop(0) self.assertEqual(event.slot, bar2.unrelated) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) event = events.pop(0) self.assertEqual(event.slot, foo.unrelated) self.assertEqual(event.related_object, bar2) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, foo.related) self.assertEqual(event.related_object, bar1) self.assertEqual(event.member, Foo.bar) event = events.pop(0) self.assertEqual(event.slot, bar1.related) self.assertEqual(event.related_object, foo) self.assertEqual(event.member, Bar.foo) self.assertFalse(events) self.assertTrue(foo.bar is bar1) self.assertTrue(bar1.foo is foo) self.assertTrue(bar2.foo is None)