コード例 #1
0
def test_setitem():

    item = Item()
    container = {}

    setitem(container, container.__setitem__, u'c', item)
    assert container[u'c'] is item
    assert item.__parent__ is container
    assert item.__name__ == u'c'

    # We should get events
    assert len(getEvents(IObjectAddedEvent)) == 1

    event = getEvents(IObjectAddedEvent)[-1]
    assert event.object is item
    assert event.newParent is container
    assert event.newName == u'c'
    assert event.oldParent is None
    assert event.oldName is None

    # As well as a modification event for the container
    assert len(getEvents(IObjectModifiedEvent)) == 1
    assert getEvents(IObjectModifiedEvent)[-1].object is container

    # The item's hooks have been called:
    assert item.added is event
    assert item.moved is event

    # we clean our test.
    clearEvents()
コード例 #2
0
def test_key_integrity():
    """We'll get type errors if we give keys that aren't
    unicode or ascii keys:
    """
    container = {}
    item = Item()

    with pytest.raises(TypeError):
        setitem(container, container.__setitem__, 42, item)
        setitem(container, container.__setitem__, None, item)
        setitem(container, container.__setitem__, 'hello ' + chr(200), item)

    with pytest.raises(ValueError):
        setitem(container, container.__setitem__, '', item)
        setitem(container, container.__setitem__, u'', item)
コード例 #3
0
def test_no_event(events):
    """We can suppress events and hooks by setting the `__parent__` and
    `__name__` first
    """
    item = Item()
    container = {}

    # By setting the __parent__ and __name, we act as if we were
    # already contained.
    item.__parent__, item.__name__ = container, 'c'
    setitem(container, container.__setitem__, u'c', item)

    assert len(container) == 1
    assert len(events) == 0

    assert getattr(item, 'added', None) is None
    assert getattr(item, 'moved', None) is None
コード例 #4
0
def test_move_event(events):
    """If the item had a parent or name (as in a move or rename),
    we generate a move event, rather than an add event.
    """
    container = {}

    # We create a first item
    item = Item()
    setitem(container, container.__setitem__, u'c1', item)

    # Add operation are "moved" events.
    assert len(events) == 2
    event = events.popleft()
    assert IObjectAddedEvent.providedBy(event)
    event = events.popleft()
    assert IObjectModifiedEvent.providedBy(event)
    assert isinstance(event, ContainerModifiedEvent)

    # We created an item already contained.
    item = Item()
    item.__parent__, item.__name__ = container, 'c2'
    setitem(container, container.__setitem__, u'c2', item)
    assert not len(events)

    # We now rewrite 'c2' under another name
    # Thus, we created a move event : +1 modification +1 move.
    setitem(container, container.__setitem__, u'c3', item)
    assert len(container) == 3
    event = events.popleft()
    assert IObjectMovedEvent.providedBy(event)
コード例 #5
0
def test_replace(events):
    """If we try to replace an item without deleting it first, we'll get
    an error.
    """
    container = {}

    # We create a first item
    item = Item()
    setitem(container, container.__setitem__, u'c', item)

    # We try to override
    with pytest.raises(KeyError):
        setitem(container, container.__setitem__, u'c', [])

    # We have to delete to replace a key
    del container[u'c']
    setitem(container, container.__setitem__, u'c', [])

    assert len(events) == 4
    event = events.popleft()
    assert IObjectAddedEvent.providedBy(event)
    event = events.popleft()
    assert IObjectModifiedEvent.providedBy(event)
    event = events.popleft()
    assert IObjectAddedEvent.providedBy(event)
    event = events.popleft()
    assert IObjectModifiedEvent.providedBy(event)
コード例 #6
0
def test_setitem(events):

    item = Item()
    container = {}

    setitem(container, container.__setitem__, u'c', item)
    assert container[u'c'] is item
    assert item.__parent__ is container
    assert item.__name__ == u'c'

    # We should get events
    assert len(events) == 2

    event = events.popleft()
    assert event.object is item
    assert event.newParent is container
    assert event.newName == u'c'
    assert event.oldParent is None
    assert event.oldName is None

    # As well as a modification event for the container
    assert events.popleft().object is container
コード例 #7
0
def test_interface_providing(events):
    """If the object implements `ILocation`, but not `IContained`, set it's
    `__parent__` and `__name__` attributes *and* declare that it
    implements `IContained`.
    """
    container = {}

    item = Location()
    assert not IContained.providedBy(item)

    setitem(container, container.__setitem__, u'l', item)
    assert container[u'l'] is item
    assert item.__parent__ is container
    assert item.__name__ == u'l'
    assert IContained.providedBy(item)

    # We get added and modification events:
    assert len(events) == 2
    event = events.popleft()
    assert IObjectAddedEvent.providedBy(event)
    event = events.popleft()
    assert IObjectModifiedEvent.providedBy(event)

    # If the object doesn't even implement `ILocation`, put a
    # `ContainedProxy` around it:
    item = []
    setitem(container, container.__setitem__, u'i', item)
    assert container[u'i'] == []
    assert not container[u'i'] is item

    item = container[u'i']
    assert item.__parent__ is container
    assert item.__name__ == u'i'

    assert IContained.providedBy(item)
    event = events.popleft()
    assert IObjectAddedEvent.providedBy(event)
    event = events.popleft()
    assert IObjectModifiedEvent.providedBy(event)
コード例 #8
0
def test_move_event():
    """If the item had a parent or name (as in a move or rename),
    we generate a move event, rather than an add event.
    """
    container = {}

    # We create a first item
    item = Item()
    setitem(container, container.__setitem__, u'c1', item)

    # Add operation are "moved" events.
    assert len(getEvents(IObjectMovedEvent)) == 1

    # We created an item already contained.
    item = Item()
    item.__parent__, item.__name__ = container, 'c2'
    setitem(container, container.__setitem__, u'c2', item)

    assert len(container) == 2
    assert len(getEvents(IObjectAddedEvent)) == 1
    assert len(getEvents(IObjectModifiedEvent)) == 1
    assert len(getEvents(IObjectMovedEvent)) == 1

    # We now rewrite 'c2' under another name
    # Thus, we created a move event : +1 modification +1 move.
    setitem(container, container.__setitem__, u'c3', item)

    assert len(container) == 3
    assert len(getEvents(IObjectAddedEvent)) == 1
    assert len(getEvents(IObjectModifiedEvent)) == 2
    assert len(getEvents(IObjectMovedEvent)) == 2

    # We also get the move hook called, but not the add hook:
    event = getEvents(IObjectMovedEvent)[-1]
    assert getattr(item, 'added', None) is None
    assert item.moved is event

    # we clean our test.
    clearEvents()
コード例 #9
0
def test_replace():
    """If we try to replace an item without deleting it first, we'll get
    an error.
    """
    container = {}

    # We create a first item
    item = Item()
    setitem(container, container.__setitem__, u'c', item)

    # We try to override
    with pytest.raises(KeyError):
        setitem(container, container.__setitem__, u'c', [])

    # We have to delete to replace a key
    del container[u'c']
    setitem(container, container.__setitem__, u'c', [])

    assert len(getEvents(IObjectAddedEvent)) == 2
    assert len(getEvents(IObjectModifiedEvent)) == 2

    # we clean our test.
    clearEvents()
コード例 #10
0
 def __setitem__(self, key, value):
     setitem(self, self._setitemf, key, value)
コード例 #11
0
 def __setitem__(self, key, object):
     """See interface `IWriteContainer`.
     """
     setitem(self, self._data.__setitem__, key, object)