| """ | |
| Test that global operators are found and evaluated. | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class TestCppGlobalOperators(TestBase): | |
| def prepare_executable_and_get_frame(self): | |
| self.build() | |
| _, _, thread, _ = lldbutil.run_to_source_breakpoint( | |
| self, "// break here", lldb.SBFileSpec("main.cpp") | |
| ) | |
| return thread.GetSelectedFrame() | |
| def test_equals_operator(self): | |
| frame = self.prepare_executable_and_get_frame() | |
| test_result = frame.EvaluateExpression("operator==(s1, s2)") | |
| self.assertTrue( | |
| test_result.IsValid() and test_result.GetValue() == "false", | |
| "operator==(s1, s2) = false", | |
| ) | |
| test_result = frame.EvaluateExpression("operator==(s1, s3)") | |
| self.assertTrue( | |
| test_result.IsValid() and test_result.GetValue() == "true", | |
| "operator==(s1, s3) = true", | |
| ) | |
| test_result = frame.EvaluateExpression("operator==(s2, s3)") | |
| self.assertTrue( | |
| test_result.IsValid() and test_result.GetValue() == "false", | |
| "operator==(s2, s3) = false", | |
| ) | |
| def do_new_test(self, frame, expr, expected_value_name): | |
| """Evaluate a new expression, and check its result""" | |
| expected_value = frame.FindValue( | |
| expected_value_name, lldb.eValueTypeVariableGlobal | |
| ) | |
| self.assertTrue(expected_value.IsValid()) | |
| expected_value_addr = expected_value.AddressOf() | |
| self.assertTrue(expected_value_addr.IsValid()) | |
| got = frame.EvaluateExpression(expr) | |
| self.assertTrue(got.IsValid()) | |
| self.assertEqual( | |
| got.GetValueAsUnsigned(), expected_value_addr.GetValueAsUnsigned() | |
| ) | |
| got_type = got.GetType() | |
| self.assertTrue(got_type.IsPointerType()) | |
| self.assertEqual(got_type.GetPointeeType().GetName(), "Struct") | |
| @skipIfMTE # Expression evaluation of overridden operator new fails under MTE. | |
| def test_operator_new(self): | |
| frame = self.prepare_executable_and_get_frame() | |
| self.do_new_test(frame, "new Struct()", "global_new_buf") | |
| self.do_new_test(frame, "new(new_tag) Struct()", "tagged_new_buf") |