Beispiel #1
0
class DNAVis(Widget):
    def __init__(self, **kw):
        super(DNAVis, self).__init__(**kw)
        self.dna = DNA()
        self.crawler = self.dna.spawn_crawler()

        self.bind(size=self.redraw, pos=self.redraw)

    def redraw(self, *ar):
        for w in self.children[:]:
            if isinstance(w, NodeVis):
                self.remove_widget(w)

        node_lookup = {}

        y = self.top - 100
        crawler = self.dna.spawn_crawler()
        crawler.reset()
        indent = 100

        for n, indent_no in crawler.crawl_indents():
            indent += 100 * indent_no

            nv = NodeVis(size=(100, 100), text=n.name)
            node_lookup[n] = nv
            nv.x = self.x + indent
            nv.y = y

            self.add_widget(nv)
            y -= 100

        crawler = self.crawler
        cv = NodeVis(size=(100, 100), text="CRAWLER", color=[0.7, 0.05, 0])
        if crawler.current_node is not None:
            cv.x = node_lookup[crawler.current_node].x - 100
            cv.y = node_lookup[crawler.current_node].y
        else:
            cv.y = self.top - 100
            cv.x = self.width - cv.width
        self.add_widget(cv)

    def eval_input(self, text):
        dna = self.dna
        crawler = self.crawler

        if not hasattr(self, "exec_locals"):
            self.exec_locals = locals()

        try:
            to_run = compile(text, "", "exec")
            exec(to_run, globals(), self.exec_locals)
        except (NameError, SyntaxError, AttributeError, TypeError) as err:
            print(err)

        self.redraw()
Beispiel #2
0
class tests(test_utils):

    def setUp(self):
        self.dna = DNA()

        self.n1 = TestNode('node1')
        self.n2 = TestNode('node2')
        self.n3 = TestNode('node3')
        self.n4 = TestNode('node4')

        self.dna.head = self.n1
        self.crawler = self.dna.spawn_crawler()
        self.crawler.attach_to(self.n1)

    # test inserting (before, after, child)

    def test_1_insert_before(self):
        self.crawler.add_before(self.n2)
        self.check_seq(self.n2, self.n1)

        self.assertIsNone(self.n2.dna_node_prev_sib)
        self.assertIsNone(self.n1.dna_node_next_sib)

    def test_2_insert_after(self):
        self.crawler.add_after(self.n2)
        self.check_seq(self.n1, self.n2)

        self.assertIsNone(self.n1.dna_node_prev_sib)
        self.assertIsNone(self.n2.dna_node_next_sib)

    def test_3_insert_child(self):
        self.crawler.add_child(self.n3)
        self.check_child(self.n1, self.n3)

    # test removing

    def test_4_remove_head(self):
        c = self.crawler
        c.add_after(self.n2, self.n1)
        c.add_after(self.n3, self.n2)
        c.remove(self.n1)

        self.assertRaises(AssertionError, self.check_seq, self.n1, self.n2)
        self.assertIsNone(self.n1.dna_node_next_sib)

    def test_5_remove_tail(self):
        c = self.crawler
        c.add_after(self.n2, self.n1)
        c.add_after(self.n3, self.n2)
        c.remove(self.n3)

        self.assertRaises(AssertionError, self.check_seq, self.n2, self.n3)
        self.assertIsNone(self.n3.dna_node_prev_sib)

    def test_6_remove_middle(self):
        c = self.crawler
        c.add_after(self.n2, self.n1)
        c.add_after(self.n3, self.n2)
        c.remove(self.n2)

        self.check_seq(self.n1, self.n3)
        self.assertIsNone(self.n2.dna_node_next_sib)
        self.assertIsNone(self.n2.dna_node_prev_sib)

    def test_7_remove_child(self):
        c = self.crawler
        c.add_child(self.n2, self.n1)
        c.add_after(self.n3, self.n2)
        c.remove(self.n2)

        self.check_child(self.n1, self.n3)
        self.assertIsNone(self.n2.dna_node_parent)
        self.assertIsNone(self.n2.dna_node_next_sib)
        self.assertIsNone(self.n2.dna_node_prev_sib)

    # test low-level traversing

    def test_8_traverse_sibs(self):
        c = self.crawler
        c.add_child(self.n2, self.n1)
        c.add_after(self.n3, self.n1)

        self.assertIs(self.n1, c.current_node)
        self.assertIs(self.n3, c.next_sib())
        self.assertIsNone(c.next_sib())

    def test_9_traverse_node_flat(self):
        c = self.crawler
        c.add_after(self.n2, self.n1)
        c.add_after(self.n3, self.n2)

        self.assertIs(self.n1, c.current_node)
        self.assertIs(self.n2, c.next_node())
        self.assertIs(self.n3, c.next_node())
        self.assertIsNone(c.next_node())

    def test_10_traverse_node_wchild(self):
        c = self.crawler
        c.add_child(self.n2, self.n1)
        c.add_after(self.n3, self.n1)

        c = self.crawler
        self.assertIs(self.n1, c.current_node)
        self.assertIs(self.n2, c.next_node())
        self.assertIs(self.n3, c.next_node())
        self.assertIsNone(c.next_node())

    # test crawling

    def test_11_crawl_sibs(self):
        c = self.crawler
        c.add_child(self.n2, self.n1)
        c.add_after(self.n3, self.n1)

        gen = c.crawl_sibs()
        self.assertIs(self.n1, gen.next())
        self.assertIs(self.n3, gen.next())
        self.assertRaises(StopIteration, gen.next)

    def test_12_crawl_flat(self):
        c = self.crawler
        c.add_after(self.n2, self.n1)
        c.add_after(self.n3, self.n2)

        gen = c.crawl()
        self.assertIs(self.n1, gen.next())
        self.assertIs(self.n2, gen.next())
        self.assertIs(self.n3, gen.next())
        self.assertRaises(StopIteration, gen.next)

    def test_13_crawl_wchild(self):
        c = self.crawler
        c.add_child(self.n2, self.n1)
        c.add_after(self.n3, self.n1)

        gen = c.crawl()
        self.assertIs(self.n1, gen.next())
        self.assertIs(self.n2, gen.next())
        self.assertIs(self.n3, gen.next())
        self.assertRaises(StopIteration, gen.next)

    def test_14_crawl_w_mul_children(self):
        """
        Tests that when traversing this stucture we correctly jump from n3 to
        n4.

            n1 -- n2 -- n3
            |
            n4
        """
        c = self.crawler
        c.add_child(self.n2, self.n1)
        c.add_child(self.n3, self.n2)
        c.add_after(self.n4, self.n1)

        gen = c.crawl()
        self.assertIs(self.n1, gen.next())
        self.assertIs(self.n2, gen.next())
        self.assertIs(self.n3, gen.next())
        self.assertIs(self.n4, gen.next())
        self.assertRaises(StopIteration, gen.next)