199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb data formatter subsystem.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom __future__ import print_function
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
9*f9ad1127SRaphael Isemannfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass ValueObjectRecursionTestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht    def setUp(self):
1999451b44SJordan Rupprecht        # Call super's setUp().
2099451b44SJordan Rupprecht        TestBase.setUp(self)
2199451b44SJordan Rupprecht        # Find the line number to break at.
2299451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// Set break point at this line.')
2399451b44SJordan Rupprecht
24*f9ad1127SRaphael Isemann    @no_debug_info_test
2599451b44SJordan Rupprecht    def test_with_run_command(self):
2699451b44SJordan Rupprecht        """Test that deeply nested ValueObjects still work."""
2799451b44SJordan Rupprecht        self.build()
2899451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
3199451b44SJordan Rupprecht            self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
3699451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
3799451b44SJordan Rupprecht                    substrs=['stopped',
3899451b44SJordan Rupprecht                             'stop reason = breakpoint'])
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        # This is the function to remove the custom formats in order to have a
4199451b44SJordan Rupprecht        # clean slate for the next test case.
4299451b44SJordan Rupprecht        def cleanup():
4399451b44SJordan Rupprecht            self.runCmd('type format clear', check=False)
4499451b44SJordan Rupprecht            self.runCmd('type summary clear', check=False)
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
4799451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        root = self.frame().FindVariable("root")
5099451b44SJordan Rupprecht        child = root.GetChildAtIndex(1)
5199451b44SJordan Rupprecht        if self.TraceOn():
5299451b44SJordan Rupprecht            print(root)
5399451b44SJordan Rupprecht            print(child)
5499451b44SJordan Rupprecht        for i in range(0, 15000):
5599451b44SJordan Rupprecht            child = child.GetChildAtIndex(1)
5699451b44SJordan Rupprecht        if self.TraceOn():
5799451b44SJordan Rupprecht            print(child)
5899451b44SJordan Rupprecht        self.assertTrue(
5999451b44SJordan Rupprecht            child.IsValid(),
6099451b44SJordan Rupprecht            "could not retrieve the deep ValueObject")
6199451b44SJordan Rupprecht        self.assertTrue(
6299451b44SJordan Rupprecht            child.GetChildAtIndex(0).IsValid(),
6399451b44SJordan Rupprecht            "the deep ValueObject has no value")
6499451b44SJordan Rupprecht        self.assertTrue(
6599451b44SJordan Rupprecht            child.GetChildAtIndex(0).GetValueAsUnsigned() != 0,
6699451b44SJordan Rupprecht            "the deep ValueObject has a zero value")
6799451b44SJordan Rupprecht        self.assertTrue(
6899451b44SJordan Rupprecht            child.GetChildAtIndex(1).GetValueAsUnsigned() != 0,
6999451b44SJordan Rupprecht            "the deep ValueObject has no next")
70