예제 #1
0
    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, [])
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
    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)
예제 #6
0
    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])
예제 #7
0
    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)