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_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_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_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_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_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_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_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_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.")