"""
Test SBSymbolContext APIs.
"""



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


class SymbolContextTwoFilesTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @expectedFailureAll(oslist=["windows"])
    def test_lookup_by_address(self):
        """Test lookup by address in a module with multiple compilation units"""
        self.build()
        exe = self.getBuildArtifact("a.out")
        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        module = target.GetModuleAtIndex(0)
        self.assertTrue(module.IsValid())
        for symbol_name in ["struct1::f()", "struct2::f()"]:
            sc_list = module.FindFunctions(symbol_name, lldb.eSymbolTypeCode)
            self.assertTrue(1, sc_list.GetSize())
            symbol_address = sc_list.GetContextAtIndex(
                0).GetSymbol().GetStartAddress()
            self.assertTrue(symbol_address.IsValid())
            sc_by_address = module.ResolveSymbolContextForAddress(
                symbol_address, lldb.eSymbolContextFunction)
            self.assertEqual(symbol_name,
                             sc_by_address.GetFunction().GetName())

    def test_ranges_in_multiple_compile_unit(self):
        """This test verifies that we correctly handle the case when multiple
        compile unit contains DW_AT_ranges and DW_AT_ranges_base attributes."""
        self.build()
        exe = self.getBuildArtifact("a.out")
        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)

        source1 = "file1.cpp"
        line1 = line_number(source1, '// Break1')
        breakpoint1 = target.BreakpointCreateByLocation(source1, line1)
        self.assertIsNotNone(breakpoint1)
        self.assertTrue(breakpoint1.IsValid())

        source2 = "file2.cpp"
        line2 = line_number(source2, '// Break2')
        breakpoint2 = target.BreakpointCreateByLocation(source2, line2)
        self.assertIsNotNone(breakpoint2)
        self.assertTrue(breakpoint2.IsValid())

        process = target.LaunchSimple(None, None, self.get_process_working_directory())
        self.assertIsNotNone(process, PROCESS_IS_VALID)

        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, breakpoint2)
        self.assertEqual(len(threads), 1)
        frame = threads[0].GetFrameAtIndex(0)
        value = frame.FindVariable("x")
        self.assertTrue(value.IsValid())

        process.Continue()

        threads = lldbutil.get_threads_stopped_at_breakpoint(
            process, breakpoint1)
        self.assertEqual(len(threads), 1)
        frame = threads[0].GetFrameAtIndex(0)
        value = frame.FindVariable("x")
        self.assertTrue(value.IsValid())

        process.Continue()
