199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb data formatter subsystem. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass PrintObjectArrayTestCase(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht @skipUnlessDarwin 1699451b44SJordan Rupprecht def test_print_array(self): 1799451b44SJordan Rupprecht """Test that expr -O -Z works""" 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht self.printarray_data_formatter_commands() 2099451b44SJordan Rupprecht 21*9d5e95d0SJonas Devlieghere @skipUnlessDarwin 22*9d5e95d0SJonas Devlieghere def test_print_array_no_const(self): 23*9d5e95d0SJonas Devlieghere """Test that expr -O -Z works""" 24*9d5e95d0SJonas Devlieghere disable_constant_classes = { 25*9d5e95d0SJonas Devlieghere 'CC': 26*9d5e95d0SJonas Devlieghere 'xcrun clang', # FIXME: Remove when flags are available upstream. 27*9d5e95d0SJonas Devlieghere 'CFLAGS_EXTRAS': 28*9d5e95d0SJonas Devlieghere '-fno-constant-nsnumber-literals ' + 29*9d5e95d0SJonas Devlieghere '-fno-constant-nsarray-literals ' + 30*9d5e95d0SJonas Devlieghere '-fno-constant-nsdictionary-literals' 31*9d5e95d0SJonas Devlieghere } 32*9d5e95d0SJonas Devlieghere self.build(dictionary=disable_constant_classes) 33*9d5e95d0SJonas Devlieghere self.printarray_data_formatter_commands() 34*9d5e95d0SJonas Devlieghere 3599451b44SJordan Rupprecht def setUp(self): 3699451b44SJordan Rupprecht # Call super's setUp(). 3799451b44SJordan Rupprecht TestBase.setUp(self) 3899451b44SJordan Rupprecht # Find the line number to break at. 3999451b44SJordan Rupprecht self.line = line_number('main.mm', 'break here') 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht def printarray_data_formatter_commands(self): 4299451b44SJordan Rupprecht """Test that expr -O -Z works""" 4399451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 4699451b44SJordan Rupprecht self, "main.mm", self.line, num_expected_locations=1, loc_exact=True) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 5199451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 5299451b44SJordan Rupprecht substrs=['stopped', 5399451b44SJordan Rupprecht 'stop reason = breakpoint']) 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 5699451b44SJordan Rupprecht # clean slate for the next test case. 5799451b44SJordan Rupprecht def cleanup(): 5899451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 5999451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 6099451b44SJordan Rupprecht self.runCmd('type synth clear', check=False) 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 6399451b44SJordan Rupprecht self.addTearDownHook(cleanup) 6499451b44SJordan Rupprecht 6599451b44SJordan Rupprecht self.expect( 6699451b44SJordan Rupprecht 'expr --element-count 3 --object-description -- objects', 6799451b44SJordan Rupprecht substrs=[ 6899451b44SJordan Rupprecht '3735928559', 6999451b44SJordan Rupprecht '4276993775', 7099451b44SJordan Rupprecht '3203398366', 7199451b44SJordan Rupprecht 'Hello', 7299451b44SJordan Rupprecht 'World', 7399451b44SJordan Rupprecht 'Two =', 7499451b44SJordan Rupprecht '1 =']) 7599451b44SJordan Rupprecht self.expect( 7699451b44SJordan Rupprecht 'poarray 3 objects', 7799451b44SJordan Rupprecht substrs=[ 7899451b44SJordan Rupprecht '3735928559', 7999451b44SJordan Rupprecht '4276993775', 8099451b44SJordan Rupprecht '3203398366', 8199451b44SJordan Rupprecht 'Hello', 8299451b44SJordan Rupprecht 'World', 8399451b44SJordan Rupprecht 'Two =', 8499451b44SJordan Rupprecht '1 =']) 8599451b44SJordan Rupprecht self.expect( 8699451b44SJordan Rupprecht 'expr --element-count 3 --object-description --description-verbosity=full -- objects', 8799451b44SJordan Rupprecht substrs=[ 8899451b44SJordan Rupprecht '[0] =', 8999451b44SJordan Rupprecht '3735928559', 9099451b44SJordan Rupprecht '4276993775', 9199451b44SJordan Rupprecht '3203398366', 9299451b44SJordan Rupprecht '[1] =', 9399451b44SJordan Rupprecht 'Hello', 9499451b44SJordan Rupprecht 'World', 9599451b44SJordan Rupprecht '[2] =', 9699451b44SJordan Rupprecht 'Two =', 9799451b44SJordan Rupprecht '1 =']) 9899451b44SJordan Rupprecht self.expect( 9999451b44SJordan Rupprecht 'parray 3 objects', 10099451b44SJordan Rupprecht substrs=[ 10199451b44SJordan Rupprecht '[0] = 0x', 10299451b44SJordan Rupprecht '[1] = 0x', 10399451b44SJordan Rupprecht '[2] = 0x']) 10499451b44SJordan Rupprecht self.expect( 10599451b44SJordan Rupprecht 'expr --element-count 3 -d run -- objects', 10699451b44SJordan Rupprecht substrs=[ 10799451b44SJordan Rupprecht '3 elements', 10899451b44SJordan Rupprecht '2 elements', 10999451b44SJordan Rupprecht '2 key/value pairs']) 11099451b44SJordan Rupprecht self.expect( 11199451b44SJordan Rupprecht 'expr --element-count 3 -d run --ptr-depth=1 -- objects', 11299451b44SJordan Rupprecht substrs=[ 11399451b44SJordan Rupprecht '3 elements', 11499451b44SJordan Rupprecht '3735928559', 11599451b44SJordan Rupprecht '4276993775', 11699451b44SJordan Rupprecht '3203398366', 11799451b44SJordan Rupprecht '2 elements', 11899451b44SJordan Rupprecht '"Hello"', 11999451b44SJordan Rupprecht '"World"', 12099451b44SJordan Rupprecht '2 key/value pairs', 12199451b44SJordan Rupprecht ]) 122