Esempio n. 1
0
    def test_break(self):
        with io.StringIO() as buf, redirect_stdout(buf):
            with FileManager(
                    "Testing/Final_Test_Cases/break_in_nested_while.txt"
            ) as file_manager:
                tokeniser = Tokeniser(file_manager)
                analysed_tokens = []
                analysed_tokens.append(Token("START_OF_FILE", "", 0))
                while (analysed_tokens[-1].type is not "END_OF_FILE"):
                    analysed_tokens.append(tokeniser.get_token())

                analysed_tokens = analysed_tokens[1:]

                parsed = ProgramNode(analysed_tokens[::-1], file_manager)
                parsed.execute()

                solution = """1
10
100
1
10
100
1
10
100"""

                for line_sol, line_test in zip(solution.rstrip('\r'),
                                               buf.getvalue().rstrip('\r')):
                    self.compare_output(line_sol, line_test)
    def test1(self):
        with FileManager("Testing/Lexer_Test_Cases/test1.txt") as file_manager:
            tokens = self.loop_test(file_manager)

            expected = [("FOR_EACH_PLAYER", "forEachPlayer"),
                        ("LEFT_ROUND", "("), ("LOGICAL_NOT", "!"),
                        ("IDENTIFIER", "player.inPrison"),
                        ("RIGHT_ROUND", ")"), ("LEFT_CURLY", "{"),
                        ("IDENTIFIER", "player.score"), ("ASSIGNMENT", "="),
                        ("IDENTIFIER", "player.score"), ("PLUS", "+"),
                        ("ROLL", "roll"), ("LEFT_ROUND", "("),
                        ("NATURAL_NUMBER", "6"), ("RIGHT_ROUND", ")"),
                        ("RIGHT_CURLY", "}"),
                        ("FOR_EACH_PLAYER", "forEachPlayer"),
                        ("LEFT_ROUND", "("), ("IDENTIFIER", "player.inPrison"),
                        ("RIGHT_ROUND", ")"), ("LEFT_CURLY", "{"),
                        ("IF", "if"), ("LEFT_ROUND", "("), ("ROLL", "roll"),
                        ("LEFT_ROUND", "("), ("NATURAL_NUMBER", "4"),
                        ("RIGHT_ROUND", ")"), ("EQUAL_TO", "=="),
                        ("NATURAL_NUMBER", "4"), ("RIGHT_ROUND", ")"),
                        ("LEFT_CURLY", "{"), ("IDENTIFIER", "player.inPrison"),
                        ("ASSIGNMENT", "="), ("REAL_NUMBER", "0"),
                        ("SEMICOLON", ";"), ("RIGHT_CURLY", "}"),
                        ("RIGHT_CURLY", "}"), ("END_OF_FILE", "")]

            self.compare_tokens(expected, tokens)
    def test3(self):
        with FileManager("Testing/Lexer_Test_Cases/test3.txt") as file_manager:
            tokens = self.loop_test(file_manager)

            expected = [("WHILE", "while"), ("LEFT_ROUND", "("),
                        ("LOGICAL_NOT", "!"), ("IDENTIFIER", "finished"),
                        ("RIGHT_ROUND", ")"), ("LEFT_CURLY", "{"),
                        ("FOR_EACH_PLAYER", "forEachPlayer"),
                        ("LEFT_ROUND", "("), ("NATURAL_NUMBER", "1"),
                        ("RIGHT_ROUND", ")"), ("LEFT_CURLY", "{"),
                        ("CHOICE", "choice"), ("LEFT_ROUND", "("),
                        ("NATURAL_NUMBER", "20"), ("RIGHT_ROUND", ")"),
                        ("LEFT_CURLY", "{"), ("LEFT_SQUARE", "["),
                        ("ROLL", "roll"), ("GREATER_OR_EQUAL", ">="),
                        ("NATURAL_NUMBER", "20"), ("LOGICAL_AND", "and"),
                        ("LEFT_ROUND", "("), ("IDENTIFIER", "chosen.score"),
                        ("GREATER_OR_EQUAL", ">="), ("NATURAL_NUMBER", "3"),
                        ("RIGHT_ROUND", ")"), ("RIGHT_SQUARE", "]"),
                        ("LEFT_CURLY", "{"), ("IDENTIFIER", "player.score"),
                        ("ASSIGNMENT", "="), ("IDENTIFIER", "player.score"),
                        ("PLUS", "+"), ("ROLL", "roll"), ("LEFT_ROUND", "("),
                        ("NATURAL_NUMBER", "5"), ("RIGHT_ROUND", ")"),
                        ("SEMICOLON", ";"), ("IDENTIFIER", "chosen.score"),
                        ("ASSIGNMENT", "="), ("IDENTIFIER", "chosen.score"),
                        ("MINUS", "-"), ("NATURAL_NUMBER", "3"),
                        ("SEMICOLON", ";"), ("RIGHT_CURLY", "}"),
                        ("LEFT_SQUARE", "["), ("ROLL", "roll"),
                        ("GREATER_OR_EQUAL", ">="), ("NATURAL_NUMBER", "18"),
                        ("LOGICAL_AND", "and"), ("LEFT_ROUND", "("),
                        ("IDENTIFIER", "tokens"), ("GREATER_OR_EQUAL", ">="),
                        ("NATURAL_NUMBER", "1"), ("RIGHT_ROUND", ")"),
                        ("RIGHT_SQUARE", "]"), ("LEFT_CURLY", "{"),
                        ("IDENTIFIER", "player.score"), ("ASSIGNMENT", "="),
                        ("IDENTIFIER", "player.score"), ("PLUS", "+"),
                        ("NATURAL_NUMBER", "2"), ("SEMICOLON", ";"),
                        ("IDENTIFIER", "tokens"), ("ASSIGNMENT", "="),
                        ("IDENTIFIER", "tokens"), ("MINUS", "-"),
                        ("NATURAL_NUMBER", "1"), ("SEMICOLON", ";"),
                        ("RIGHT_CURLY", "}"), ("LEFT_SQUARE", "["),
                        ("ROLL", "roll"), ("GREATER_OR_EQUAL", ">="),
                        ("NATURAL_NUMBER", "15"), ("RIGHT_SQUARE", "]"),
                        ("LEFT_CURLY", "{"), ("IDENTIFIER", "player.score"),
                        ("PLUS", "+"), ("ASSIGNMENT", "="),
                        ("NATURAL_NUMBER", "1"), ("SEMICOLON", ";"),
                        ("RIGHT_CURLY", "}"), ("RIGHT_CURLY", "}"),
                        ("IF", "if"), ("LEFT_ROUND", "("),
                        ("IDENTIFIER", "player.score"), ("GREATER", ">"),
                        ("NATURAL_NUMBER", "20"), ("RIGHT_ROUND", ")"),
                        ("LEFT_CURLY", "{"), ("IDENTIFIER", "finished"),
                        ("ASSIGNMENT", "="), ("NATURAL_NUMBER", "1"),
                        ("SEMICOLON", ";"), ("IDENTIFIER", "player.won"),
                        ("ASSIGNMENT", "="), ("NATURAL_NUMBER", "1"),
                        ("SEMICOLON", ";"), ("BREAK", "break"),
                        ("SEMICOLON", ";"), ("RIGHT_CURLY", "}"),
                        ("RIGHT_CURLY", "}"), ("RIGHT_CURLY", "}"),
                        ("END_OF_FILE", "")]

            self.compare_tokens(expected, tokens)
Esempio n. 4
0
def run(path):
    file_manager = FileManager(path)
    with file_manager as fm:
        tokeniser = Tokeniser(fm)
        analysed_tokens = []
        analysed_tokens.append(Token("START_OF_FILE", "", 0))
        while (analysed_tokens[-1].type is not "END_OF_FILE"):
            analysed_tokens.append(tokeniser.get_token())

        analysed_tokens = analysed_tokens[1:]
        print_tokens(analysed_tokens)

        parsed = ProgramNode(analysed_tokens[::-1], file_manager)
        print_tree(parsed, 0)

        print("==========")
        parsed.execute()
    def test2(self):
        with FileManager("Testing/Lexer_Test_Cases/test2.txt") as file_manager:
            tokens = self.loop_test(file_manager)

            expected = [("PLAYERS", "PLAYERS"), ("NATURAL_NUMBER", "2"),
                        ("GAME", "GAME"), ("COLON", ":"),
                        ("IDENTIFIER", "tokens"), ("ASSIGNMENT", "="),
                        ("NATURAL_NUMBER", "10"), ("SEMICOLON", ";"),
                        ("IDENTIFIER", "finished"), ("ASSIGNMENT", "="),
                        ("REAL_NUMBER", "0"), ("SEMICOLON", ";"),
                        ("INDIVIDUAL", "INDIVIDUAL"), ("COLON", ":"),
                        ("IDENTIFIER", "score"), ("ASSIGNMENT", "="),
                        ("REAL_NUMBER", "0"), ("SEMICOLON", ";"),
                        ("FUNCTIONS", "FUNCTIONS"), ("COLON", ":"),
                        ("FUNCTION_DEF", "def"), ("IDENTIFIER", "getScore"),
                        ("LEFT_ROUND", "("), ("IDENTIFIER", "playerscore"),
                        ("COMMA", ","), ("IDENTIFIER", "gametokens"),
                        ("RIGHT_ROUND", ")"), ("LEFT_CURLY", "{"),
                        ("VARIABLE_ASSIGN", "var"), ("IDENTIFIER", "retScore"),
                        ("SEMICOLON", ";"), ("IDENTIFIER", "retScore"),
                        ("ASSIGNMENT", "="), ("NATURAL_NUMBER", "2"),
                        ("MULTIPLICATION", "*"), ("IDENTIFIER", "playerscore"),
                        ("MINUS", "-"), ("IDENTIFIER", "gametokens"),
                        ("SEMICOLON", ";"), ("RETURN", "return"),
                        ("IDENTIFIER", "retScore"), ("SEMICOLON", ";"),
                        ("RIGHT_CURLY", "}"), ("RUN", "RUN"), ("COLON", ":"),
                        ("FOR_EACH_PLAYER", "forEachPlayer"),
                        ("LEFT_ROUND", "("), ("NATURAL_NUMBER", "1"),
                        ("RIGHT_ROUND", ")"), ("LEFT_CURLY", "{"),
                        ("IDENTIFIER", "player.won"), ("ASSIGNMENT", "="),
                        ("NATURAL_NUMBER", "1"), ("SEMICOLON", ";"),
                        ("BREAK", "break"), ("SEMICOLON", ";"),
                        ("RIGHT_CURLY", "}"), ("WIN", "WIN"), ("COLON", ":"),
                        ("LEFT_SQUARE", "["), ("IDENTIFIER", "won"),
                        ("EQUAL_TO", "=="), ("NATURAL_NUMBER", "1"),
                        ("RIGHT_SQUARE", "]"), ("END_OF_FILE", "")]

            self.compare_tokens(expected, tokens)
 def test_unknown_char(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(error_manager.ErrorManager,
                           Tokeniser(fm).get_token)
         self.assertTrue(mock_error.called)
 def test_number_with_2_separators(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(error_manager.ErrorManager,
                           lambda: loop_test(fm))
         self.assertTrue(mock_error.called)
 def test_number_with_comma_but_no_decimal(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(error_manager.ErrorManager,
                           lambda: loop_test(fm))
         self.assertTrue(mock_error.called)
Esempio n. 9
0
 def test_too_many_playerheaders(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
 def test_number_starting_with_0(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(error_manager.ErrorManager,
                           Tokeniser(fm).get_token)
         self.assertTrue(mock_error.called)
Esempio n. 11
0
 def test_print_wrong_char(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
Esempio n. 12
0
 def test_math_with_string2(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
Esempio n. 13
0
 def test_access_existing_without_value(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
 def assert_equal_tokens(self, expected):
     with FileManager("") as fm:
         for _type, _value in expected:
             token = Tokeniser(fm).get_token()
             self.assertEqual(_type, token.type)
             self.assertEqual(_value, token.value)
Esempio n. 15
0
 def test_function_no_body(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
Esempio n. 16
0
 def test_assign_chosen_variable_not_defined(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
Esempio n. 17
0
 def test_rolled_inited(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))
 def test_realnumber_too_long(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(error_manager.ErrorManager,
                           Tokeniser(fm).get_token)
         self.assertTrue(mock_error.called)
Esempio n. 19
0
 def test_minus_without_number(self, mock_error, mock_open):
     with FileManager("") as fm:
         self.assertRaises(Parser.error_manager.ErrorManager, lambda: run_program(fm))