def test_init(self): with self.assertRaises(Exception): Position(None) with self.assertRaises(Exception): Position(None, None) position = Position(self.source) self.assertEqual(position.get_index(), position._index) self.assertEqual(position.get_line_number(), position._line_number) self.assertEqual(position.get_line_position(), position._line_position) self.assertEqual(position.get_index(), 0) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) self.assertTrue(position.move(5)) position_2 = Position(position=position) self.assertEqual(position.get_index(), position_2.get_index()) self.assertEqual(position.get_line_number(), position_2.get_line_number()) self.assertEqual(position.get_line_position(), position_2.get_line_position())
def __init__(self, parent: 'Scope', open_statement_position: Position, close_statement_position: Position = None, type: Header.Type = Header.Type.UNKNOWN): self.id = next(Scope.STATIC_ID) self.blocks_of_instructions = BlocksOfInstructions() self.header = Header(open_statement_position.get_index(), type) self.parent = parent self.childs = [] self.open_statement_position = Position(position=open_statement_position) if close_statement_position == None: self.close_statement_position = Position(position=open_statement_position) else: self.close_statement_position = Position( position=close_statement_position)
def test_set_positions(self): position = Position(self.source) self.assertTrue(position.move(7)) self.assertEqual(position.get_character(), " ") # When there's no characters after spaces self.source.str = " " * 5 position = Position(self.source) self.assertFalse(position.set_after_spaces()) self.assertEqual(position.get_index(), 0) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) # When there's no characters before spaces self.assertTrue(position.go_to_end_of_line()) self.assertFalse(position.set_before_spaces()) self.assertEqual(position.get_index(), 4) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 5) # When there's are characters after spaces self.source.restore() position = Position(self.source) self.assertTrue(position.move(7)) self.assertTrue(position.set_after_spaces()) self.assertEqual(position.get_index(), 13) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 14) self.assertEqual(position.get_character(), "s") # When there's are characters before spaces self.assertTrue(position.set_before_spaces()) self.assertEqual(position.get_index(), 6) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 7) self.assertEqual(position.get_character(), "s") # With default argument self.assertTrue(position.go_to_begin_of_line()) self.assertEqual(position.get_index(), 0) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) # With default argument self.assertTrue(position.go_to_end_of_line()) self.assertEqual(position.get_index(), 19) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 20) # With given arguments, go through some different variations self.assertTrue(position.go_to_begin_of_line(6)) self.assertEqual(position.get_character(), "T") self.assertEqual(position.get_index(), 61) self.assertEqual(position.get_line_number(), 6) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.go_to_begin_of_line(10)) self.assertEqual(position.get_index(), 157) self.assertEqual(position.get_line_number(), 10) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.go_to_begin_of_line(2)) self.assertEqual(position.get_character(), "T") self.assertEqual(position.get_index(), 20) self.assertEqual(position.get_line_number(), 2) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.go_to_begin_of_line(5)) self.assertEqual(position.get_index(), 60) self.assertEqual(position.get_line_number(), 5) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.go_to_begin_of_line(1)) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) # With given arguments, go through some different variations self.assertTrue(position.go_to_end_of_line(1)) self.assertEqual(position.get_index(), 19) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 20) # self.assertTrue(position.go_to_end_of_line(5)) self.assertEqual(position.get_index(), 60) self.assertEqual(position.get_line_number(), 5) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.go_to_end_of_line(10)) self.assertEqual(position.get_index(), 178) self.assertEqual(position.get_line_number(), 10) self.assertEqual(position.get_line_position(), 22) # Go to not exist lines self.assertFalse(position.go_to_begin_of_line(200)) self.assertEqual(position.get_index(), 178) self.assertEqual(position.get_line_number(), 10) self.assertEqual(position.get_line_position(), 22) # self.assertFalse(position.go_to_end_of_line(1011)) self.assertEqual(position.get_index(), 178) self.assertEqual(position.get_line_number(), 10) self.assertEqual(position.get_line_position(), 22) # Find bound right parenthesis containing others bounded parentheses self.assertTrue(position.go_to_begin_of_line(9)) self.assertTrue(position.move(5)) self.assertEqual(position.get_line_position(), 6) self.assertEqual(position.get_character(), "(") # self.assertTrue(position.set_at_right_bound_parenthesis()) self.assertEqual(position.get_line_position(), 27) self.assertEqual(position.get_character(), ")") # Find bound left parenthesis containing others bounded parentheses self.assertTrue(position.set_at_left_bound_parenthesis()) self.assertEqual(position.get_line_position(), 6) self.assertEqual(position.get_character(), "(") # When bound parenthesis not exist self.assertTrue(position.go_to_begin_of_line(8)) self.assertTrue(position.move(16)) self.assertFalse(position.set_at_left_bound_parenthesis()) self.assertEqual(position.get_line_position(), 17) # self.assertTrue(position.go_to_begin_of_line(10)) self.assertTrue(position.move(16)) self.assertFalse(position.set_at_right_bound_parenthesis()) self.assertEqual(position.get_line_position(), 17) # When index is not set at parenthesis self.assertTrue(position.go_to_begin_of_line(6)) self.assertFalse(position.set_at_left_bound_parenthesis()) self.assertFalse(position.set_at_right_bound_parenthesis())
def test_move_and_rmove(self): position = Position(self.source) first_line_data = "This is test string\n" first_line_lenght = len(first_line_data) # Move with default parameter self.assertTrue(position.move()) self.assertEqual(position.get_index(), 1) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 2) # Move with given parameter self.assertTrue(position.move(2)) self.assertEqual(position.get_index(), 3) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 4) # Move throught new line self.assertTrue(position.move(first_line_lenght)) self.assertEqual(position.get_index(), first_line_lenght + 3) self.assertEqual(position.get_line_number(), 2) self.assertEqual(position.get_line_position(), 4) # Rmove throught new line self.assertTrue(position.rmove(first_line_lenght)) self.assertEqual(position.get_index(), 3) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 4) # Rmove with given parameter self.assertTrue(position.rmove(2)) self.assertEqual(position.get_index(), 1) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 2) # Rmove with default parameter self.assertTrue(position.rmove()) self.assertEqual(position.get_index(), 0) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) # Test move throught many new lines self.assertTrue(position.move(61)) self.assertEqual(position.get_index(), 61) self.assertEqual(position.get_line_number(), 6) self.assertEqual(position.get_line_position(), 1) # Test rmove throught many new lines self.assertTrue(position.rmove()) self.assertEqual(position.get_line_number(), 5) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.rmove()) self.assertEqual(position.get_line_number(), 4) self.assertEqual(position.get_line_position(), 1) # self.assertTrue(position.rmove()) self.assertEqual(position.get_line_number(), 3) self.assertEqual(position.get_line_position(), 19) # self.assertTrue(position.rmove(58)) self.assertEqual(position.get_index(), 0) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) # Test move outside source range position = Position(self.source) self.assertFalse(position.rmove()) self.assertEqual(position.get_index(), 0) self.assertEqual(position.get_line_number(), 1) self.assertEqual(position.get_line_position(), 1) self.assertTrue(position.go_to_end_of_line(10)) # self.assertFalse(position.move()) self.assertEqual(position.get_index(), 178) self.assertEqual(position.get_line_number(), 10) self.assertEqual(position.get_line_position(), 22)
def _set_header_to_scope(self, scope: Scope): """ Set header to scope Args: scope: scope to set header. Raises: Exception: When occure problem while settup header. """ current_position = Position(position=scope.open_statement_position) # * <- * # ')' <- ') {' current_position.set_before_spaces() scope_type = Header.Type.UNKNOWN scope_header_start = 0 scope_header_size = 0 its_not_function = False if current_position.get_character() == ')': # Possible: [function] or [while] or [if] # * <-* # 'while( (a) > (b) )' found = util.rfind(self.source.str, '(', current_position.get_index()) if found == -1: raise Exception("Not found left parenthesis: '('. %s" % (current_position.to_string())) # '( )' 33 % is function # '( (a) > (b) )' 100% is NOT function if (current_position.get_index() - found > 1 and (util.find( (util.substr(self.source.str, found + 1, current_position.get_index() - found - 1)), ")") != -1)): # Possible: [while] or [if] current_position.set_at_left_bound_parenthesis() its_not_function = True else: # Possible: [function] or [while] or [if] current_position.rmove(current_position.get_index() - found) # * <- * # 'if (a)' current_position.set_before_spaces() if_statement = "if" while_statement = "while" start_index_of_if_statement = (current_position.get_index() - len(if_statement) + 1) start_index_of_while_statement = (current_position.get_index() - len(while_statement) + 1) if (util.substr(self.source.str, start_index_of_if_statement, len(if_statement)) == if_statement): # [IF] scope_type = Header.Type.IF_STATEMENT scope_header_start = start_index_of_if_statement scope_header_size = ( scope.open_statement_position.get_index() - start_index_of_if_statement) elif (util.substr( self.source.str, start_index_of_while_statement, len(while_statement)) == while_statement): # [WHILE] scope_type = Header.Type.LOOP_WHILE scope_header_start = start_index_of_while_statement scope_header_size = ( scope.open_statement_position.get_index() - start_index_of_while_statement) else: # [FUNCTION] if its_not_function: raise Exception( "Wrong statement. Its not 'while' and not 'if': '('. " + current_position.to_string()) start_index_of_function = -1 if current_position.get_line_number() == 1: start_index_of_function = 0 else: new_line_character = "\n" start_index_of_function = ( util.rfind(self.source.str, new_line_character, current_position.get_index()) + len(new_line_character)) if start_index_of_function == -1: raise Exception("No function type: '('. %s" % (current_position.to_string())) scope_type = Header.Type.FUNCTION scope_header_start = start_index_of_function scope_header_size = ( scope.open_statement_position.get_index() - start_index_of_function) # TODO # Check if position of '(' is outsdie of possile range like parent # openStatementPosition or previous child # closeStatementPosition else: # [struct] # TODO # Check if position of 'struct' is outsdie of possile range like parent # openStatementPosition or previous child # closeStatementPosition scope_type = Header.Type.STRUCT found = util.rfind(self.source.str, "struct", current_position.get_index()) if found == -1: raise Exception( "Not found struct statement: 'struct'. {}".format( current_position.to_string())) scope_header_start = found scope_header_size = (scope.open_statement_position.get_index() - found) if scope_type == Header.Type.UNKNOWN: raise Exception("Unknown scope type") scope.header.set( scope_type, util.substr(self.source.str, scope_header_start, scope_header_size), scope_header_start)