示例#1
0
    def testSimpleCycle(self):
        stm.Link(self.s1, self.t1)
        stm.Link(self.s2, self.t2)

        def rule0():
            self.ctrl.used(self.s1)
            self.ctrl.changed(self.s1)

        def rule1():
            self.ctrl.used(self.s1)
            self.ctrl.changed(self.s2)

        def rule2():
            self.ctrl.used(self.s2)
            self.ctrl.changed(self.s1)

        self.runAs(self.t0, rule0)
        self.runAs(self.t1, rule1)
        self.runAs(self.t2, rule2)
        try:
            self.ctrl._retry()
        except stm.CircularityError, e:
            self.assertEqual(
                e.args[0], {
                    self.t0: set([self.t1]),
                    self.t1: set([self.t2]),
                    self.t2: set([self.t0, self.t1])
                })
            self.assertEqual(e.args[1], (self.t1, self.t2, self.t0))
示例#2
0
 def testNotifyOnChange(self):
     stm.Link(self.s2, self.t2)
     stm.Link(self.s2, self.t3)
     self.ctrl.changed(self.s2)
     self.ctrl.current_listener = self.t0
     self.ctrl.changed(self.s2)
     self.assertEqual(self.ctrl.queues, {2: {self.t2: 1}})
     self.ctrl.cancel(self.t2)
     self.ctrl.writes.clear()
     self.ctrl.current_listener = None  # reset
示例#3
0
 def setUp(self):
     self.l1 = TestListener()
     self.l1.name = 'l1'
     self.l2 = TestListener()
     self.l1.name = 'l2'
     self.s1 = TestSubject()
     self.s1.name = 's1'
     self.s2 = TestSubject()
     self.s2.name = 's2'
     self.lk11 = stm.Link(self.s1, self.l1)
     self.lk12 = stm.Link(self.s1, self.l2)
     self.lk21 = stm.Link(self.s2, self.l1)
     self.lk22 = stm.Link(self.s2, self.l2)
示例#4
0
    def testReadProcessingInRun(self):
        stm.Link(self.s1, self.t0)
        s3 = TestSubject()
        stm.Link(s3, self.t0)
        self.assertEqual(list(self.t0.iter_subjects()), [s3, self.s1])

        def rule():
            self.ctrl.used(self.s1)
            self.ctrl.used(self.s2)
            self.assertEqual(self.ctrl.reads, {self.s1: 1, self.s2: 1})

        self.runAs(self.t0, rule)
        self.assertEqual(self.ctrl.reads, {})
        self.assertEqual(list(self.t0.iter_subjects()), [self.s2, self.s1])
示例#5
0
 def testDependencyUpdatingAndUndo(self):
     stm.Link(self.s1, self.t0)
     s3 = TestSubject()
     stm.Link(s3, self.t0)
     self.assertEqual(list(self.t0.iter_subjects()), [s3, self.s1])
     self.ctrl.current_listener = self.t0
     self.ctrl.used(self.s1)
     self.ctrl.used(self.s2)
     sp = self.ctrl.savepoint()
     self.ctrl._process_reads(self.t0)
     self.assertEqual(list(self.t0.iter_subjects()), [self.s2, self.s1])
     self.ctrl.rollback_to(sp)
     self.assertEqual(list(self.t0.iter_subjects()), [s3, self.s1])
     self.ctrl.current_listener = None  # reset
示例#6
0
 def testRecalcOnWrite(self):
     stm.Link(self.s1, self.t0)
     stm.Link(self.s2, self.t1)
     stm.Link(self.s2, self.t0)
     self.ctrl.current_listener = self.t1
     self.ctrl.changed(self.s1)
     self.ctrl.changed(self.s2)
     self.assertEqual(self.ctrl.writes, {
         self.s1: self.t1,
         self.s2: self.t1
     })
     sp = self.ctrl.savepoint()
     self.ctrl.has_run[self.t1] = self.t1
     self.ctrl._process_writes(self.t1)
     # Only t0 is notified, not t1, since t1 is the listener
     self.assertEqual(self.ctrl.queues, {2: {self.t0: 1}})
     self.ctrl.rollback_to(sp)
     self.ctrl.current_listener = None  # reset
示例#7
0
    def testWriteProcessingInRun(self):
        stm.Link(self.s1, self.t0)
        stm.Link(self.s2, self.t1)
        stm.Link(self.s2, self.t3)
        stm.Link(self.s2, self.t0)

        def rule():
            self.ctrl.changed(self.s1)
            self.ctrl.changed(self.s2)
            self.assertEqual(self.ctrl.writes, {
                self.s1: self.t1,
                self.s2: self.t1
            })

        self.runAs(self.t1, rule)
        # Only t0 is notified, not t1, since t1 is the listener & t3 is !dirty
        self.assertEqual(self.ctrl.writes, {})
        self.assertEqual(self.ctrl.queues, {2: {self.t0: 1}})
        self.ctrl.cancel(self.t0)