13990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata"""
23990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico GranataTest lldb data formatter subsystem.
33990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata"""
43990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
53990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport os, time
63990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport unittest2
73990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport lldb
83990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granatafrom lldbtest import *
93990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataimport lldbutil
103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataclass LibcxxMultiMapDataFormatterTestCase(TestBase):
123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-stl", "libcxx", "multimap")
143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    @dsym_test
173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    def test_with_dsym_and_run_command(self):
183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        """Test data formatter commands."""
193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.buildDsym()
203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.data_formatter_commands()
213990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
223990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    @skipIfLinux # No standard locations for libc++ on Linux, so skip for now
233990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    @dwarf_test
243990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    def test_with_dwarf_and_run_command(self):
253990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        """Test data formatter commands."""
263990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.buildDwarf()
273990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.data_formatter_commands()
283990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
293990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    def setUp(self):
303990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # Call super's setUp().
313990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        TestBase.setUp(self)
323990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
333990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    def data_formatter_commands(self):
343990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        """Test that that file and class static variables display correctly."""
353990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
363990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
373990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        lldbutil.run_break_set_by_source_regexp (self, "Set break point at this line.")
383990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
393990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("run", RUN_SUCCEEDED)
403990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
413990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # The stop reason of the thread should be breakpoint.
423990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
433990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            substrs = ['stopped',
443990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                       'stop reason = breakpoint'])
453990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
463990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # This is the function to remove the custom formats in order to have a
473990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # clean slate for the next test case.
483990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        def cleanup():
493990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            self.runCmd('type format clear', check=False)
503990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            self.runCmd('type summary clear', check=False)
513990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            self.runCmd('type filter clear', check=False)
523990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            self.runCmd('type synth clear', check=False)
533990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            self.runCmd("settings set target.max-children-count 256", check=False)
543990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
553990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # Execute the cleanup function during test case tear down.
563990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.addTearDownHook(cleanup)
573990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
583990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('image list',substrs=['libc++.1.dylib','libc++abi.dylib'])
593990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
603990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("frame variable ii --show-types")
613990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
623990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable ii',
633990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata            substrs = ['size=0',
643990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                       '{}'])
653990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
663990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
673990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
683990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable ii',
693990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=2',
703990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = {',
713990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 0',
723990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0',
733990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[1] = {',
743990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 1',
753990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 1'])
763990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
773990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
783990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
793990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable ii',
803990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=4',
813990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[2] = {',
823990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 2',
833990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0',
843990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[3] = {',
853990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 3',
863990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 1'])
873990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
883990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
893990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
903990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable ii",
913990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=8',
923990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[5] = {',
933990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 5',
943990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0',
953990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[7] = {',
963990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 7',
973990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 1'])
983990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
993990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("p ii",
1003990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=8',
1013990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[5] = {',
1023990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 5',
1033990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0',
1043990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[7] = {',
1053990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 7',
1063990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 1'])
1073990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1083990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check access-by-index
1093990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable ii[0]",
1103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['first = 0',
1113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0']);
1123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable ii[3]",
1133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['first =',
1143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second =']);
1153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that MightHaveChildren() gets it right
1173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.assertTrue(self.frame().FindVariable("ii").MightHaveChildren(), "ii.MightHaveChildren() says False for non empty!")
1183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that the expression parser does not make use of
1203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # synthetic children instead of running code
1213990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # TOT clang has a fix for this, which makes the expression command here succeed
1223990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # since this would make the test fail or succeed depending on clang version in use
1233990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # this is safer commented for the time being
1243990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #self.expect("expression ii[8]", matching=False, error=True,
1253990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #            substrs = ['1234567'])
1263990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1273990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
1283990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1293990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable ii',
1303990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
1313990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
1323990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1333990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("frame variable si --show-types")
1343990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1353990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable si',
1363990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
1373990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
1383990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1393990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
1403990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1413990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable si',
1423990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=1',
1433990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
1443990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"zero\"',
1453990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0'])
1463990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1473990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
1483990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1493990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable si",
1503990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=4',
1513990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
1523990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"zero\"',
1533990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0',
1543990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                '[1] = ',
1553990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                'first = \"one\"',
1563990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                'second = 1',
1573990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                '[2] = ',
1583990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                'first = \"two\"',
1593990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                'second = 2',
1603990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                '[3] = ',
1613990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                'first = \"three\"',
1623990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                                'second = 3'])
1633990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1643990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("p si",
1653990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=4',
1663990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
1673990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"zero\"',
1683990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 0',
1693990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[1] = ',
1703990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"one\"',
1713990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 1',
1723990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[2] = ',
1733990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"two\"',
1743990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 2',
1753990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[3] = ',
1763990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"three\"',
1773990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 3'])
1783990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1793990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that MightHaveChildren() gets it right
1803990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.assertTrue(self.frame().FindVariable("si").MightHaveChildren(), "si.MightHaveChildren() says False for non empty!")
1813990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1823990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check access-by-index
1833990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable si[0]",
1843990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['first = ', 'one',
1853990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = 1']);
1863990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1873990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that the expression parser does not make use of
1883990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # synthetic children instead of running code
1893990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # TOT clang has a fix for this, which makes the expression command here succeed
1903990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # since this would make the test fail or succeed depending on clang version in use
1913990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # this is safer commented for the time being
1923990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #self.expect("expression si[0]", matching=False, error=True,
1933990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #            substrs = ['first = ', 'zero'])
1943990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1953990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
1963990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
1973990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable si',
1983990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
1993990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
2003990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2013990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
2023990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("frame variable is --show-types")
2033990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2043990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable is',
2053990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
2063990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
2073990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2083990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
2093990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable is",
2113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=4',
2123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
2133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"goofy\"',
2143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 85',
2153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[1] = ',
2163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"is\"',
2173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 1',
2183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[2] = ',
2193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"smart\"',
2203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 2',
2213990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[3] = ',
2223990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"!!!\"',
2233990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 3'])
2243990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2253990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("p is",
2263990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=4',
2273990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
2283990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"goofy\"',
2293990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 85',
2303990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[1] = ',
2313990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"is\"',
2323990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 1',
2333990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[2] = ',
2343990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"smart\"',
2353990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 2',
2363990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[3] = ',
2373990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"!!!\"',
2383990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = 3'])
2393990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2403990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that MightHaveChildren() gets it right
2413990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.assertTrue(self.frame().FindVariable("is").MightHaveChildren(), "is.MightHaveChildren() says False for non empty!")
2423990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2433990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check access-by-index
2443990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable is[0]",
2453990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['first = ',
2463990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second =']);
2473990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2483990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that the expression parser does not make use of
2493990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # synthetic children instead of running code
2503990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # TOT clang has a fix for this, which makes the expression command here succeed
2513990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # since this would make the test fail or succeed depending on clang version in use
2523990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # this is safer commented for the time being
2533990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #self.expect("expression is[0]", matching=False, error=True,
2543990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #            substrs = ['first = ', 'goofy'])
2553990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2563990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
2573990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2583990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable is',
2593990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
2603990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
2613990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2623990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
2633990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("frame variable ss --show-types")
2643990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2653990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable ss',
2663990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
2673990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
2683990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2693990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
2703990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2713990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable ss",
2723990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=3',
2733990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
2743990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"hello\"',
2753990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"ciao\"',
2763990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[1] = ',
2773990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"house\"',
2783990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"casa\"',
2793990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[2] = ',
2803990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"cat\"',
2813990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"gatto\"'])
2823990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2833990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("p ss",
2843990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=3',
2853990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[0] = ',
2863990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"hello\"',
2873990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"ciao\"',
2883990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[1] = ',
2893990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"house\"',
2903990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"casa\"',
2913990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '[2] = ',
2923990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'second = \"cat\"',
2933990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               'first = \"gatto\"'])
2943990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2953990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that MightHaveChildren() gets it right
2963990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.assertTrue(self.frame().FindVariable("ss").MightHaveChildren(), "ss.MightHaveChildren() says False for non empty!")
2973990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
2983990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check access-by-index
2993990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect("frame variable ss[2]",
3003990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['gatto', 'cat']);
3013990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
3023990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # check that the expression parser does not make use of
3033990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # synthetic children instead of running code
3043990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # TOT clang has a fix for this, which makes the expression command here succeed
3053990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # since this would make the test fail or succeed depending on clang version in use
3063990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        # this is safer commented for the time being
3073990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #self.expect("expression ss[3]", matching=False, error=True,
3083990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        #            substrs = ['gatto'])
3093990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
3103990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.runCmd("continue");
3113990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
3123990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata        self.expect('frame variable ss',
3133990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                    substrs = ['size=0',
3143990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata                               '{}'])
3153990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata
3163990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granataif __name__ == '__main__':
3173990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    import atexit
3183990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    lldb.SBDebugger.Initialize()
3193990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    atexit.register(lambda: lldb.SBDebugger.Terminate())
3203990c278c5f4f6ce1373ee3e6d5b984883cf4318Enrico Granata    unittest2.main()
321