Exemple #1
0
    def test_deferred_events_debug(self): # XXX Subsumed by next test
        'Deferred events -- DEBUG'

        c1, c2, c3 = self.factory(), self.factory(), self.factory()
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        #print 'one' # XXX
        #def p(s): print s # XXX
        #c1.on_trait_change(lambda *args: p('A'), 'defer_events') # XXX
        #c1.context_data.on_trait_change(lambda *args:p('B'), 'defer_events')#XXX
        c1.defer_events = True
        #print 'two' # XXX
        c1.update(a=1, x=arange(3), c2=c2)
        c2.update(a=2, x=-arange(3))
        c3.update(a=3, x=1+arange(3))
        c1.update(c3=c3)
        dm.assert_events()
        cm.assert_events()

        c1.defer_events = False
        dm.assert_event(added={'a':1, 'x':arange(3), 'c2':c2, 'c3':c3})
        cm.assert_event(added=['x', 'c2.x', 'c3.x'], changed=['a', 'c2', 'c3'])

        c1.defer_events = True
        c1['x'] = -arange(3)
        c2['x'] = arange(3)
        c1.set_dotted('c3.x', 1-arange(3))
        dm.assert_events()
        cm.assert_events()

        c1.defer_events = False
        dm.assert_event(changed={'x':arange(3)})
        cm.assert_event(modified=['x', 'c2.x', 'c3.x'])
Exemple #2
0
    def test_events_multiple_names(self):
        'Events: multiple names'

        c = self.factory()
        dm = DictModifiedEventMonitor(c)
        cm = ContextModifiedEventMonitor(c)

        c.update(a=1, x=arange(3), t=True)
        dm.assert_event(added={'a':1, 'x':arange(3), 't':True})
        cm.assert_event(changed='at', added='x')

        c.update(a=2, x=-arange(3), y=arange(3))
        dm.assert_event(changed={'a':1, 'x':arange(3)}, added={'y':arange(3)})
        cm.assert_events(dict(changed='a', modified='x', added='y'))

        del c['t']
        dm.assert_event(removed={'t':True})
        cm.assert_event(changed='t')

        del c['x']
        dm.assert_event(removed={'x':-arange(3)})
        cm.assert_event(removed='x')

        c.clear()
        dm.assert_event(removed={'a':2, 'y':arange(3)})
        cm.assert_event(changed='a', removed='y')
Exemple #3
0
    def test_events_single_name(self):
        'Events: single name'

        c = self.factory()
        dm = DictModifiedEventMonitor(c)
        cm = ContextModifiedEventMonitor(c)

        c['x'] = 1
        dm.assert_event(added={'x':1})
        cm.assert_event(changed='x')

        c['x'] = 1
        dm.assert_events()
        cm.assert_events()

        c['x'] = 'foo'
        dm.assert_event(changed={'x':1})
        cm.assert_event(changed='x')

        c['x'] = 'foo'
        dm.assert_events()
        cm.assert_events()

        del c['x']
        dm.assert_event(removed={'x':'foo'})
        cm.assert_event(changed='x')

        c['x'] = 'foo'
        dm.flush();
        cm.flush()

        c['x'] = arange(3)
        dm.assert_event(changed={'x':'foo'})
        cm.assert_event(added='x', changed='x')

        c['x'] = arange(3) # This fires because 'arange(3) is not arange(3)'
        dm.assert_event(changed={'x':arange(3)})
        cm.assert_event(modified='x')

        c['x'] = -arange(4)
        dm.assert_event(changed={'x':arange(3)})
        cm.assert_event(modified='x')

        del c['x']
        dm.assert_event(removed={'x':-arange(4)})
        cm.assert_event(removed='x')

        c['x'] = arange(3)
        dm.assert_event(added={'x':arange(3)})
        cm.assert_event(added='x')

        c['x'] = 3
        dm.assert_event(changed={'x':arange(3)})
        cm.assert_event(removed='x', changed='x')
Exemple #4
0
    def test_regression_context_modified_incomplete_when_array_replaces_none(self):
        "Regression: 'context_modified' incomplete when array replaces None"

        c = self.factory()
        dm = DictModifiedEventMonitor(c)
        cm = ContextModifiedEventMonitor(c)

        c['x'] = None
        dm.assert_event(added={'x':None})
        cm.assert_event(changed='x')

        c['x'] = arange(3)
        dm.assert_event(changed={'x':None})
        cm.assert_event(changed='x', added='x')
Exemple #5
0
    def test_pickling_dynamic_binding(self):
        'Pickling: dynamic binding'

        p = self.factory()
        c = self.factory(context_name='c')

        p.bind_dynamic(c, 'context_name')

        # Pickle 'p'. Also pickle the new 'p' out to nowhere to ensure that
        # '__getstate__' doesn't have side effects.
        p = loads(dumps(p))
        dumps(p)
        c = p['c']

        dm = DictModifiedEventMonitor(p)
        cm = ContextModifiedEventMonitor(p)

        c.context_name = 'd'
        dm.assert_events(dict(removed={'c':c}),
                         dict(added={'d':c}))
        cm.assert_events(dict(changed='c'),
                         dict(changed='d'))

        p['c'] = c
        dm.assert_events(dict(removed={'d':c}),
                         dict(added={'c':c}))
        cm.assert_events(dict(changed='d'),
                         dict(changed='c'))

        del p['c']
        dm.assert_event(removed={'c':c})
        cm.assert_event(changed='c')

        c.context_name = 'd'
        dm.assert_events()
        cm.assert_events()
Exemple #6
0
    def test_events_dynamic_binding(self):
        'Events: dynamic binding'

        # TODO Consolidate events

        p = self.factory()
        c = self.factory(context_name='c')
        c['x'] = arange(3)
        c['a'] = 8

        dm = DictModifiedEventMonitor(p)
        cm = ContextModifiedEventMonitor(p)

        p.bind_dynamic(c, 'context_name')
        dm.assert_event(added={'c':c})
        cm.assert_event(changed='c', added=['c.x'])

        c.context_name = 'bar'
        dm.assert_events(dict(removed={'c':c}),
                         dict(added={'bar':c}))
        cm.assert_events(dict(changed='c', removed=['c.x']),
                         dict(changed=['bar'], added=['bar.x']))

        p['foo'] = c
        dm.assert_events(dict(removed={'bar':c}),
                         dict(added={'foo':c}))
        cm.assert_events(dict(changed=['bar'], removed=['bar.x']),
                         dict(changed=['foo'], added=['foo.x']))

        p['c'] = 3
        dm.assert_event(added={'c':3})
        cm.assert_event(changed='c')

        p['c'] = c
        dm.assert_events(dict(removed={'foo':c}),
                         dict(changed={'c':3}))
        cm.assert_events(dict(changed=['foo'], removed=['foo.x']),
                         dict(changed='c', added=['c.x']))

        p['x'] = arange(3)
        dm.assert_event(added={'x':arange(3)})
        cm.assert_event(added='x')

        p['x'] = c
        dm.assert_events(dict(removed={'c':c}),
                         dict(changed={'x':arange(3)}))
        cm.assert_events(dict(changed='c', removed=['c.x']),
                         dict(removed='x', changed='x', added=['x.x']))

        ### 'del' a dynamic binding:

        del p['x']
        dm.assert_event(removed={'x':c})
        cm.assert_event(changed='x', removed=['x.x'])

        c.context_name = 'c'
        assert 'c' not in p
        dm.assert_events()
        cm.assert_events()

        p.update(c=3, x=arange(3), foo='foo')
        dm.assert_event(added={'c':3, 'x':arange(3), 'foo':'foo'})
        cm.assert_event(added='x', changed=['c', 'foo'])

        ### Clobber dynamic bindings

        c.context_name = 'b'
        p.bind_dynamic(c, 'context_name')
        dm.assert_event(added={'b':c})
        cm.assert_event(changed='b', added=['b.x'])

        # If a dynamic binding tries to indirectly clobber a dictionary
        # mapping, then we drop the dynamic binding entirely
        c.context_name = 'c'
        dm.assert_event(removed={'b':c})
        cm.assert_event(changed='b', removed=['b.x'])
        assert_equal(c.context_name, 'c')

        # But new dictionary mappings are allowed to clobber dynamic bindings
        c.context_name = 'b'
        p.bind_dynamic(c, 'context_name')
        dm.assert_event(added={'b':c})
        cm.assert_event(changed='b', added=['b.x'])
        p['b'] = 2
        dm.assert_event(changed={'b':c})
        cm.assert_event(changed='b', removed=['b.x'])
Exemple #7
0
    def test_deferred_events(self):
        'Deferred events'

        # Possible event combinations:
        #    1. none     + added
        #    2. none     + modified
        #    3. none     + removed
        #    4. removed  + added
        #    5. added    + modified
        #    6. modified + modified
        #    7. added    + removed
        #    8. modified + removed
        #    9. none     + changed
        #   10. changed  + changed

        c = self.factory()
        dm = DictModifiedEventMonitor(c)
        cm = ContextModifiedEventMonitor(c)

        c.update(a=1, x=arange(3), t=True)
        dm.assert_event(added={'a':1, 'x':arange(3), 't':True})

        c.defer_events = True
        #  3. none    + removed
        c.clear()
        #  4. removed + added
        c.update(a=1, x=arange(3), t=True)
        dm.assert_events()
        cm.assert_events()

        c.defer_events = False
        dm.assert_event(changed={'x':arange(3)}) # Because `[1,2] is not [1,2]`
        cm.assert_event(modified=['x'])

        c.defer_events = True
        #  1. none     + added
        c['y'] = -arange(3)
        #  5. added    + modified
        c['y'] = 1+arange(3)
        #  2. none     + modified
        c['x'] = 1+arange(3)
        #  6. modified + modified
        c['x'] = -arange(3)
        #  9. none     + changed
        c['foo'] = 'foo'
        # 10. changed  + changed
        c['foo'] = 'bar'
        dm.assert_events()
        cm.assert_events()

        c.defer_events = False
        dm.assert_event(added={'y':1+arange(3), 'foo':'bar'},
                        changed={'x':arange(3)})
        cm.assert_event(added=['y'], modified=['x'],
                        changed=['foo'])

        c.defer_events = True
        #  1. none     + added
        c['z'] = arange(3)
        #  7. added    + removed
        del c['z']
        #  2. none     + modified
        c['y'] = arange(3)
        #  8. modified + removed
        del c['y']
        dm.assert_events()
        cm.assert_events()

        c.defer_events = False
        dm.assert_event(removed={'y':1+arange(3)})
        cm.assert_event(removed=['y'])

        # Something more normal looking
        c.defer_events = True
        c['n'] = array([-1, 0, 1])
        for c['i'] in range(10):
            c['n'] *= 2
        del c['i']
        dm.assert_events()
        cm.assert_events()

        c.defer_events = False
        dm.assert_event(added={'n':array([-1024, 0, 1024])})
        cm.assert_event(added=['n'])
Exemple #8
0
    def test_events_nested_contexts(self):
        'Events: nested contexts'

        ### setitem (inside-out)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c3['a'] = 1
        c3['x'] = arange(3)
        dm.assert_events()
        cm.assert_events()

        c2['a'] = 2
        c2['x'] = arange(3)
        c2['c3'] = c3
        dm.assert_events()
        cm.assert_events()

        c1['a'] = 3
        c1['x'] = 1+arange(3)
        c1['c2'] = c2
        dm.assert_events(dict(added={'a':3}),
                         dict(added={'x':1+arange(3)}),
                         dict(added={'c2':c2}))
        cm.assert_events(dict(changed='a'),
                         dict(added='x'),
                         dict(changed=['c2'], added=['c2.x', 'c2.c3.x']))

        ### setitem (outside-in)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c1['a'] = 3
        c1['x'] = 1+arange(3)
        c1['c2'] = c2
        dm.assert_events(dict(added={'a':3}),
                         dict(added={'x':1+arange(3)}),
                         dict(added={'c2':c2}))
        cm.assert_events(dict(changed='a'),
                         dict(added='x'),
                         dict(changed=['c2']))

        c2['a'] = 2
        c2['x'] = arange(3)
        c2['c3'] = c3
        dm.assert_events()
        cm.assert_event(added=['c2.x'])

        c3['a'] = 1
        c3['x'] = arange(3)
        dm.assert_events()
        cm.assert_event(added=['c2.c3.x'])

        ### update (inside-out)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c3.update(a=1, x=arange(3))
        dm.assert_events()
        cm.assert_events()

        c2.update(a=2, x=-arange(3), c3=c3)
        dm.assert_events()
        cm.assert_events()

        c1.update(a=3, x=1+arange(3), c2=c2)
        dm.assert_event(added={'a':3, 'x':1+arange(3), 'c2':c2})
        cm.assert_event(added=['x', 'c2.x', 'c2.c3.x'], changed=['a', 'c2'])

        ### update (outside-in)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c1.update(a=3, x=1+arange(3), c2=c2)
        dm.assert_event(added={'a':3, 'x':1+arange(3), 'c2':c2})
        cm.assert_event(added='x', changed=['a', 'c2'])

        c2.update(a=2, x=-arange(3), c3=c3)
        dm.assert_events()
        cm.assert_event(added=['c2.x'])

        c3.update(a=1, x=arange(3))
        dm.assert_events()
        cm.assert_event(added=['c2.c3.x'])

        ### Mutate

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        c3.update(a=1, l=[1], x=arange(3))
        c2.update(a=2, l=[2], x=-arange(3), c3=c3)
        c1.update(a=3, l=[3], x=1+arange(3), c2=c2)
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c1['a'] += 3
        dm.assert_event(changed={'a':3})
        cm.assert_event(changed='a')

        c1['l'].append(0)
        dm.assert_events()
        cm.assert_events()

        c1['x'] += 3
        dm.assert_events()
        cm.assert_events()

        c1['x'] = c1['x'] + 3
        dm.assert_event(changed={'x':4+arange(3)})
        cm.assert_event(modified='x')

        c2['a'] += 3
        dm.assert_events()
        cm.assert_events()

        c2['l'].append(0)
        dm.assert_events()
        cm.assert_events()

        c2['x'] += 3
        dm.assert_events()
        cm.assert_event(modified=['c2.x'])

        c3['a'] += 3
        dm.assert_events()
        cm.assert_events()

        c3['l'].append(0)
        dm.assert_events()
        cm.assert_events()

        c3['x'] += 3
        dm.assert_events()
        cm.assert_event(modified=['c2.c3.x'])

        ### delitem (outside-in)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        c3.update(a=1, x=arange(3))
        c2.update(a=2, x=-arange(3), c3=c3)
        c1.update(a=3, x=1+arange(3), c2=c2)
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        del c1['a']
        del c1['x']
        del c1['c2']
        dm.assert_events(dict(removed={'a':3}),
                         dict(removed={'x':1+arange(3)}),
                         dict(removed={'c2':c2}))
        cm.assert_events(dict(changed='a'),
                         dict(removed='x'),
                         dict(changed=['c2'], removed=['c2.x', 'c2.c3.x']))

        del c2['a']
        del c2['x']
        del c2['c3']
        dm.assert_events()
        cm.assert_events()

        del c3['a']
        del c3['x']
        dm.assert_events()
        cm.assert_events()

        ### delitem (inside-out)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        c3.update(a=1, x=arange(3))
        c2.update(a=2, x=-arange(3), c3=c3)
        c1.update(a=3, x=1+arange(3), c2=c2)
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        del c3['a']
        del c3['x']
        dm.assert_events()
        cm.assert_event(removed=['c2.c3.x'])

        del c2['a']
        del c2['x']
        del c2['c3']
        dm.assert_events()
        cm.assert_event(removed=['c2.x'])

        del c1['a']
        del c1['x']
        del c1['c2']
        dm.assert_events(dict(removed={'a':3}),
                         dict(removed={'x':1+arange(3)}),
                         dict(removed={'c2':c2}))
        cm.assert_events(dict(changed='a'),
                         dict(removed='x'),
                         dict(changed=['c2']))

        ### clear (outside-in)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        c3.update(a=1, x=arange(3))
        c2.update(a=2, x=-arange(3), c3=c3)
        c1.update(a=3, x=1+arange(3), c2=c2)
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c1.clear()
        dm.assert_event(removed={'a':3, 'x':1+arange(3), 'c2':c2})
        cm.assert_event(changed=['a', 'c2'], removed=['x', 'c2.x', 'c2.c3.x'])

        c2.clear()
        dm.assert_events()
        cm.assert_events()

        c3.clear()
        dm.assert_events()
        cm.assert_events()

        ### clear (inside-out)

        c1,c2,c3 = self.factory(), self.factory(), self.factory()
        c3.update(a=1, x=arange(3))
        c2.update(a=2, x=-arange(3), c3=c3)
        c1.update(a=3, x=1+arange(3), c2=c2)
        dm = DictModifiedEventMonitor(c1)
        cm = ContextModifiedEventMonitor(c1)

        c3.clear()
        dm.assert_events()
        cm.assert_event(removed=['c2.c3.x'])

        c2.clear()
        dm.assert_events()
        cm.assert_event(removed=['c2.x'])

        c1.clear()
        dm.assert_event(removed={'a':3, 'x':1+arange(3), 'c2':c2})
        cm.assert_event(changed=['a', 'c2'], removed='x')