def test_multiple_multi_line_comments(self):
        """Check multi line long line comments."""
        bug_line = 31
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [
            SourceCodeComment(
                checkers={'my.checker_1'},
                message='long intentional bug comment',
                status='intentional',
                line='// codechecker_intentional [ my.checker_1 ] '
                'long intentional\n // bug comment\n'),
            SourceCodeComment(
                checkers={'my.checker_2'},
                message='long confirmed bug comment',
                status='confirmed',
                line='// codechecker_confirmed  [ my.checker_2 ] '
                'long confirmed\n // bug comment\n')
        ]

        self.assertEqual(expected[0], source_line_comments[0])
        self.assertEqual(expected[1], source_line_comments[1])
    def test_cstyle_multi_comment_multi_line_long(self):
        """
        Multi line C style comment with multiple review status comment.

        /* codechecker_false_positive [ my.checker_2, my.checker_1 ] comment
        which
        is
        long
        codechecker_intentional [ my.checker_1 ] intentional comment
        long
        again */

        """

        bug_line = 60
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [
            SourceCodeComment(checkers={'my.checker_1'},
                              message='intentional comment long again',
                              status='intentional',
                              line='codechecker_intentional [ my.checker_1 ] '
                              'intentional comment\n long\n again */\n'),
            SourceCodeComment(checkers={'my.checker_1', 'my.checker_2'},
                              message='comment which is long',
                              status='false_positive',
                              line='/* codechecker_false_positive [ '
                              'my.checker_2, my.checker_1 ] comment\n '
                              'which\n is\n long\n')
        ]

        self.assertEqual(expected[0], source_line_comments[0])
        self.assertEqual(expected[1], source_line_comments[1])

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, 'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
        self.assertEqual(current_line_comments[0].message, expected[0].message)
        self.assertEqual(current_line_comments[0].status, expected[0].status)
        self.assertEqual(current_line_comments[1].message, expected[1].message)
        self.assertEqual(current_line_comments[1].status, expected[1].status)

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, 'my.checker_2')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(current_line_comments[0].message, expected[1].message)
        self.assertEqual(current_line_comments[0].status, expected[1].status)

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, 'my.dummy')
        self.assertEqual(len(current_line_comments), 0)
    def test_multiple_all_comments(self):
        """Check multiple comment."""
        bug_line = 37
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [
            SourceCodeComment(
                checkers={'my.checker_1'},
                message='intentional comment',
                status='intentional',
                line='// codechecker_intentional [ my.checker_1 ] '
                'intentional comment\n'),
            SourceCodeComment(checkers={'all'},
                              message='some comment',
                              status='false_positive',
                              line='// codechecker_false_positive  [ all ] '
                              'some comment\n')
        ]

        self.assertEqual(expected[0], source_line_comments[0])
        self.assertEqual(expected[1], source_line_comments[1])

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, 'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)

        self.assertEqual(current_line_comments[0].message, expected[0].message)
        self.assertEqual(current_line_comments[0].status, expected[0].status)

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, '')
        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0].message, expected[1].message)
        self.assertEqual(current_line_comments[0].status, expected[1].status)

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, 'my.dummy')
        self.assertEqual(len(current_line_comments), 1)

        self.assertEqual(len(current_line_comments), 1)
        self.assertEqual(current_line_comments[0].message, expected[1].message)
        self.assertEqual(current_line_comments[0].status, expected[1].status)
    def test_cstyle_comment_multi_line_mismatch(self):
        """
        Multi line C style comment start '/*' is in a different line
        from the codechecker review status comment.

        /*
          codechecker_suppress [ my_checker_1 ]
          multi line
          comment
          again
         */
        """

        bug_line = 108
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message='multi line comment again',
            status='false_positive',
            line='  codechecker_suppress [ my_checker_1 ]\n   '
            'multi line\n   comment\n   again\n  */\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_cstyle_comment_multi_star(self):
        """
        Multi line C style comment.

        /* codechecker_suppress [ my_checker_1 ]
         * multi line
         * comment
         * again
         */
        """

        bug_line = 98
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message='multi line comment again',
            status='false_positive',
            line="/* codechecker_suppress [ my_checker_1 ]\n  * "
            "multi line\n  * comment\n  * again\n  */\n")
        self.assertEqual(expected, source_line_comments[0])
    def test_cstyle_comment_multi_nomsg(self):
        """
        Multi line C style comment.
        /* codechecker_suppress [ my_checker_1 ]
        */
        """

        bug_line = 89
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        for line in source_line_comments:
            print(line)

        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message='WARNING! source code comment is missing',
            status='false_positive',
            line='/* codechecker_suppress [ my_checker_1 ]\n */\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_cstyle_comment_multi_line(self):
        """
        Multi line C style comment.
        /* codechecker_suppress [ my_checker_1 ]
        some longer
        comment */
        """

        bug_line = 83
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message='some longer comment',
            status='false_positive',
            line='/* codechecker_suppress [ my_checker_1 ]\n '
            'some longer\n comment */\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_cstyle_comment(self):
        """
        C style comment in one line.
        /* codechecker_suppress [ my_checker_1 ] suppress comment */
        """

        bug_line = 76
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_1, bug_line)

        for line in source_line_comments:
            print(line)

        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message='suppress comment',
            status='false_positive',
            line='/* codechecker_suppress [ my_checker_1 ] '
            'suppress comment */\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_multiple_checker_name_comments(self):
        """
        Check multiple comment where same checker name are given for multiple
        source code comment.
        """

        bug_line = 43
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = sc_handler.get_source_line_comments(
            self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 2)

        expected = [
            SourceCodeComment(
                checkers={'my.checker_1'},
                message='intentional comment',
                status='intentional',
                line='// codechecker_intentional [ my.checker_1 ] '
                'intentional comment\n'),
            SourceCodeComment(checkers={'my.checker_2', 'my.checker_1'},
                              message='some comment',
                              status='false_positive',
                              line='// codechecker_false_positive [ '
                              'my.checker_2, my.checker_1 ] some comment\n')
        ]

        self.assertEqual(expected[0], source_line_comments[0])
        self.assertEqual(expected[1], source_line_comments[1])

        current_line_comments = sc_handler.filter_source_line_comments(
            self.__tmp_srcfile_3, bug_line, 'my.checker_1')
        self.assertEqual(len(current_line_comments), 2)
    def test_no_src_comment_comment(self):
        """There is no source comment above the bug line."""
        bug_line = 16
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'all'},
            message='some comment',
            status='false_positive',
            line='// codechecker_suppress [all] some comment\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_confirmed_comment(self):
        """Check Confirmed comment."""
        bug_line = 17
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_3,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_3, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'all'},
            message='some comment',
            status='confirmed',
            line='// codechecker_confirmed [ all ] some comment\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_no_fancy_comment(self):
        """Check no fancy comment."""
        bug_line = 70
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message='WARNING! source code comment is missing',
            status='false_positive',
            line='// codechecker_suppress [ my_checker_1 ]\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_fancy_comment_characters(self):
        """Check fancy comment."""
        bug_line = 64
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my_checker_1'},
            message="áúőóüöáé [▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬]",
            status='false_positive',
            line='// codechecker_suppress [ my_checker_1 ]\n // '
            'áúőóüöáé [▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬]\n')
        self.assertEqual(expected, source_line_comments[0])
    def test_comment_characters(self):
        """Check for different special comment characters."""
        bug_line = 57
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my.checker_1', 'my.checker_2'},
            message="i/';0 (*&^%$#@!)",
            status='false_positive',
            line="// codechecker_suppress [my.checker_1, "
            "my.checker_2]\n // i/';0 (*&^%$#@!)\n")
        self.assertEqual(expected, source_line_comments[0])
    def test_multi_liner_all_2(self):
        """There is source code comment above the bug line."""
        bug_line = 36
        sc_handler = SourceCodeCommentHandler()
        res = sc_handler.has_source_line_comments(self.__tmp_srcfile_1,
                                                  bug_line)
        self.assertTrue(res)

        source_line_comments = \
            sc_handler.get_source_line_comments(self.__tmp_srcfile_1, bug_line)
        self.assertEqual(len(source_line_comments), 1)

        expected = SourceCodeComment(
            checkers={'my.checker_1', 'my.checker_2'},
            message='some really long comment',
            status='false_positive',
            line='// codechecker_suppress [my.checker_1 '
            'my.checker_2] some really\n // long comment\n')
        self.assertEqual(expected, source_line_comments[0])