| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class TestSBValueSynthetic(TestBase): |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| def test_str(self): |
| self.build() |
| lldbutil.run_to_source_breakpoint( |
| self, "break here", lldb.SBFileSpec("main.cpp") |
| ) |
| self.runCmd("command script import formatter.py") |
| self.runCmd( |
| "type synthetic add --python-class formatter.FooSyntheticProvider Foo" |
| ) |
| |
| formatted = self.frame().FindVariable("foo") |
| has_formatted = self.frame().FindVariable("has_foo") |
| self.expect(str(formatted), exe=False, substrs=["synth_child"]) |
| self.expect(str(has_formatted), exe=False, substrs=["synth_child"]) |
| |
| def test_synth_arr(self): |
| self.build() |
| lldbutil.run_to_source_breakpoint( |
| self, "break here", lldb.SBFileSpec("main.cpp") |
| ) |
| point_arr = self.frame().FindVariable("point_arr") |
| point_ptr = self.frame().FindVariable("point_ptr") |
| for v in [point_arr, point_ptr]: |
| for i in range(3): |
| child = v.GetChildAtIndex(i, lldb.eDynamicDontRunTarget, True) |
| check = ValueCheck( |
| name=f"[{i}]", |
| type="Point", |
| children=[ |
| ValueCheck(name="x", value=str(2 * i + 1)), |
| ValueCheck(name="y", value=str(2 * i + 2)), |
| ], |
| ) |
| check.check_value(self, child, f"{child}, child {i} of {v.GetName()}") |
| |
| int_arr = self.frame().FindVariable("int_arr") |
| int_ptr = self.frame().FindVariable("int_ptr") |
| for v in [int_arr, int_ptr]: |
| for i in range(3): |
| child = v.GetChildAtIndex(i, lldb.eDynamicDontRunTarget, True) |
| check = ValueCheck(name=f"[{i}]", type="int", value=str(i + 1)) |
| check.check_value(self, child, f"{child}, child {i} of {v.GetName()}") |