17541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata"""
27541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico GranataTest lldb data formatter subsystem.
37541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata"""
47541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
57541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granataimport os, time
67541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granataimport unittest2
77541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granataimport lldb
87541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granatafrom lldbtest import *
9431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
107541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1166205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granataclass LibcxxListDataFormatterTestCase(TestBase):
127541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1366205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-stl", "libcxx", "list")
147541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
157541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dsym_test
177541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    def test_with_dsym_and_run_command(self):
187541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        """Test data formatter commands."""
197541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.buildDsym()
207541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.data_formatter_commands()
217541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
226bc4dcdfbcdfa455299d2123011b82a77351ee72Daniel Malea    @skipIfLinux # No standard locations for libc++ on Linux, so skip for now
23a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dwarf_test
247541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    def test_with_dwarf_and_run_command(self):
257541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        """Test data formatter commands."""
267541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.buildDwarf()
277541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.data_formatter_commands()
287541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
297541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    def setUp(self):
307541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # Call super's setUp().
317541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        TestBase.setUp(self)
327541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # Find the line number to break at.
337541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.line = line_number('main.cpp', '// Set break point at this line.')
3466205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata        self.line2 = line_number('main.cpp', '// Set second break point at this line.')
357541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
367541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    def data_formatter_commands(self):
377541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        """Test that that file and class static variables display correctly."""
387541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
397541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
40431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)
41431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line2, num_expected_locations=-1)
427541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
437541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("run", RUN_SUCCEEDED)
447541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
457541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # The stop reason of the thread should be breakpoint.
467541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
477541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata            substrs = ['stopped',
487541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                       'stop reason = breakpoint'])
497541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
507541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # This is the function to remove the custom formats in order to have a
517541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # clean slate for the next test case.
527541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        def cleanup():
537541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata            self.runCmd('type format clear', check=False)
547541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata            self.runCmd('type summary clear', check=False)
557541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata            self.runCmd('type filter clear', check=False)
567541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata            self.runCmd('type synth clear', check=False)
577541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata            self.runCmd("settings set target.max-children-count 256", check=False)
587541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
597541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # Execute the cleanup function during test case tear down.
607541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.addTearDownHook(cleanup)
617541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
626475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        self.runCmd("frame variable numbers_list --show-types")
637541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("type summary add std::int_list std::string_list int_list string_list --summary-string \"list has ${svar%#} items\" -e")
647541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("type format add -f hex int")
657541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
667541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list --raw", matching=False,
677541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 0 items',
687541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '{}'])
697541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
707541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list",
717541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 0 items',
727541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '{}'])
737541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
747541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("p numbers_list",
757541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 0 items',
767541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '{}'])
777541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
787541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("n")
797541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
807541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list",
817541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 1 items',
827541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[0] = ',
837541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x12345678'])
847541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
857541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("n");self.runCmd("n");self.runCmd("n");
867541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
877541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list",
887541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 4 items',
897541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[0] = ',
907541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x12345678',
917541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[1] =',
927541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x11223344',
937541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[2] =',
947541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0xbeeffeed',
957541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[3] =',
967541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x00abba00'])
977541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
987541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("n");self.runCmd("n");
997541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1007541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list",
1017541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 6 items',
1027541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[0] = ',
1037541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x12345678',
1047541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x11223344',
1057541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0xbeeffeed',
1067541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x00abba00',
1077541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[4] =',
1087541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x0abcdef0',
1097541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[5] =',
1107541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x0cab0cab'])
1117541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1127541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("p numbers_list",
1137541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 6 items',
1147541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[0] = ',
1157541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x12345678',
1167541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x11223344',
1177541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0xbeeffeed',
1187541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x00abba00',
1197541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[4] =',
1207541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x0abcdef0',
1217541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[5] =',
1227541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '0x0cab0cab'])
1237541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1247541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # check access-by-index
1257541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list[0]",
1267541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['0x12345678']);
1277541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list[1]",
1287541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['0x11223344']);
1297541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1307541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("n")
1317541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1327541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list",
1337541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 0 items',
1347541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '{}'])
1357541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1367541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("n");self.runCmd("n");self.runCmd("n");self.runCmd("n");
1377541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1387541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable numbers_list",
1397541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['list has 4 items',
1407541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[0] = ', '1',
1417541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[1] = ', '2',
1427541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[2] = ', '3',
1437541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[3] = ', '4'])
1447541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
145251729ef30fde23e4b1256690fbb60962390e560Enrico Granata        # check that MightHaveChildren() gets it right
146251729ef30fde23e4b1256690fbb60962390e560Enrico Granata        self.assertTrue(self.frame().FindVariable("numbers_list").MightHaveChildren(), "numbers_list.MightHaveChildren() says False for non empty!")
147251729ef30fde23e4b1256690fbb60962390e560Enrico Granata
1487541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.runCmd("type format delete int")
1497541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
15066205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata        self.runCmd("c")
1517541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1527541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable text_list",
15366205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata                    substrs = ['list has 3 items',
1547541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[0]', 'goofy',
1557541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                               '[1]', 'is',
15666205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata                               '[2]', 'smart'])
1577541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
158251729ef30fde23e4b1256690fbb60962390e560Enrico Granata        # check that MightHaveChildren() gets it right
159251729ef30fde23e4b1256690fbb60962390e560Enrico Granata        self.assertTrue(self.frame().FindVariable("text_list").MightHaveChildren(), "text_list.MightHaveChildren() says False for non empty!")
160251729ef30fde23e4b1256690fbb60962390e560Enrico Granata
1617541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("p text_list",
16266205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata                    substrs = ['list has 3 items',
163e20090b92739c6a142bf97e69159cccc869c394dEnrico Granata                               '\"goofy\"',
164e20090b92739c6a142bf97e69159cccc869c394dEnrico Granata                               '\"is\"',
16566205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata                               '\"smart\"'])
1667541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
16766205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata        self.runCmd("n")
16866205ce5381ab6db1f9bff83c483a4dc5854afc7Enrico Granata
1697541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        # check access-by-index
1707541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable text_list[0]",
1717541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['goofy']);
1727541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata        self.expect("frame variable text_list[3]",
1737541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata                    substrs = ['!!!']);
1747541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata
1757541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granataif __name__ == '__main__':
1767541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    import atexit
1777541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    lldb.SBDebugger.Initialize()
1787541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    atexit.register(lambda: lldb.SBDebugger.Terminate())
1797541b1b40662fa80d0d5f3988c1fdbf2d7454f74Enrico Granata    unittest2.main()
180