def test_vma(self) -> None: # Regression test for a bug: When a canvas cell was painted over # after a VariantMakerFromAvails was created using it as a source, # the VariantMakerFromAvails would produce an invalid Consumer # (missing an operand). fm = FARGModel( slipnet=Slipnet(Graph.with_features([VariantMakerFromAvails()]))) ca = fm.build(StepCanvas([Step([4, 5, 6])])) cr0 = CellRef(ca, 0) cr1 = CellRef(ca, 1) cr1.paint(Step([5, 2], StepDelta([6, 4], [2], '-'))) # Consumer(12+5) will snag: 5 is avail but 12 is unavail co1 = fm.build(Consumer(operator=plus, operands=(12, 5), source=cr1)) fm.run_agent(co1, num=2) vma: VariantMakerFromAvails = fm.the( VariantMakerFromAvails) # type: ignore[assignment] assert vma, 'Consumer did not produce a VariantMakerFromAvails' self.assertEqual(vma.agent, co1) # Some other agent paints over cr1, removing the avail 5 cr1.paint(Step([4, 11], StepDelta([6, 5], [11], '+'))) #lenable(Agent, Codelet, Fizzle) fm.run_agent(vma) #ldisable_all() co2: Any = fm.built_by(vma)[0] assert isinstance(co2, Consumer), \ f'built by {short(co2)}, not a Consumer' self.assertEqual(len(as_list(co2.operands)), 2) fm.run_agent(co2) # Check for crash lp: Any = fm.built_by(co2)[0] self.assertIsInstance(lp, LitPainter)
def test_last_painted_cellref(self) -> None: ca = StepCanvas([Step([4, 5, 6])]) cr0 = CellRef(ca, 0) cr1 = CellRef(ca, 1) cr2 = CellRef(ca, 2) self.assertEqual(ca.last_painted_addr(), 0) self.assertEqual(ca.last_painted_cellref(), cr0) self.assertEqual(list(ca.cellrefs()), [cr0]) self.assertEqual(cr0.last_painted_cellref(), cr0) self.assertEqual(cr1.last_painted_cellref(), cr0) self.assertEqual(cr2.last_painted_cellref(), cr0) cr1.paint(Step([6, 9], StepDelta([4, 5], [9], '+'))) self.assertEqual(ca.last_painted_addr(), 1) self.assertEqual(ca.last_painted_cellref(), cr1) self.assertEqual(list(ca.cellrefs()), [cr0, cr1]) self.assertEqual(cr0.last_painted_cellref(), cr1) self.assertEqual(cr1.last_painted_cellref(), cr1) self.assertEqual(cr2.last_painted_cellref(), cr1)
def test_cellref_basics(self) -> None: ca = StepCanvas([Step([4, 5, 6])]) cr0 = CellRef(ca, 0) cr1 = CellRef(ca, 1) # StepCanvas[0] self.assertEqual(cr0.value, Step([4, 5, 6])) self.assertCountEqual(as_iter(cr0.avails), [4, 5, 6]) taken, remaining = cr0.take_avails([4, 5]) self.assertCountEqual(taken, [4, 5]) self.assertCountEqual(remaining, [6]) self.assertEqual(cr0.value, Step([4, 5, 6])) self.assertTrue(cr0.has_a_value()) self.assertTrue(cr0.has_avail_value(4)) self.assertFalse(cr0.has_avail_value(7)) with self.assertRaises(ValuesNotAvail) as cm: taken, remaining = cr0.take_avails([4, 7]) self.assertEqual( cm.exception, ValuesNotAvail(cellref=cr0, avails=(4, None), unavails=(None, 7))) #StepCanvas[1] self.assertEqual(cr1.value, None) self.assertFalse(cr1.has_a_value()) self.assertCountEqual(as_iter(cr1.avails), []) with self.assertRaises(ValuesNotAvail) as cm: taken, remaining = cr1.take_avails([4, 7]) self.assertEqual( cm.exception, ValuesNotAvail(cellref=cr1, avails=(4, 7), unavails=())) # paint cr1.paint(Step([6], StepDelta([4, 5], [9], '+'))) self.assertEqual(ca[1], Step([6], StepDelta([4, 5], [9], '+')))
def test_dead_end_detector(self) -> None: fm = FARGModel() ca = fm.build(self.pons_start_canvas()) cr0 = CellRef(ca, 0) cr1 = CellRef(ca, 1) cr2 = CellRef(ca, 2) det = fm.build( DeadEndDetector(target=15, startcell=cr0, on_success=RaiseException(UTDeadEndFound))) fm.run_detector(det) # no exception cr1.paint(self.step1) fm.run_detector(det) # no exception cr2.paint(self.step2good) fm.run_detector(det) # no exception cr2.paint(self.step2bad) with self.assertRaises(UTDeadEndFound) as cm: fm.run_detector(det) self.assertEqual(cm.exception, UTDeadEndFound(cr2))