Exemplo n.º 1
0
 def setUp(self):
     self.lsys = LSystem()
Exemplo n.º 2
0
class TestLSystem(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        pass

    def setUp(self):
        self.lsys = LSystem()

    def test_interface(self):
        for func in ("addRule", "generate", "expand", "setRasterFunction", "rasterize"):
            self.assertTrue(
                hasattr(self.lsys, func) and callable(getattr(self.lsys, func)), "Interface requires function: " + func
            )

    def test_addRule(self):
        self.lsys.addRule("A", ["B", "i"])
        self.lsys.addRule("BC", ["AAA", "kkikiikk"])
        self.lsys.addRule("D", ["a"])
        self.lsys.addRule("D", ["b"])
        self.lsys.addRule("D", ["b"])
        self.lsys.addRule("D", ["c"])
        self.lsys.addRule("D", ["a"])
        self.lsys.addRule("D", ["b"])
        self.lsys.addRule("E", ["i"], 9)
        self.lsys.addRule("E", ["j"])
        self.lsys.addRule("E", ["k"], 3)

        self.assertIn("A", self.lsys.rules)
        self.assertIn("BC", self.lsys.rules)
        self.assertIn("D", self.lsys.rules)
        self.assertIn("E", self.lsys.rules)

        self.assertEqual(self.lsys.rules["A"], [[1, "B", "i"]])
        self.assertEqual(self.lsys.rules["BC"], [[1, "AAA", "kkikiikk"]])
        self.assertEqual(self.lsys.rules["D"], [[2, "a"], [3, "b"], [1, "c"]])
        self.assertEqual(self.lsys.rules["E"], [[9, "i"], [1, "j"], [3, "k"]])

    def test_generate(self):
        self.lsys.addRule("A", ["i", "B"])
        self.lsys.addRule("B", ["j", "C"])
        self.lsys.addRule("C", ["k", "D"])
        self.lsys.addRule("D", ["l", "E"])
        self.lsys.addRule("E", ["m", "A"])
        self.assertEqual(self.lsys.generate(["A"], 4), ["i", "j", "k", "l", "E"])
        self.assertEqual(self.lsys.generate(["A"], 7), ["i", "j", "k", "l", "m", "i", "j", "C"])
        self.assertEqual(self.lsys.generate(["A", "A"], 3), ["i", "j", "k", "D", "i", "j", "k", "D"])
        self.assertEqual(
            self.lsys.generate(["A", "C", "a", "E"], 3),
            ["i", "j", "k", "D", "k", "l", "m", "A", "a", "m", "i", "j", "C"],
        )

        self.lsys.addRule("Q", ["R", "q", "Q", "R"])
        self.lsys.addRule("R", ["S", "t"])
        self.lsys.addRule("S", ["cat"])
        self.assertEqual(
            self.lsys.generate(["Q", "dog"], 5),
            [
                "cat",
                "t",
                "q",
                "cat",
                "t",
                "q",
                "cat",
                "t",
                "q",
                "S",
                "t",
                "q",
                "R",
                "q",
                "Q",
                "R",
                "S",
                "t",
                "cat",
                "t",
                "cat",
                "t",
                "cat",
                "t",
                "dog",
            ],
        )

    def test_expand(self):
        self.lsys.addRule("A", ["k", "i"])
        self.lsys.addRule("E", ["i", "A"], 3)
        self.assertEqual(self.lsys.expand("E"), ["i", "A"])
        self.assertEqual(self.lsys.expand("A"), ["k", "i"])
        self.lsys.addRule("E", ["j"])
        self.lsys.addRule("E", ["k"], 3)
        for i in range(20):
            self.assertIn(self.lsys.expand("E"), [["i", "A"], ["j"], ["k"]], "E did not expand properly")

        self.lsys.addRule("A", ["j"], 999)  # 99.9% chance of choosing j, so we're gonna check that at least 90% are j
        count = 0
        for i in range(20):
            expansion = self.lsys.expand("A")
            if expansion == ["j"]:
                count += 1
        self.assertGreater(
            count,
            17,
            "A did not expand to j often enough (%s/20), given that it has a 99.9%% chance of doing so" % (count),
        )

    def test_setRasterFunction(self):
        self.lsys.addRule("A", ["i", "B"])

        def f():
            return 1

        def g():
            return 2

        def h():
            return 3

        self.lsys.setRasterFunction("A", f)
        self.lsys.setRasterFunction("i", g)
        self.lsys.setRasterFunction("B", h)

        self.assertIn("A", self.lsys.raster_functions)
        self.assertIn("i", self.lsys.raster_functions)
        self.assertIn("B", self.lsys.raster_functions)

        self.assertEqual(self.lsys.raster_functions["A"], f)
        self.assertEqual(self.lsys.raster_functions["i"], g)
        self.assertEqual(self.lsys.raster_functions["B"], h)
        self.assertEqual(self.lsys.raster_functions["A"](), f())
        self.assertEqual(self.lsys.raster_functions["i"](), g())
        self.assertEqual(self.lsys.raster_functions["B"](), h())

    def test_rasterize(self):
        self.lsys.addRule("A", ["i", "B"])
        self.lsys.addRule("B", ["j", "C"])
        self.lsys.addRule("C", ["k", "D"])
        self.lsys.addRule("D", ["l", "E"])
        self.lsys.addRule("E", ["m", "A"])

        global_scope = []
        self.lsys.setRasterFunction("i", lambda: global_scope.append("i_"))
        self.lsys.setRasterFunction("j", lambda: global_scope.append("j_"))
        self.lsys.setRasterFunction("k", lambda: global_scope.append("k_"))
        self.lsys.setRasterFunction("l", lambda: global_scope.append("l_"))
        self.lsys.setRasterFunction("m", lambda: global_scope.append("m_"))
        self.lsys.setRasterFunction("A", lambda: global_scope.append("A_"))
        self.lsys.setRasterFunction("B", lambda: global_scope.append("B_"))
        self.lsys.setRasterFunction("C", lambda: global_scope.append("C_"))
        self.lsys.setRasterFunction("D", lambda: global_scope.append("D_"))
        self.lsys.setRasterFunction("E", lambda: global_scope.append("E_"))

        self.lsys.rasterize(self.lsys.generate(["A", "A"], 3))
        self.assertEqual(global_scope, ["i_", "j_", "k_", "D_", "i_", "j_", "k_", "D_"])