"""
Test thread step-in ignores frames according to the "Avoid regexp" option.
"""

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class StepAvoidsRegexTestCase(TestBase):
    def hit_correct_function(self, pattern):
        name = self.thread.frames[0].GetFunctionName()
        self.assertIn(
            pattern,
            name,
            "Got to '%s' not the expected function '%s'." % (name, pattern),
        )

    def setUp(self):
        TestBase.setUp(self)
        self.dbg.HandleCommand(
            "settings set target.process.thread.step-avoid-regexp ^ignore::"
        )

    @skipIfWindows
    @skipIf(compiler="clang", compiler_version=["<", "11.0"])
    def test_step_avoid_regex(self):
        """Tests stepping into a function which matches the avoid regex"""
        self.build()
        (_, _, self.thread, _) = lldbutil.run_to_source_breakpoint(
            self, "main", lldb.SBFileSpec("main.cpp")
        )

        # Try to step into ignore::auto_ret
        self.thread.StepInto()
        self.hit_correct_function("main")

        # Try to step into ignore::with_tag
        self.thread.StepInto()
        self.hit_correct_function("main")

        # Try to step into ignore::decltype_auto_ret
        self.thread.StepInto()
        self.hit_correct_function("main")

        # Try to step into ignore::with_tag_template
        self.thread.StepInto()
        self.hit_correct_function("main")

        # Step into with_tag_template_returns_ignore which is outside the 'ignore::'
        # namespace but returns a type from 'ignore::'
        self.thread.StepInto()
        self.hit_correct_function("with_tag_template_returns_ignore")
