19b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata"""
29b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico GranataTest lldb data formatter subsystem.
39b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata"""
49b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
59b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataimport os, time
69b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataimport unittest2
79b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataimport lldb
89b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granatafrom lldbtest import *
9431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
109b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1192f75728050db93bfaf3e73d86a4a8a3a75dad8aJohnny Chenclass CppDataFormatterTestCase(TestBase):
129b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
139b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    mydir = os.path.join("functionalities", "data-formatter", "data-formatter-cpp")
149b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
159b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dsym_test
179b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    def test_with_dsym_and_run_command(self):
189b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        """Test data formatter commands."""
199b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.buildDsym()
209b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.data_formatter_commands()
219b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
22a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen    @dwarf_test
239b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    def test_with_dwarf_and_run_command(self):
249b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        """Test data formatter commands."""
259b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.buildDwarf()
269b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.data_formatter_commands()
279b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
289b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    def setUp(self):
299b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # Call super's setUp().
309b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        TestBase.setUp(self)
319b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # Find the line number to break at.
329b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.line = line_number('main.cpp', '// Set break point at this line.')
339b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
349b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    def data_formatter_commands(self):
359b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        """Test that that file and class static variables display correctly."""
369b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
379b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
38431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
399b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
409b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("run", RUN_SUCCEEDED)
419b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
429b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # The stop reason of the thread should be breakpoint.
439b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
449b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['stopped',
459b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'stop reason = breakpoint'])
469b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
479b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable",
489b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['(Speed) SPILookHex = 5.55' # Speed by default is 5.55.
499b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                        ]);
509b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
519b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # This is the function to remove the custom formats in order to have a
529b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # clean slate for the next test case.
539b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        def cleanup():
549b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            self.runCmd('type format clear', check=False)
559b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            self.runCmd('type summary clear', check=False)
569b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
579b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # Execute the cleanup function during test case tear down.
589b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.addTearDownHook(cleanup)
599b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
609b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type format add -C yes -f x Speed BitField")
619b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type format add -C no -f c RealNumber")
629b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type format add -C no -f x Type2")
639b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type format add -C yes -f c Type1")
649b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
659b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # The type format list should show our custom formats.
669b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("type format list",
679b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['RealNumber',
689b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'Speed',
699b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'BitField',
709b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'Type1',
719b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'Type2'])
729b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
739b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable",
749b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            patterns = ['\(Speed\) SPILookHex = 0x[0-9a-f]+' # Speed should look hex-ish now.
759b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                        ]);
761a102087f54079c25c8827afac6153a44ca535daEnrico Granata
771a102087f54079c25c8827afac6153a44ca535daEnrico Granata        # gcc4.2 on Mac OS X skips typedef chains in the DWARF output
781a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if self.getCompiler() in ['clang', 'llvm-gcc']:
791a102087f54079c25c8827afac6153a44ca535daEnrico Granata            self.expect("frame variable",
801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                patterns = ['\(SignalMask\) SMILookHex = 0x[0-9a-f]+' # SignalMask should look hex-ish now.
811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ]);
821a102087f54079c25c8827afac6153a44ca535daEnrico Granata            self.expect("frame variable", matching=False,
831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        patterns = ['\(Type4\) T4ILookChar = 0x[0-9a-f]+' # Type4 should NOT look hex-ish now.
841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    ]);
851a102087f54079c25c8827afac6153a44ca535daEnrico Granata
869b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # Now let's delete the 'Speed' custom format.
879b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type format delete Speed")
889b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
899b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # The type format list should not show 'Speed' at this point.
909b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("type format list", matching=False,
919b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['Speed'])
929b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
939b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        # Delete type format for 'Speed', we should expect an error message.
949b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("type format delete Speed", error=True,
959b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['no custom format for Speed'])
969b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
97242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"arr = ${var%s}\" -x \"char \\[[0-9]+\\]\" -v")
981a102087f54079c25c8827afac6153a44ca535daEnrico Granata
991a102087f54079c25c8827afac6153a44ca535daEnrico Granata        self.expect("frame variable strarr",
10086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    substrs = ['arr = "Hello world!"'])
1011a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1021a102087f54079c25c8827afac6153a44ca535daEnrico Granata        self.runCmd("type summary clear")
1031a102087f54079c25c8827afac6153a44ca535daEnrico Granata
104242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"ptr = ${var%s}\" \"char *\" -v")
1051a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1061a102087f54079c25c8827afac6153a44ca535daEnrico Granata        self.expect("frame variable strptr",
1071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    substrs = ['ptr = "Hello world!"'])
1081a102087f54079c25c8827afac6153a44ca535daEnrico Granata
109242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"arr = ${var%s}\" -x \"char \\[[0-9]+\\]\" -v")
1101a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1111a102087f54079c25c8827afac6153a44ca535daEnrico Granata        self.expect("frame variable strarr",
11286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    substrs = ['arr = "Hello world!'])
113915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
114915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        # check that rdar://problem/10011145 (Standard summary format for char[] doesn't work as the result of "expr".) is solved
115915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        self.expect("p strarr",
116915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    substrs = ['arr = "Hello world!'])
117915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
1181a102087f54079c25c8827afac6153a44ca535daEnrico Granata        self.expect("frame variable strptr",
1191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    substrs = ['ptr = "Hello world!"'])
1201a102087f54079c25c8827afac6153a44ca535daEnrico Granata
121915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        self.expect("p strptr",
122915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata                    substrs = ['ptr = "Hello world!"'])
123915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
124915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        self.expect("p (char*)\"1234567890123456789012345678901234567890123456789012345678901234ABC\"",
125915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata            substrs = ['(char *) $', ' = ptr = ', ' "1234567890123456789012345678901234567890123456789012345678901234ABC"'])
126915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
1279b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type summary add -c Point")
1289b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1299b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable iAmSomewhere",
130cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata            substrs = ['x = 4',
131cf09f885c201becf51acc4a5cfac00b3df53f2a8Enrico Granata                       'y = 6'])
1329b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1339b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("type summary list",
1349b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['Point',
1359b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'one-line'])
1369b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
137242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"y=${var.y%x}\" Point")
1389b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1399b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable iAmSomewhere",
1409b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['y=0x'])
141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
142242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"y=${var.y},x=${var.x}\" Point")
143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        self.expect("frame variable iAmSomewhere",
145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    substrs = ['y=6',
146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                               'x=4'])
1479b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
148242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"hello\" Point -e")
1499b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1509b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("type summary list",
1519b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['Point',
1529b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'show children'])
1539b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1549b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable iAmSomewhere",
1559b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['hello',
1569b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'x = 4',
1579b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       '}'])
1589b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
159242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"Sign: ${var[31]%B} Exponent: ${var[23-30]%x} Mantissa: ${var[0-22]%u}\" ShowMyGuts")
1609b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1619b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable cool_pointer->floating",
1629b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['Sign: true',
1639b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       'Exponent: 0x',
1649b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       '80'])
1659b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
166242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"a test\" i_am_cool")
1679b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1689b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable cool_pointer",
1699b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['a test'])
1709b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
171242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"a test\" i_am_cool --skip-pointers")
1729b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1739b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable cool_pointer",
1749b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['a test'],
1759b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            matching = False)
1769b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
177242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var[1-3]}\" \"int [5]\"")
1789b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1799b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable int_array",
1809b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['2',
1819b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       '3',
1829b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata                       '4'])
1839b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1849b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.runCmd("type summary clear")
1859b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
186242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var[0-2].integer}\" \"i_am_cool *\"")
187242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var[2-4].integer}\" \"i_am_cool [5]\"")
1889b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1899b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable cool_array",
1909b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['1,1,6'])
1919b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
1929b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata        self.expect("frame variable cool_pointer",
1939b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata            substrs = ['3,0,0'])
1949b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
195e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        # test special symbols for formatting variables into summaries
196242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"cool object @ ${var%L}\" i_am_cool")
197e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        self.runCmd("type summary delete \"i_am_cool [5]\"")
1989b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
199e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        # this test might fail if the compiler tries to store
200e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        # these values into registers.. hopefully this is not
201e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        # going to be the case
202e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        self.expect("frame variable cool_array",
203e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            substrs = ['[0] = cool object @ 0x',
204e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                       '[1] = cool object @ 0x',
205e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                       '[2] = cool object @ 0x',
206e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                       '[3] = cool object @ 0x',
207e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                       '[4] = cool object @ 0x'])
2086f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
2096f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # test getting similar output by exploiting ${var} = 'type @ location' for aggregates
210242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var}\" i_am_cool")
2116f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
2126f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # this test might fail if the compiler tries to store
2136f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # these values into registers.. hopefully this is not
2146f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # going to be the case
2156f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        self.expect("frame variable cool_array",
2166f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                    substrs = ['[0] = i_am_cool @ 0x',
2176f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[1] = i_am_cool @ 0x',
2186f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[2] = i_am_cool @ 0x',
2196f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[3] = i_am_cool @ 0x',
2206f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[4] = i_am_cool @ 0x'])
2216f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
222e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
2236f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # test getting same output by exploiting %T and %L together for aggregates
224242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var%T} @ ${var%L}\" i_am_cool")
2256f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
2266f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # this test might fail if the compiler tries to store
2276f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # these values into registers.. hopefully this is not
2286f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        # going to be the case
2296f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata        self.expect("frame variable cool_array",
2306f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                    substrs = ['[0] = i_am_cool @ 0x',
2316f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[1] = i_am_cool @ 0x',
2326f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[2] = i_am_cool @ 0x',
2336f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[3] = i_am_cool @ 0x',
2346f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata                               '[4] = i_am_cool @ 0x'])
2356f30287bdc836c715fcac75b06ec58d13b79e715Enrico Granata
236242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"goofy\" i_am_cool")
237242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"${var.second_cool%S}\" i_am_cooler")
238e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
239e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        self.expect("frame variable the_coolest_guy",
240e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            substrs = ['(i_am_cooler) the_coolest_guy = goofy'])
2419b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata
242d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        # check that unwanted type specifiers are removed
243d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.runCmd("type summary delete i_am_cool")
244242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"goofy\" \"class i_am_cool\"")
245d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.expect("frame variable the_coolest_guy",
246d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata                substrs = ['(i_am_cooler) the_coolest_guy = goofy'])
247d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata
248d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.runCmd("type summary delete i_am_cool")
249242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"goofy\" \"enum i_am_cool\"")
250d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.expect("frame variable the_coolest_guy",
251d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata                    substrs = ['(i_am_cooler) the_coolest_guy = goofy'])
252d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata
253d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.runCmd("type summary delete i_am_cool")
254242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"goofy\" \"struct i_am_cool\"")
255d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.expect("frame variable the_coolest_guy",
256d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata                    substrs = ['(i_am_cooler) the_coolest_guy = goofy'])
257d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata
2582f2c6fb9e61dadd9296948cb358680172b30232eEnrico Granata        # many spaces, but we still do the right thing
259d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.runCmd("type summary delete i_am_cool")
260242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"goofy\" \"union     i_am_cool\"")
261d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.expect("frame variable the_coolest_guy",
262d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata                    substrs = ['(i_am_cooler) the_coolest_guy = goofy'])
263d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata
264d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        # but that not *every* specifier is removed
265d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.runCmd("type summary delete i_am_cool")
266242ffb80dd0c1c650c8a9f05656a3ba2f339993dEnrico Granata        self.runCmd("type summary add --summary-string \"goofy\" \"wrong i_am_cool\"")
267d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata        self.expect("frame variable the_coolest_guy", matching=False,
268d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata                    substrs = ['(i_am_cooler) the_coolest_guy = goofy'])
269d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata
2703069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata        # check that formats are not sticking since that is the behavior we want
2713069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata        self.expect("frame variable iAmInt --format hex", substrs = ['(int) iAmInt = 0x00000001'])
2723069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata        self.expect("frame variable iAmInt", matching=False, substrs = ['(int) iAmInt = 0x00000001'])
2733069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata        self.expect("frame variable iAmInt", substrs = ['(int) iAmInt = 1'])
274d3a86a2bad17204570577dbafc51f3b107310de8Enrico Granata
2759b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granataif __name__ == '__main__':
2769b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    import atexit
2779b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    lldb.SBDebugger.Initialize()
2789b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    atexit.register(lambda: lldb.SBDebugger.Terminate())
2799b3117e0365f3a3d59cf9adc073f716cea3bf942Enrico Granata    unittest2.main()
280