def test_scenario_2(self):
     # DECLARE count on the line is larger than 1
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "'DECLARE x():                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "'DECLARE y(): DECLARE y():  DECLARE y():                                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE z(a): DECLARE z(b):                                                               "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE w(a): 'DECLARE w():                                                               "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(an_error_list, [1])
     self.assertEqual({'w': {
         'line': 6,
         'parameters': ['a']
     }}, a_dictionary["declares"])
 def test_scenario_1(self):
     # file is empty, file has empty lines, file has lines with only spaces, file has no variables being used
     file_handler = open(glb_input_filename, "w")
     file_handler.write("")
     file_handler.write(glb_new_line_symbol)
     file_handler.write(
         "                                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: some code: some code: some code                                                "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: 'some code: some code: some code                                               "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_available_numeric_references = initialise_available_numeric_references_list(
     )
     an_available_string_references = initialise_available_string_references_list(
     )
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_intermediate_filename, a_dictionary,
         an_available_numeric_references, an_available_string_references)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = resolve_variables_references(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list[0], glb_no_error_code)
         self.assertEqual(an_error_list[1], 0)
         self.assertEqual({}, a_dictionary["variables"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_2(self):
     # CALL count on the line is larger than 1
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE z(a):                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL z(a): 'CALL z(a):  CALL z(a):                                                        "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL z(a): CALL z(b):                                                                     "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list, [50])
         self.assertEqual({'z': {
             'line': 3,
             'parameters': ['a']
         }}, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_9(self):
     # expected numeric but parameter is string
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x ( b ):                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x (\"A\")                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x ( a$ )                                                                              "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x ( 123 )                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x ( a )                                                                               "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list, [56, 56])
         self.assertEqual({'x': {
             'line': 3,
             'parameters': ['b']
         }}, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_7(self):
     # parameters missing
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x(a,b):                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x (v1, )                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x (,v2)                                                                              "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list, [57, 57])
         self.assertEqual({'x': {
             'line': 3,
             'parameters': ['a', 'b']
         }}, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_1(self):
     # file is empty, file has empty lines, file has lines with only spaces, file has no procedures being called
     file_handler = open(glb_input_filename, "w")
     file_handler.write("")
     file_handler.write(glb_new_line_symbol)
     file_handler.write(
         "                                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: some code: some code: some code                                                "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: 'some code: some code: some code                                               "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list, [0])
         self.assertEqual({}, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_4(self):
     # know errors in the code
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET x:                                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         'PRINT "x"                                                                                 '
         + glb_new_line_symbol)
     file_handler.write(
         'PRINT "maximiliam     had     an  x-man in his  x-pocket full of x rays"                  '
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_available_numeric_references = initialise_available_numeric_references_list(
     )
     an_available_string_references = initialise_available_string_references_list(
     )
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_intermediate_filename, a_dictionary,
         an_available_numeric_references, an_available_string_references)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = resolve_variables_references(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list[0], glb_no_error_code)
         self.assertEqual(an_error_list[1], 5)
         self.assertEqual({'x': 'AA'}, a_dictionary["variables"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_5(self):
     # maximum number of parameters exceeded
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x(a,b):                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)                                      "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x (v1, , v3, v4, v5, v6, v7, v8, v9, v10, v11)                                       "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list, [52, 52, 52])
         self.assertEqual({'x': {
             'line': 3,
             'parameters': ['a', 'b']
         }}, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_1(self):
     # file is empty, file has empty lines, file has lines with only spaces, file has no variables defined
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     file_handler = open(glb_input_filename, "w")
     file_handler.write("")
     file_handler.write(glb_new_line_symbol)
     file_handler.write(
         "                                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: some code: some code: some code                                                "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: 'some code: some code: some code :                                             "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(an_error_list, [0])
     self.assertEqual({}, a_dictionary["variables"])
 def test_scenario_2(self):
     # lines include comments and empty lines
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET x:                                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         " LET y: LET z: ' LET w :                                                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "' LET x: LET y: LET z: LET w :                                                            "
         + glb_new_line_symbol)
     file_handler.write(
         "                                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "  LET x$ : LET y$: LET z$ : LET w$:                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         " ' LET a_very_long_name_with_0123 : LET a_very_long_name_with_0123$:                      "
         + glb_new_line_symbol)
     file_handler.write(
         " ' some code : some code : some code : LET abc :                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "   LET p: LET p$                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "LET t : LET t$:                                                                             "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_available_numeric_references = initialise_available_numeric_references_list(
     )
     an_available_string_references = initialise_available_string_references_list(
     )
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_intermediate_filename, a_dictionary,
         an_available_numeric_references, an_available_string_references)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = resolve_variables_references(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list[0], glb_no_error_code)
         self.assertEqual(an_error_list[1], 10)
         self.assertEqual(
             {
                 'x': 'AA',
                 'y': 'AB',
                 'z': 'AC',
                 'x$': 'AA$',
                 'y$': 'AB$',
                 'z$': 'AC$',
                 'w$': 'AD$',
                 'p': 'AD',
                 't': 'AE',
                 't$': 'AE$'
             }, a_dictionary["variables"])
     else:
         self.fail("error on pre-condition method.")
    def test_scenario_3(self):
        # easy examples
        file_handler = open(glb_input_filename, "w")
        file_handler.write(
            "LET x:                                                                                    "
            + glb_new_line_symbol)
        file_handler.write(
            "x = x + x - x * x / x + (x - x)                                                           "
            + glb_new_line_symbol)
        file_handler.write(
            "x = 1 + x                                                                                 "
            + glb_new_line_symbol)
        file_handler.write(
            "x=1+x                                                                                     "
            + glb_new_line_symbol)
        file_handler.write(
            "PRINT x                                                                                   "
            + glb_new_line_symbol)
        file_handler.write(
            "GOSUB x                                                                                   "
            + glb_new_line_symbol)
        file_handler.write(
            "GOTO x + 1 : GOSUB 1 + x: GOSUB x                                                         "
            + glb_new_line_symbol)
        file_handler.write(
            "GOTO 1 + x                                                                                "
            + glb_new_line_symbol)
        file_handler.write(
            "DRAW(x, x, x, x)                                                                          "
            + glb_new_line_symbol)
        file_handler.write(
            "PAINT(x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,xy,yx,yxz,xyz,yzx,                      "
            + glb_new_line_symbol)
        file_handler.write(
            "ON     x     GOTO     x                                                                   "
            + glb_new_line_symbol)

        file_handler.write(
            "DRAW(x + x, x, xy, x, x, x, x, x,x,x  x , x, x, x,xy,yx,yxz,xyz,yzx,xx,xxx,xxxx,x):x      "
            + glb_new_line_symbol)
        file_handler.close()
        a_dictionary = initialise_a_reference_dictionary()
        an_available_numeric_references = initialise_available_numeric_references_list(
        )
        an_available_string_references = initialise_available_string_references_list(
        )
        an_error_list = prepare_variables_references(
            glb_input_filename, glb_intermediate_filename, a_dictionary,
            an_available_numeric_references, an_available_string_references)
        if an_error_list[0] == glb_no_error_code:
            an_error_list = resolve_variables_references(
                glb_intermediate_filename, glb_output_filename, a_dictionary)
            self.assertEqual(an_error_list[0], glb_no_error_code)
            self.assertEqual(an_error_list[1], 56)
            self.assertEqual({'x': 'AA'}, a_dictionary["variables"])
        else:
            self.fail("error on pre-condition method.")
 def test_scenario_10(self):
     # valid calls
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x ( b ):                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE y ( b$ ):                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE z (p1, p2$, p3):                                                                   "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x ( 123 )                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x ( a )                                                                               "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL y (\"A\")                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL y ( a$ )                                                                              "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL z ( a, b$, c )                                                                        "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL z ( 123, \"HELLO\", 456 )                                                             "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(an_error_list, [0])
         self.assertEqual(
             {
                 'x': {
                     'line': 3,
                     'parameters': ['b']
                 },
                 'y': {
                     'line': 6,
                     'parameters': ['b$']
                 },
                 'z': {
                     'line': 9,
                     'parameters': ['p1', 'p2$', 'p3']
                 }
             }, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_2(self):
     # scenario - duplicated reference name - uniqueness
     file_handler = open(glb_input_filename, "w")
     file_handler.write("_correct1:                                               " + glb_new_line_symbol)
     file_handler.write("some code                                                " + glb_new_line_symbol)
     file_handler.write("_correct1:                                               " + glb_new_line_symbol)
     file_handler.write("some code                                                " + glb_new_line_symbol)
     file_handler.close()
     a_reference_dictionary = initialise_a_reference_dictionary()
     error_codes_list = prepare_goto_and_gosub_references(glb_input_filename, glb_output_filename, a_reference_dictionary)
     self.assertEqual(a_reference_dictionary["gotogosub"],
                      {'_correct1': {'file_line': "1"}})
     self.assertEqual(error_codes_list, [glb_error_gotogosub_duplicate_reference])
 def test_scenario_6(self):
     # all valid
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET x: LET y: LET z: LET w :                                                              "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x$ : LET y$: LET z$ : LET w$:                                                         "
         + glb_new_line_symbol)
     file_handler.write(
         "LET a_very_long_name_with_0123 : LET a_very_long_name_with_0123$:                         "
         + glb_new_line_symbol)
     file_handler.write(
         " some code : some code : some code : LET abc :                                            "
         + glb_new_line_symbol)
     file_handler.write(
         "LET _a_valid_name: LET _a_valid_name$:                                                    "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(an_error_list, [0])
     self.assertEqual(
         {
             'x': 'AA',
             'y': 'AB',
             'z': 'AC',
             'w': 'AD',
             'x$': 'AA$',
             'y$': 'AB$',
             'z$': 'AC$',
             'w$': 'AD$',
             'a_very_long_name_with_0123': 'AE',
             'a_very_long_name_with_0123$': 'AE$',
             'abc': 'AF',
             '_a_valid_name': 'AG',
             '_a_valid_name$': 'AF$'
         }, a_dictionary["variables"])
 def test_scenario_4(self):
     # duplicated procedure declaration - uniqueness
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE z(a):                                                                              "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE z():                                                                              "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(an_error_list, [6])
     self.assertEqual({'z': {
         'line': 3,
         'parameters': ['a']
     }}, a_dictionary["declares"])
 def test_scenario_1(self):
     # DECLARE identifier is defined first
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE _x():                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "LET _x:                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "_x:                                                                 "
         + glb_new_line_symbol)
     file_handler.close()
     #
     a_dictionary = initialise_a_reference_dictionary()
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     #
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(an_error_list, [glb_no_error_code])
     self.assertEqual({'_x': {
         'line': 2,
         'parameters': []
     }}, a_dictionary["declares"])
     #
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(an_error_list,
                      [glb_error_declare_duplicate_identifier])
     self.assertEqual({}, a_dictionary["variables"])
     #
     an_error_list = prepare_goto_and_gosub_references(
         glb_input_filename, glb_output_filename, a_dictionary)
     self.assertEqual(an_error_list,
                      [glb_error_declare_duplicate_identifier])
     self.assertEqual({}, a_dictionary["gotogosub"])
 def test_scenario_4(self):
     # uniqueness
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET x: LET x:                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x$ : LET x$:                                                                          "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(an_error_list, [45, 45])
     self.assertEqual({'x': 'AA', 'x$': 'AA$'}, a_dictionary["variables"])
 def test_scenario_3(self):
     # invalid variables names
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET 0: LET 10: LET 200: LET 012345:                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "LET 0$ : LET 10$ : LET 200$ : LET 012345$:                                                "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(an_error_list, [46, 46, 46, 46, 46, 46, 46, 46])
     self.assertEqual({}, a_dictionary["variables"])
 def test_scenario_1(self):
     # file is empty, file has empty lines, file has lines with only spaces, file has no procedures declared
     file_handler = open(glb_input_filename, "w")
     file_handler.write("")
     file_handler.write(glb_new_line_symbol)
     file_handler.write(
         "                                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: some code: some code: some code                                                "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: 'some code: some code: some code                                               "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(an_error_list, [0])
     self.assertEqual({}, a_dictionary["declares"])
 def test_scenario_7(self):
     # missing parameters
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x (v1, v1):                                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE y (v2$, v2$):                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE z (v1, v2$):                                                                      "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE w ():                                                                             "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(an_error_list, [4, 4])
     self.assertEqual(
         {
             'x': {
                 'line': 3,
                 'parameters': ['v1']
             },
             'y': {
                 'line': 6,
                 'parameters': ['v2$']
             },
             'z': {
                 'line': 9,
                 'parameters': ['v1', 'v2$']
             },
             'w': {
                 'line': 11,
                 'parameters': []
             }
         }, a_dictionary["declares"])
 def test_scenario_5(self):
     # maximum number of parameters exceeded
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11):                                 "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE y (v1, v2, v3, v4, v5, v6$, v7, v8, v9, v10):                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE z (v1):                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE w ():                                                                             "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(an_error_list, [5])
     self.assertEqual(
         {
             'y': {
                 'line':
                 4,
                 'parameters': [
                     'v1', 'v2', 'v3', 'v4', 'v5', 'v6$', 'v7', 'v8', 'v9',
                     'v10'
                 ]
             },
             'z': {
                 'line': 7,
                 'parameters': ['v1']
             },
             'w': {
                 'line': 9,
                 'parameters': []
             }
         }, a_dictionary["declares"])
 def test_scenario_1(self):
     # scenario 1
     file_handler = open(glb_input_filename, "w")
     file_handler.write(glb_new_line_symbol)
     file_handler.write("                                                         " + glb_new_line_symbol)
     file_handler.write("some code not related                                    " + glb_new_line_symbol)
     file_handler.write("_invalid_reference :                                     " + glb_new_line_symbol)
     file_handler.write("_invalid_reference :                                     " + glb_new_line_symbol)
     file_handler.write("_invalid_reference                                       " + glb_new_line_symbol)
     file_handler.write("       _invalid_reference :                              " + glb_new_line_symbol)
     file_handler.write("_ invalid_reference:                                     " + glb_new_line_symbol)
     file_handler.write("   _ invalid_reference:                                  " + glb_new_line_symbol)
     file_handler.write("   _     invalid_reference:                              " + glb_new_line_symbol)
     file_handler.write("    _ invalid_reference :                                " + glb_new_line_symbol)
     file_handler.write("    invalid_reference                                    " + glb_new_line_symbol)
     file_handler.write("invalid_reference:                                       " + glb_new_line_symbol)
     file_handler.write("invalid_reference :                                      " + glb_new_line_symbol)
     file_handler.write("'_irrelevant:                                            " + glb_new_line_symbol)
     file_handler.write("'_irrelevant:                                            " + glb_new_line_symbol)
     file_handler.write("' _irrelevant                                            " + glb_new_line_symbol)
     file_handler.write("      _correct:                                          " + glb_new_line_symbol)
     file_handler.write("_correct1:                                               " + glb_new_line_symbol)
     file_handler.write("_correct2:'some comment                                  " + glb_new_line_symbol)
     file_handler.write("_correct3: 'some comment                                 " + glb_new_line_symbol)
     file_handler.write("_correct4: some code                                     " + glb_new_line_symbol)
     file_handler.write("_correct5:       some code                               " + glb_new_line_symbol)
     file_handler.write("_correct5:       some code  'duplicate                   " + glb_new_line_symbol)
     file_handler.write("some code: _invalid_reference:                           " + glb_new_line_symbol)
     file_handler.write("some code:       _invalid_reference:                     " + glb_new_line_symbol)
     file_handler.close()
     a_reference_dictionary = initialise_a_reference_dictionary()
     error_codes_list = prepare_goto_and_gosub_references(glb_input_filename, glb_output_filename, a_reference_dictionary)
     print(a_reference_dictionary)
     self.assertEqual(a_reference_dictionary["gotogosub"],
                      {'_correct': {'file_line': '18'}, '_correct1': {'file_line': '19'},
                       '_correct2': {'file_line': '20'}, '_correct3': {'file_line': '21'},
                       '_correct4': {'file_line': '22'}, '_correct5': {'file_line': '23'}})
     self.assertEqual(error_codes_list, [10])
 def test_scenario_5(self):
     # number of variables exceeded
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     an_available_numeric_references_list.clear()
     an_available_string_references_list.clear()
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET y:                                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         "LET y$:                                                                                   "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(an_error_list, [44, 43])
     self.assertEqual({}, a_dictionary["variables"])
 def test_scenario_3(self):
     # Syntax errors
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "      DECLARE x():                                                                        "
         + glb_new_line_symbol)
     file_handler.write(
         "    DECLARE     x    (    )    :                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: DECLARE z(x) ' DECLARE z ( x )                                                 "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: DECLARE z(x): ' DECLARE z ( x )                                                "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE                                                                                   "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name                                                                            "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name(                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name (                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name)                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name )                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name_1(x)                                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name_1b )x(                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name_2 (x)                                                                      "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name_3 ( x )                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name 4(a)                                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name 5 (a)                                                                      "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name6(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10)                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name7(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)                             "
         + glb_new_line_symbol)
     file_handler.write(
         "DECLARE a_name7               4 (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11)            "
         + glb_new_line_symbol)
     file_handler.write(
         "    DECLARE    a_name8      (v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,                     "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(glb_input_filename,
                                                   glb_output_filename,
                                                   a_dictionary)
     self.assertEqual(
         an_error_list,
         [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8])
     self.assertEqual({}, a_dictionary["declares"])
 def test_scenario_2(self):
     # not valid variables declarations
     an_available_numeric_references_list = initialise_available_numeric_references_list(
     )
     an_available_string_references_list = initialise_available_string_references_list(
     )
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "LET                                                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "LET : LET : LET : LET  :                                                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "LET :                                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x                                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "LET 0                                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "LET (                                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x                                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x$                                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x + y                                                                                 "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x, y, z:                                                                              "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x, y, z: LET x y z: LET z                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x, y, z: LET x y z: LET z :                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "LET z                                                                                     "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x, :                                                                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x,                                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         "LET x : LET y                                                                             "
         + glb_new_line_symbol)
     file_handler.write(
         "LET z  LET w :                                                                            "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = prepare_variables_references(
         glb_input_filename, glb_output_filename, a_dictionary,
         an_available_numeric_references_list,
         an_available_string_references_list)
     self.assertEqual(
         an_error_list,
         [42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42])
     self.assertEqual({
         'z': 'AA',
         'x': 'AB',
         'w': 'AC'
     }, a_dictionary["variables"])
 def test_scenario_3(self):
     # Syntax errors
     file_handler = open(glb_input_filename, "w")
     file_handler.write(
         "DECLARE x(a,b):                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "      CALL x(1,2                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "    CALL x 1,2)                                                                           "
         + glb_new_line_symbol)
     file_handler.write(
         "    CALL (x 1,2)                                                                          "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: CALL x(x, ' CALL z ( x )                                                       "
         + glb_new_line_symbol)
     file_handler.write(
         "some code: CALL x x,y): ' CALL z ( x )                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL                                                                                      "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x                                                                                    "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x(                                                                                   "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x)                                                                                   "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x )                                                                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x (                                                                                  "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x )x(                                                                                "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x(10, 'A', t, my variable_1):                                                        "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x y z (10, 'A', t, my_variable_1):                                                   "
         + glb_new_line_symbol)
     file_handler.write(
         "CALL x.y.z (10, 'A', t, my_variable_1):                                                   "
         + glb_new_line_symbol)
     file_handler.close()
     a_dictionary = initialise_a_reference_dictionary()
     an_error_list = process_procedure_declaration(
         glb_input_filename, glb_intermediate_filename, a_dictionary)
     if an_error_list[0] == glb_no_error_code:
         an_error_list = process_procedure_calling(
             glb_intermediate_filename, glb_output_filename, a_dictionary)
         self.assertEqual(
             an_error_list,
             [55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55])
         self.assertEqual({'x': {
             'line': 3,
             'parameters': ['a', 'b']
         }}, a_dictionary["declares"])
     else:
         self.fail("error on pre-condition method.")
 def test_scenario_1(self):
     # scenario 1
     file_handler = open(glb_input_filename, "w")
     file_handler.write(glb_new_line_symbol)
     file_handler.write(
         "PRINT:PRINT:PRINT:                                           " +
         glb_new_line_symbol)
     file_handler.write(
         "_location_01:                                                 " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                             " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB _location_01:                                           " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB           _location_01:                                 " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB_location_01:                                            " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "some code : GOSUB _location_01:                               " +
         glb_new_line_symbol)
     file_handler.write(
         "some code: GOSUB           _location_01:                      " +
         glb_new_line_symbol)
     file_handler.write(
         "some code:GOSUB_location_01:                                  " +
         glb_new_line_symbol)
     file_handler.write(
         "some code:GOSUB _location_01:                                  " +
         glb_new_line_symbol)
     file_handler.write(
         "some code :GOSUB_location_01:                                 " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB location_01:                                            " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB           location_01:                                  " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUBlocation_01:                                             " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB _location_01                                            " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB           _location_01                                  " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB_location_01                                             " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB location_01                                             " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB           location_01                                   " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUBlocation_01                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB _location_01: : GOSUB _location_01:                     " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB _location_01:: commands : GOSUB _location_01:           " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "_location_02:                                                 " +
         glb_new_line_symbol)
     file_handler.write(
         "_location_22:                                                 " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB _location_23:                                           " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB                                                         " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "'GOSUB _location_22:                                          " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB  _location_02: ' GOSUB _location_22: GOSUB _location_30:" +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB  _location_02:GOSUB _location_22: '  GOSUB _location_30:" +
         glb_new_line_symbol)
     file_handler.write(
         "commands : GOSUB  _location_02: commands ' GOSUB _location_22:" +
         glb_new_line_symbol)
     file_handler.write(
         "commands : GOSUB  _location_02: commands :GOSUB _location_22: " +
         glb_new_line_symbol)
     file_handler.write(
         "                                                              " +
         glb_new_line_symbol)
     file_handler.write(
         "GOSUB_location_02::GOSUB_location_22::GOSUB _location_30:     " +
         glb_new_line_symbol)
     file_handler.close()
     a_reference_dictionary = initialise_a_reference_dictionary()
     error_codes_list = prepare_goto_and_gosub_references(
         glb_input_filename, glb_output_filename, a_reference_dictionary)
     if error_codes_list[0] == glb_no_error_code:
         error_codes_list = resolve_gosub_references(
             glb_input_filename, glb_output_filename,
             a_reference_dictionary)
         self.assertEqual(error_codes_list, [31, 31])
     else:
         self.fail("error on pre-condition method.")