def test_childrenAreCstOrVar(self):
     if_tree = GeneratorAstTree.basic_if()
     body_part = if_tree.children[1]
     self.assertEqual(
         AstToCfgConverter.check_children_are_cst_or_var(if_tree), False)
     self.assertEqual(
         AstToCfgConverter.check_children_are_cst_or_var(body_part), True)
def main():
    file_program = treat_command()
    name_prog = get_name_file_from_path(file_program)
    ast_tree_prog = GeneratorAstTree.get_ast_from_name(name_prog)

    # Convert AST to CFG
    converter = AstToCfgConverter(ast_tree_prog)
    graph = converter.get_cfg_graph()

    # generates
    all_affectations(graph)
    all_decisions(graph)
    all_k_paths(graph, 10)
 def test_treat_multiple_cond(self):
     and_cond = GeneratorAstTree.and_condition()
     or_cond = GeneratorAstTree.or_condition()
     complex_cond = GeneratorAstTree.clean_cnf_conditions()
     converter = AstToCfgConverter(and_cond)
     # or_cond
     result = converter.treat_composed_boolean_expr(or_cond)
     expected = [[('<=', ['x', 0]), ('>', ['y', 2])]]
     self.assertEqual(result, expected)
     # and_cond
     result = converter.treat_composed_boolean_expr(and_cond)
     expected = [[('<=', ['x', 0])], [('>', ['y', 2])]]
     self.assertEqual(result, expected)
     # complex cond (cnf format)
     result = converter.treat_composed_boolean_expr(complex_cond)
     expected = [[('<=', ['x', 0]), ('>', ['y', 2])],
                 [('<=', ['x', 0]), ('>', ['y', 2])]]
     self.assertEqual(result, expected)
    def test_treat_while_node(self):
        # test simple while loop
        while_tree = GeneratorAstTree.basic_while_tree()
        parser = AstToCfgConverter(while_tree)
        result = parser.treat_while_node(while_tree)
        expected = {
            1: ['while', [[('<', ['x', 5])]], [2, 3]],
            2: ['assign', {
                'x': 'x+1'
            }, [1]],
        }
        self.assertEqual(result, expected)

        # test tree with sequence inside
        while_tree_seq = GeneratorAstTree.while_tree_with_seq()
        parser2 = AstToCfgConverter(while_tree_seq)
        result2 = parser2.treat_while_node(while_tree_seq)

        expected2 = {
            1: ["while", [[('<', ['x', 5])]], [2, 4]],
            2: ['assign', {
                'x': 'x+x'
            }, [3]],
            3: ['assign', {
                'x': 'x-1'
            }, [1]]
        }

        self.assertEqual(result2, expected2)

        # test while with if inside
        while_with_if = GeneratorAstTree.while_with_if()
        parser3 = AstToCfgConverter(while_with_if)
        result3 = parser3.treat_while_node(while_with_if)

        expected3 = {
            1: ['while', [[('<', ['x', 5])]], [2, 5]],
            2: ['if', [[('==', ["x", 1])]], [3, 4]],
            3: ['assign', {
                'x': '1'
            }, [1]],
            4: ['assign', {
                'x': 'x+1'
            }, [1]]
        }

        self.assertEqual(result3, expected3)
    def test_treat_seq_with_while(self):
        seq_tree = GeneratorAstTree.seq_with_while()

        expected = {
            1: ['if', [[('==', ["x", 1])]], [2, 3]],
            2: ['assign', {
                'x': '1'
            }, [4]],
            3: ['assign', {
                'x': 'x+1'
            }, [4]],
            4: ['while', [[('<', ['x', 5])]], [5, 6]],
            5: ['assign', {
                'x': 'x+1'
            }, [4]]
        }
        parser = AstToCfgConverter(seq_tree)
        result = parser.treat_seq_node(seq_tree)

        self.assertEqual(result, expected)
 def test_treat_seq_node(self):
     prog_tree = GeneratorAstTree.prog_tree()
     parser = AstToCfgConverter(prog_tree)
     result = parser.treat_seq_node(prog_tree)
     expected = {
         1: ['if', [[('<=', ["x", 0])]], [2, 3]],
         2: ['assign', {
             'x': '0-x'
         }, [4]],
         3: ['assign', {
             'x': '1-x'
         }, [4]],
         4: ['if', [[('==', ["x", 1])]], [5, 6]],
         5: ['assign', {
             'x': '1'
         }, [7]],
         6: ['assign', {
             'x': 'x+1'
         }, [7]]
     }
     self.assertEqual(result, expected)
    def test_get_cfg_graph(self):
        assign_tree = GeneratorAstTree.seq_if_and_assign()
        parser = AstToCfgConverter(assign_tree)
        result = parser.get_cfg_graph()
        expected = {
            1: ['if', [[('<=', ['x', 0])]], [2, 3]],
            2: ['assign', {
                'y': 'x'
            }, [4]],
            3: ['assign', {
                'y': '0-x'
            }, [4]],
            4: ['assign', {
                'x': 'y*2'
            }, [0]]
        }

        self.assertEqual(result, expected)

        prog_tree = GeneratorAstTree.prog_tree()
        parser_prog = AstToCfgConverter(prog_tree)
        result_prog = parser_prog.get_cfg_graph()
        expected_prog = {
            1: ['if', [[('<=', ["x", 0])]], [2, 3]],
            2: ['assign', {
                'x': '0-x'
            }, [4]],
            3: ['assign', {
                'x': '1-x'
            }, [4]],
            4: ['if', [[('==', ["x", 1])]], [5, 6]],
            5: ['assign', {
                'x': '1'
            }, [0]],
            6: ['assign', {
                'x': 'x+1'
            }, [0]]
        }

        self.assertEqual(result_prog, expected_prog)

        complex_tree = GeneratorAstTree.complex_sequence()
        parser_complex = AstToCfgConverter(complex_tree)
        result_complex = parser_complex.get_cfg_graph()
        expected_complex = {
            1: ['if', [[('==', ["x", 1])]], [2, 3]],
            2: ['assign', {
                'x': '1'
            }, [5]],
            3: ['assign', {
                'x': '32'
            }, [4]],
            4: ['assign', {
                'x': 'x*4'
            }, [5]],
            5: ['if', [[('<', ['x', 5])]], [6, 8]],
            6: ['while', [[('<', ['x', 5])]], [7, 10]],
            7: ['assign', {
                'x': 'x+1'
            }, [6]],
            8: ['while', [[('<', ['x', 5])]], [9, 10]],
            9: ['assign', {
                'x': 'x+1'
            }, [8]],
            10: ['assign', {
                'x': '1'
            }, [0]]
        }

        self.assertEqual(result_complex, expected_complex)

        fact_tree = GeneratorAstTree.fact_tree()
        parser_fact = AstToCfgConverter(fact_tree)
        result_fact = parser_fact.get_cfg_graph()

        expected_fact = {
            1: ['assign', {
                'n': '1'
            }, [2]],
            2: ['while', [[('>=', ['x', 1])]], [3, 0]],
            3: ['assign', {
                'n': 'n*x'
            }, [4]],
            4: ['assign', {
                'x': 'x-1'
            }, [2]]
        }

        self.assertEqual(result_fact, expected_fact)
    def test_treat_if_node(self):
        # basic if tree
        basic_if_tree = GeneratorAstTree.basic_if()
        parser_for_basic = AstToCfgConverter(basic_if_tree)
        result_for_basic = parser_for_basic.treat_if_node(basic_if_tree)
        expected_basic = {
            1: ['if', [[('==', ["x", 1])]], [2, 3]],
            2: ['assign', {
                'x': '1'
            }, [4]],
            3: ['assign', {
                'x': 'x+1'
            }, [4]]
        }
        self.assertEqual(result_for_basic, expected_basic)

        # if with sequence inside
        if_tree_with_seq = GeneratorAstTree.if_nested_seq()
        parser = AstToCfgConverter(if_tree_with_seq)
        result = parser.treat_if_node(if_tree_with_seq)
        expected = {
            1: ['if', [[('==', ["x", 1])]], [2, 3]],
            2: ['assign', {
                'x': '1'
            }, [5]],
            3: ['assign', {
                'x': '32'
            }, [4]],
            4: ['assign', {
                'x': 'x*4'
            }, [5]]
        }
        self.assertEqual(result, expected)

        # if with nested while (right)
        if_with_while_right = GeneratorAstTree.if_with_while_right_part()
        parser_for_if_while_right = AstToCfgConverter(if_with_while_right)
        result_for_if_while_right = parser_for_if_while_right.treat_if_node(
            if_with_while_right)

        expected_for_if_while = {
            1: ['if', [[('<', ['x', 5])]], [2, 3]],
            2: ['assign', {
                'x': '1'
            }, [5]],
            3: ['while', [[('<', ['x', 5])]], [4, 5]],
            4: ['assign', {
                'x': 'x+1'
            }, [3]]
        }

        self.assertEqual(result_for_if_while_right, expected_for_if_while)

        # if with nested while (left)
        if_with_while_left = GeneratorAstTree.if_with_while_left_part()
        parser_for_if_while_left = AstToCfgConverter(if_with_while_left)
        result_for_if_while_left = parser_for_if_while_left.treat_if_node(
            if_with_while_left)

        expected_for_if_while_left = {
            1: ['if', [[('<', ['x', 5])]], [2, 4]],
            2: ['while', [[('<', ['x', 5])]], [3, 5]],
            3: ['assign', {
                'x': 'x+1'
            }, [2]],
            4: ['assign', {
                'x': '1'
            }, [5]]
        }
        self.assertEqual(result_for_if_while_left, expected_for_if_while_left)

        # if with two nested while (left and right)
        if_with_two_while = GeneratorAstTree.if_with_two_while()
        parser_for_if_two_while = AstToCfgConverter(if_with_two_while)
        result_for_if_two_while = parser_for_if_two_while.treat_if_node(
            if_with_two_while)

        expected_for_if_two_while = {
            1: ['if', [[('<', ['x', 5])]], [2, 4]],
            2: ['while', [[('<', ['x', 5])]], [3, 6]],
            3: ['assign', {
                'x': 'x+1'
            }, [2]],
            4: ['while', [[('<', ['x', 5])]], [5, 6]],
            5: ['assign', {
                'x': 'x+1'
            }, [4]],
        }

        self.assertEqual(result_for_if_two_while, expected_for_if_two_while)

        # if with nested if
        if_with_if = GeneratorAstTree.if_with_if()
        parser_for_if_if = AstToCfgConverter(if_with_if)
        result_for_if_if = parser_for_if_if.treat_if_node(if_with_if)
        expected_for_if_within_if = {
            1: ['if', [[('<', ['x', 5])]], [2, 3]],
            2: ['assign', {
                'x': '1'
            }, [6]],
            3: ['if', [[('==', ['x', 1])]], [4, 5]],
            4: ['assign', {
                'x': '1'
            }, [6]],
            5: ['assign', {
                'x': 'x+1'
            }, [6]]
        }
        self.assertEqual(result_for_if_if, expected_for_if_within_if)