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 DataFormatterBoolRefPtr(TestBase): 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht @skipUnlessDarwin 1699451b44SJordan Rupprecht def test_boolrefptr_with_run_command(self): 1799451b44SJordan Rupprecht """Test the formatters we use for BOOL& and BOOL* in Objective-C.""" 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht self.boolrefptr_data_formatter_commands() 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht def setUp(self): 2299451b44SJordan Rupprecht # Call super's setUp(). 2399451b44SJordan Rupprecht TestBase.setUp(self) 2499451b44SJordan Rupprecht # Find the line number to break at. 2599451b44SJordan Rupprecht self.line = line_number('main.mm', '// Set break point at this line.') 2699451b44SJordan Rupprecht 2799451b44SJordan Rupprecht def boolrefptr_data_formatter_commands(self): 2899451b44SJordan Rupprecht """Test the formatters we use for BOOL& and BOOL* in Objective-C.""" 2999451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 3299451b44SJordan Rupprecht self, "main.mm", self.line, num_expected_locations=1, loc_exact=True) 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 3599451b44SJordan Rupprecht 3699451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 3799451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 3899451b44SJordan Rupprecht substrs=['stopped', 3999451b44SJordan Rupprecht 'stop reason = breakpoint']) 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 4299451b44SJordan Rupprecht # clean slate for the next test case. 4399451b44SJordan Rupprecht def cleanup(): 4499451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 4599451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 4699451b44SJordan Rupprecht self.runCmd('type synth clear', check=False) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 4999451b44SJordan Rupprecht self.addTearDownHook(cleanup) 5099451b44SJordan Rupprecht 5133ece572SDavide Italiano isArm = 'arm' in self.getArchitecture() 5299451b44SJordan Rupprecht 5399451b44SJordan Rupprecht # Now check that we use the right summary for BOOL& 5499451b44SJordan Rupprecht self.expect('frame variable yes_ref', 5599451b44SJordan Rupprecht substrs=['YES']) 5699451b44SJordan Rupprecht self.expect('frame variable no_ref', 5799451b44SJordan Rupprecht substrs=['NO']) 5833ece572SDavide Italiano if not(isArm): 5999451b44SJordan Rupprecht self.expect('frame variable unset_ref', substrs=['12']) 6099451b44SJordan Rupprecht 6199451b44SJordan Rupprecht # Now check that we use the right summary for BOOL* 6299451b44SJordan Rupprecht self.expect('frame variable yes_ptr', 6399451b44SJordan Rupprecht substrs=['YES']) 6499451b44SJordan Rupprecht self.expect('frame variable no_ptr', 6599451b44SJordan Rupprecht substrs=['NO']) 6633ece572SDavide Italiano if not(isArm): 6799451b44SJordan Rupprecht self.expect('frame variable unset_ptr', substrs=['12']) 6899451b44SJordan Rupprecht 6999451b44SJordan Rupprecht # Now check that we use the right summary for BOOL 7099451b44SJordan Rupprecht self.expect('frame variable yes', 7199451b44SJordan Rupprecht substrs=['YES']) 7299451b44SJordan Rupprecht self.expect('frame variable no', 7399451b44SJordan Rupprecht substrs=['NO']) 7433ece572SDavide Italiano if not(isArm): 7599451b44SJordan Rupprecht self.expect('frame variable unset', substrs=['12']) 76dc057e87SShafik Yaghmour 77*f8994453SJonas Devlieghere # BOOL is bool instead of signed char on ARM. 78*f8994453SJonas Devlieghere converted_YES = "-1" if not isArm else "YES" 79*f8994453SJonas Devlieghere 80dc057e87SShafik Yaghmour self.expect_expr('myField', result_type="BoolBitFields", 81dc057e87SShafik Yaghmour result_children=[ 82dc057e87SShafik Yaghmour ValueCheck(name="fieldOne", summary="NO"), 83*f8994453SJonas Devlieghere ValueCheck(name="fieldTwo", summary=converted_YES), 84dc057e87SShafik Yaghmour ValueCheck(name="fieldThree", summary="NO"), 85dc057e87SShafik Yaghmour ValueCheck(name="fieldFour", summary="NO"), 86*f8994453SJonas Devlieghere ValueCheck(name="fieldFive", summary=converted_YES) 87dc057e87SShafik Yaghmour ]) 88