"""
Test that we return only the requested template instantiation.
"""

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


class UniqueTypesTestCase4(TestBase):
    SHARED_BUILD_TESTCASE = False

    def do_test(self, debug_flags):
        """Test that we display the correct template instantiation."""
        self.build(dictionary=debug_flags)
        lldbutil.run_to_source_breakpoint(
            self, "// Set breakpoint here", lldb.SBFileSpec("main.cpp")
        )
        # FIXME: these should successfully print the values
        self.expect(
            "expression ns::Foo<double>::value",
            substrs=["'Foo' in namespace 'ns'"],
            error=True,
        )
        self.expect(
            "expression ns::Foo<int>::value",
            substrs=["'Foo' in namespace 'ns'"],
            error=True,
        )
        self.expect(
            "expression ns::Bar<double>::value",
            substrs=["'Bar' in namespace 'ns'"],
            error=True,
        )
        self.expect(
            "expression ns::Bar<int>::value",
            substrs=["'Bar' in namespace 'ns'"],
            error=True,
        )
        self.expect_expr("ns::FooDouble::value", result_type="double", result_value="0")
        self.expect_expr("ns::FooInt::value", result_type="int", result_value="0")

    @skipIfWindows  # https://github.com/llvm/llvm-project/issues/75936
    @skipIf(compiler=no_match("clang"))
    @skipIf(compiler_version=["<", "15.0"])
    def test_simple_template_names(self):
        self.do_test(dict(CFLAGS_EXTRAS="-gsimple-template-names"))

    @skipIfWindows  # https://github.com/llvm/llvm-project/issues/75936
    @skipIf(compiler=no_match("clang"))
    @skipIf(compiler_version=["<", "15.0"])
    def test_no_simple_template_names(self):
        self.do_test(dict(CFLAGS_EXTRAS="-gno-simple-template-names"))
