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))
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
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)
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])
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
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
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)