| # encoding: utf-8 | |
| """ | |
| Test lldb data formatter subsystem. | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| from ObjCDataFormatterTestCase import ObjCDataFormatterTestCase | |
| class ObjCDataFormatterNSContainer(ObjCDataFormatterTestCase): | |
| SHARED_BUILD_TESTCASE = False | |
| def test_nscontainers_with_run_command(self): | |
| """Test formatters for NS container classes.""" | |
| self.appkit_tester_impl(self.nscontainers_data_formatter_commands, False) | |
| def nscontainers_data_formatter_commands(self): | |
| self.runCmd("settings set target.prefer-dynamic-value no-dynamic-values") | |
| self.expect( | |
| "frame variable newArray nsDictionary newDictionary nscfDictionary cfDictionaryRef newMutableDictionary copyDictionary newMutableDictionaryRef cfarray_ref mutable_array_ref", | |
| substrs=[ | |
| "(NSArray *) newArray = ", | |
| ' @"50 elements"', | |
| "(NSDictionary *) nsDictionary = ", | |
| " 2 key/value pairs", | |
| "(NSDictionary *) newDictionary = ", | |
| " 12 key/value pairs", | |
| "(NSDictionary *) nscfDictionary = ", | |
| " 4 key/value pairs", | |
| "(CFDictionaryRef) cfDictionaryRef = ", | |
| " 2 key/value pairs", | |
| "(NSDictionary *) newMutableDictionary = ", | |
| " 21 key/value pairs", | |
| "(NSMutableDictionary *) copyDictionary = ", | |
| " 21 key/value pairs", | |
| "(CFMutableDictionaryRef) newMutableDictionaryRef = ", | |
| " 21 key/value pairs", | |
| "(CFArrayRef) cfarray_ref = ", | |
| ' @"3 elements"', | |
| "(CFMutableArrayRef) mutable_array_ref = ", | |
| ' @"11 elements"', | |
| ], | |
| ) | |
| self.expect( | |
| "frame var -d run-target copyDictionary[10]", substrs=['@"bar9"', '@"foo"'] | |
| ) | |
| self.expect( | |
| "frame variable -d run-target *nscfDictionary", | |
| ordered=False, | |
| patterns=[ | |
| r"\(__NSCFDictionary\) \*nscfDictionary =", | |
| 'key = 0x.* @"foo"', | |
| 'value = 0x.* @"foo"', | |
| 'key = 0x.* @"bar"', | |
| 'value = 0x.* @"bar"', | |
| 'key = 0x.* @"baz"', | |
| 'value = 0x.* @"baz"', | |
| 'key = 0x.* @"quux"', | |
| 'value = 0x.* @"quux"', | |
| ], | |
| ) | |
| self.expect( | |
| "frame variable -d run-target *cfDictionaryRef", | |
| ordered=False, | |
| patterns=[ | |
| r"\(const __CFDictionary\) \*cfDictionaryRef =", | |
| 'key = 0x.* @"foo"', | |
| 'value = 0x.* @"foo"', | |
| 'key = 0x.* @"bar"', | |
| 'value = 0x.* @"bar"', | |
| ], | |
| ) | |
| self.expect( | |
| "frame var nscfSet cfSetRef", | |
| substrs=[ | |
| "(NSSet *) nscfSet = ", | |
| "2 elements", | |
| "(CFSetRef) cfSetRef = ", | |
| "2 elements", | |
| ], | |
| ) | |
| self.expect( | |
| "frame variable -d run-target *nscfSet", | |
| patterns=[ | |
| r"\(__NSCFSet\) \*nscfSet =", | |
| r'\[0\] = 0x.* @".*"', | |
| r'\[1\] = 0x.* @".*"', | |
| ], | |
| ) | |
| self.expect( | |
| "frame variable -d run-target *cfSetRef", | |
| patterns=[ | |
| r"\(const __CFSet\) \*cfSetRef =", | |
| r'\[0\] = 0x.* @".*"', | |
| r'\[1\] = 0x.* @".*"', | |
| ], | |
| ) | |
| self.expect( | |
| "frame variable iset1 iset2 imset", | |
| substrs=["4 indexes", "512 indexes", "10 indexes"], | |
| ) | |
| self.expect( | |
| "frame variable binheap_ref", | |
| substrs=["(CFBinaryHeapRef) binheap_ref = ", '@"21 items"'], | |
| ) | |
| self.expect( | |
| "expression -d run -- (NSArray*)[NSArray new]", substrs=['@"0 elements"'] | |
| ) |