199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTests imported namespaces in C++.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprechtimport lldb
599451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht
1099451b44SJordan Rupprechtclass TestCppNsImport(TestBase):
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht    def test_with_run_command(self):
1399451b44SJordan Rupprecht        """Tests imported namespaces in C++."""
1499451b44SJordan Rupprecht        self.build()
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht        # Get main source file
1799451b44SJordan Rupprecht        src_file = os.path.join(self.getSourceDir(), "main.cpp")
1899451b44SJordan Rupprecht        src_file_spec = lldb.SBFileSpec(src_file)
1999451b44SJordan Rupprecht        self.assertTrue(src_file_spec.IsValid(), "Main source file")
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht        # Get the path of the executable
2299451b44SJordan Rupprecht        exe_path = self.getBuildArtifact("a.out")
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht        # Load the executable
2599451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe_path)
2699451b44SJordan Rupprecht        self.assertTrue(target.IsValid(), VALID_TARGET)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Break on main function
2999451b44SJordan Rupprecht        break_0 = target.BreakpointCreateBySourceRegex(
3099451b44SJordan Rupprecht            "// break 0", src_file_spec)
3199451b44SJordan Rupprecht        self.assertTrue(
3299451b44SJordan Rupprecht            break_0.IsValid() and break_0.GetNumLocations() >= 1,
3399451b44SJordan Rupprecht            VALID_BREAKPOINT)
3499451b44SJordan Rupprecht        break_1 = target.BreakpointCreateBySourceRegex(
3599451b44SJordan Rupprecht            "// break 1", src_file_spec)
3699451b44SJordan Rupprecht        self.assertTrue(
3799451b44SJordan Rupprecht            break_1.IsValid() and break_1.GetNumLocations() >= 1,
3899451b44SJordan Rupprecht            VALID_BREAKPOINT)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # Launch the process
4199451b44SJordan Rupprecht        args = None
4299451b44SJordan Rupprecht        env = None
4399451b44SJordan Rupprecht        process = target.LaunchSimple(
4499451b44SJordan Rupprecht            args, env, self.get_process_working_directory())
4599451b44SJordan Rupprecht        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        # Get the thread of the process
48*0ed758b2SDave Lee        self.assertEqual(
49*0ed758b2SDave Lee            process.GetState(), lldb.eStateStopped,
5099451b44SJordan Rupprecht            PROCESS_STOPPED)
5199451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
5299451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        # Get current fream of the thread at the breakpoint
5599451b44SJordan Rupprecht        frame = thread.GetSelectedFrame()
5699451b44SJordan Rupprecht
5799451b44SJordan Rupprecht        # Test imported namespaces
5899451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("n")
5999451b44SJordan Rupprecht        self.assertTrue(
6099451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 1,
6199451b44SJordan Rupprecht            "n = 1")
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("N::n")
6499451b44SJordan Rupprecht        self.assertTrue(
6599451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 1,
6699451b44SJordan Rupprecht            "N::n = 1")
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("nested")
6999451b44SJordan Rupprecht        self.assertTrue(
7099451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 3,
7199451b44SJordan Rupprecht            "nested = 3")
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("anon")
7499451b44SJordan Rupprecht        self.assertTrue(
7599451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 2,
7699451b44SJordan Rupprecht            "anon = 2")
7799451b44SJordan Rupprecht
7899451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("global")
7999451b44SJordan Rupprecht        self.assertTrue(
8099451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 4,
8199451b44SJordan Rupprecht            "global = 4")
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("fun_var")
8499451b44SJordan Rupprecht        self.assertTrue(
8599451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 9,
8699451b44SJordan Rupprecht            "fun_var = 9")
8799451b44SJordan Rupprecht
8899451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("Fun::fun_var")
8999451b44SJordan Rupprecht        self.assertTrue(
9099451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 0,
9199451b44SJordan Rupprecht            "Fun::fun_var = 0")
9299451b44SJordan Rupprecht
9399451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("not_imported")
9499451b44SJordan Rupprecht        self.assertTrue(
9599451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 35,
9699451b44SJordan Rupprecht            "not_imported = 35")
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprecht        # Currently there is no way to distinguish between "::imported" and "imported" in ClangExpressionDeclMap so this fails
9999451b44SJordan Rupprecht        #test_result = frame.EvaluateExpression("::imported")
10099451b44SJordan Rupprecht        #self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 89, "::imported = 89")
10199451b44SJordan Rupprecht
10299451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("Imported::imported")
10399451b44SJordan Rupprecht        self.assertTrue(
10499451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 99,
10599451b44SJordan Rupprecht            "Imported::imported = 99")
10699451b44SJordan Rupprecht
10799451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("imported")
10899451b44SJordan Rupprecht        self.assertTrue(
10999451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 99,
11099451b44SJordan Rupprecht            "imported = 99")
11199451b44SJordan Rupprecht
11299451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("single")
11399451b44SJordan Rupprecht        self.assertTrue(
11499451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 3,
11599451b44SJordan Rupprecht            "single = 3")
11699451b44SJordan Rupprecht
11799451b44SJordan Rupprecht        # Continue to second breakpoint
11899451b44SJordan Rupprecht        process.Continue()
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht        # Get the thread of the process
121*0ed758b2SDave Lee        self.assertEqual(
122*0ed758b2SDave Lee            process.GetState(), lldb.eStateStopped,
12399451b44SJordan Rupprecht            PROCESS_STOPPED)
12499451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
12599451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
12699451b44SJordan Rupprecht
12799451b44SJordan Rupprecht        # Get current fream of the thread at the breakpoint
12899451b44SJordan Rupprecht        frame = thread.GetSelectedFrame()
12999451b44SJordan Rupprecht
13099451b44SJordan Rupprecht        # Test function inside namespace
13199451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("fun_var")
13299451b44SJordan Rupprecht        self.assertTrue(
13399451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValueAsSigned() == 5,
13499451b44SJordan Rupprecht            "fun_var = 5")
135