Ejemplo n.º 1
0
    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())
Ejemplo n.º 2
0
    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)