199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that global operators are found and evaluated.
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 TestCppGlobalOperators(TestBase):
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht    def prepare_executable_and_get_frame(self):
1399451b44SJordan Rupprecht        self.build()
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht        # Get main source file
1699451b44SJordan Rupprecht        src_file = "main.cpp"
1799451b44SJordan Rupprecht        src_file_spec = lldb.SBFileSpec(src_file)
1899451b44SJordan Rupprecht        self.assertTrue(src_file_spec.IsValid(), "Main source file")
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht        # Get the path of the executable
2199451b44SJordan Rupprecht        exe_path = self.getBuildArtifact("a.out")
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        # Load the executable
2499451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe_path)
2599451b44SJordan Rupprecht        self.assertTrue(target.IsValid(), VALID_TARGET)
2699451b44SJordan Rupprecht
2799451b44SJordan Rupprecht        # Break on main function
2899451b44SJordan Rupprecht        main_breakpoint = target.BreakpointCreateBySourceRegex(
2999451b44SJordan Rupprecht            "// break here", src_file_spec)
3099451b44SJordan Rupprecht        self.assertTrue(
3199451b44SJordan Rupprecht            main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1,
3299451b44SJordan Rupprecht            VALID_BREAKPOINT)
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        # Launch the process
3599451b44SJordan Rupprecht        args = None
3699451b44SJordan Rupprecht        env = None
3799451b44SJordan Rupprecht        process = target.LaunchSimple(
3899451b44SJordan Rupprecht            args, env, self.get_process_working_directory())
3999451b44SJordan Rupprecht        self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
4099451b44SJordan Rupprecht
4199451b44SJordan Rupprecht        # Get the thread of the process
42*0ed758b2SDave Lee        self.assertEqual(
43*0ed758b2SDave Lee            process.GetState(), lldb.eStateStopped,
4499451b44SJordan Rupprecht            PROCESS_STOPPED)
4599451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
4699451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht        return thread.GetSelectedFrame()
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht    def test_equals_operator(self):
5199451b44SJordan Rupprecht        frame = self.prepare_executable_and_get_frame()
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("operator==(s1, s2)")
5499451b44SJordan Rupprecht        self.assertTrue(
5599451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValue() == "false",
5699451b44SJordan Rupprecht            "operator==(s1, s2) = false")
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("operator==(s1, s3)")
5999451b44SJordan Rupprecht        self.assertTrue(
6099451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValue() == "true",
6199451b44SJordan Rupprecht            "operator==(s1, s3) = true")
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        test_result = frame.EvaluateExpression("operator==(s2, s3)")
6499451b44SJordan Rupprecht        self.assertTrue(
6599451b44SJordan Rupprecht            test_result.IsValid() and test_result.GetValue() == "false",
6699451b44SJordan Rupprecht            "operator==(s2, s3) = false")
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht    def do_new_test(self, frame, expr, expected_value_name):
6999451b44SJordan Rupprecht        """Evaluate a new expression, and check its result"""
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht        expected_value = frame.FindValue(
7299451b44SJordan Rupprecht            expected_value_name, lldb.eValueTypeVariableGlobal)
7399451b44SJordan Rupprecht        self.assertTrue(expected_value.IsValid())
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        expected_value_addr = expected_value.AddressOf()
7699451b44SJordan Rupprecht        self.assertTrue(expected_value_addr.IsValid())
7799451b44SJordan Rupprecht
7899451b44SJordan Rupprecht        got = frame.EvaluateExpression(expr)
7999451b44SJordan Rupprecht        self.assertTrue(got.IsValid())
8099451b44SJordan Rupprecht        self.assertEqual(
8199451b44SJordan Rupprecht            got.GetValueAsUnsigned(),
8299451b44SJordan Rupprecht            expected_value_addr.GetValueAsUnsigned())
8399451b44SJordan Rupprecht        got_type = got.GetType()
8499451b44SJordan Rupprecht        self.assertTrue(got_type.IsPointerType())
8599451b44SJordan Rupprecht        self.assertEqual(got_type.GetPointeeType().GetName(), "Struct")
8699451b44SJordan Rupprecht
8799451b44SJordan Rupprecht    def test_operator_new(self):
8899451b44SJordan Rupprecht        frame = self.prepare_executable_and_get_frame()
8999451b44SJordan Rupprecht
9099451b44SJordan Rupprecht        self.do_new_test(frame, "new Struct()", "global_new_buf")
9199451b44SJordan Rupprecht        self.do_new_test(frame, "new(new_tag) Struct()", "tagged_new_buf")
92