def test_eg_simple(self): fsm = self.simplemodel() lt = eval_simple_expression(fsm, "at.local") lf = eval_simple_expression(fsm, "af.local") g = eval_simple_expression(fsm, "global") true = eval_simple_expression(fsm, "TRUE") false = eval_simple_expression(fsm, "FALSE") # lt & lf & !g |= EG !g egs = eg(fsm, ~g) self.assertTrue(egs.isnot_false()) state = fsm.pick_one_state(egs) (path, loop) = explain_eg(fsm, state, ~g) self.assertTrue(path[0] == state) self.assertTrue(path[0] <= ~g & egs) for (s, i, sp) in zip(path[::2], path[1::2], path[2::2]): self.assertTrue(s <= ~g) self.assertTrue(sp <= ~g) self.assertIsNotNone(i) self.assertTrue(i <= fsm.get_inputs_between_states(s, sp)) self.assertIsNotNone(loop) self.assertEqual(len(loop), 2) self.assertIsNotNone(loop[0]) self.assertIsNotNone(loop[1]) self.assertTrue(loop[1] in path) self.assertTrue( loop[0] <= fsm.get_inputs_between_states(path[-1], loop[1]))
def test_eg_dincry(self): fsm = self.model() c1p = eval_simple_expression(fsm, "c1.payer") c2p = eval_simple_expression(fsm, "c2.payer") c3p = eval_simple_expression(fsm, "c3.payer") c1h = eval_simple_expression(fsm, "c1.coin = head") c2h = eval_simple_expression(fsm, "c2.coin = head") c3h = eval_simple_expression(fsm, "c3.coin = head") odd = eval_simple_expression(fsm, "countsay = odd") even = eval_simple_expression(fsm, "countsay = even") unk = eval_simple_expression(fsm, "countsay = unknown") true = eval_simple_expression(fsm, "TRUE") false = eval_simple_expression(fsm, "FALSE") # init |= EG c2.payer egs = eg(fsm, c2p) self.assertTrue((egs & fsm.init).isnot_false()) state = fsm.pick_one_state(egs & fsm.init) (path, loop) = explain_eg(fsm, state, c2p) self.assertTrue(path[0] == state) self.assertTrue(path[0] <= c2p) for (s, i, sp) in zip(path[::2], path[1::2], path[2::2]): self.assertTrue(s <= c2p) self.assertTrue(sp <= c2p) self.assertIsNotNone(i) self.assertTrue(i <= fsm.get_inputs_between_states(s, sp)) self.assertIsNotNone(loop) self.assertEqual(len(loop), 2) self.assertIsNotNone(loop[0]) self.assertIsNotNone(loop[1]) self.assertTrue(loop[1] in path) self.assertTrue( loop[0] <= fsm.get_inputs_between_states(path[-1], loop[1]))