Index: class-dump/src/UnitTests/CDStructHandlingUnitTest.m |
=================================================================== |
--- class-dump/src/UnitTests/CDStructHandlingUnitTest.m (revision 0) |
+++ class-dump/src/UnitTests/CDStructHandlingUnitTest.m (revision 0) |
@@ -0,0 +1,271 @@ |
+// This file is part of class-dump, a utility for examining the Objective-C segment of Mach-O files. |
+// Copyright (C) 1997-1998, 2000-2001, 2004-2010 Steve Nygard. |
+ |
+#import "CDStructHandlingUnitTest.h" |
+ |
+#import <Foundation/Foundation.h> |
+#import "NSError-CDExtensions.h" |
+ |
+#import "CDClassDump.h" |
+#import "CDType.h" |
+#import "CDTypeFormatter.h" |
+#import "CDTypeParser.h" |
+ |
+@implementation CDStructHandlingUnitTest |
+ |
+- (void)dealloc; |
+{ |
+ [classDump release]; |
+ |
+ [super dealloc]; |
+} |
+ |
+- (void)setUp; |
+{ |
+ classDump = [[CDClassDump alloc] init]; |
+} |
+ |
+- (void)tearDown; |
+{ |
+ [classDump release]; |
+ classDump = nil; |
+} |
+ |
+- (void)testVariableName:(NSString *)aVariableName type:(NSString *)aType expectedResult:(NSString *)expectedResult; |
+{ |
+ NSString *result; |
+ |
+ result = [[classDump ivarTypeFormatter] formatVariable:aVariableName type:aType symbolReferences:nil]; |
+ STAssertEqualObjects(expectedResult, result, @""); |
+} |
+ |
+- (void)registerStructsFromType:(NSString *)aTypeString phase:(int)phase; |
+{ |
+ CDTypeParser *parser; |
+ CDType *type; |
+ NSError *error; |
+ |
+ parser = [[CDTypeParser alloc] initWithType:aTypeString]; |
+ type = [parser parseType:&error]; |
+ STAssertNotNil(type, @"-[CDTypeParser parseType:] error: %@", [error myExplanation]); |
+ |
+ [type phase:phase registerStructuresWithObject:classDump usedInMethod:NO]; |
+ [parser release]; |
+} |
+ |
+// TODO (2004-01-05): Move this somewhere that we can share it with the main app. |
+- (void)testFilename:(NSString *)testFilename; |
+{ |
+ NSString *inputFilename, *outputFilename; |
+ NSMutableString *resultString; |
+ NSString *inputContents, *expectedOutputContents; |
+ NSArray *inputLines, *inputFields; |
+ int phase; |
+ int count, index; |
+ NSBundle *bundle; |
+ |
+ //NSLog(@"***** %@", testFilename); |
+ |
+ resultString = [NSMutableString string]; |
+ |
+ bundle = [NSBundle bundleForClass:[self class]]; |
+ inputFilename = [bundle pathForResource:[testFilename stringByAppendingString:@"-in"] ofType:@"txt"]; |
+ outputFilename = [bundle pathForResource:[testFilename stringByAppendingString:@"-out"] ofType:@"txt"]; |
+ |
+ inputContents = [NSString stringWithContentsOfFile:inputFilename]; |
+ expectedOutputContents = [NSString stringWithContentsOfFile:outputFilename]; |
+ |
+ inputLines = [inputContents componentsSeparatedByString:@"\n"]; |
+ count = [inputLines count]; |
+ |
+ // First register structs/unions |
+ for (phase = 1; phase <= 2; phase++) { |
+ //NSLog(@"Phase %d ========================================", phase); |
+ |
+ for (index = 0; index < count; index++) { |
+ NSString *line; |
+ |
+ line = [inputLines objectAtIndex:index]; |
+ if ([line length] > 0 && [line hasPrefix:@"//"] == NO) { |
+ inputFields = [line componentsSeparatedByString:@"\t"]; |
+ [self registerStructsFromType:[inputFields objectAtIndex:0] phase:phase]; |
+ } |
+ } |
+ |
+ [classDump endPhase:phase]; |
+ } |
+ |
+ // Then generate output |
+ [classDump appendStructuresToString:resultString symbolReferences:nil]; |
+ |
+ for (index = 0; index < count; index++) { |
+ NSString *line; |
+ NSString *type, *variableName; |
+ |
+ line = [inputLines objectAtIndex:index]; |
+ if ([line length] > 0 && [line hasPrefix:@"//"] == NO) { |
+ int fieldCount, level; |
+ NSString *formattedString; |
+ |
+ inputFields = [line componentsSeparatedByString:@"\t"]; |
+ fieldCount = [inputFields count]; |
+ type = [inputFields objectAtIndex:0]; |
+ if (fieldCount > 1) |
+ variableName = [inputFields objectAtIndex:1]; |
+ else |
+ variableName = @"var"; |
+ |
+ if (fieldCount > 2) |
+ level = [[inputFields objectAtIndex:2] intValue]; |
+ else |
+ level = 0; |
+ |
+ formattedString = [[classDump ivarTypeFormatter] formatVariable:variableName type:type symbolReferences:nil]; |
+ if (formattedString != nil) { |
+ [resultString appendString:formattedString]; |
+ [resultString appendString:@";\n"]; |
+ } else { |
+ [resultString appendString:@"Parse failed.\n"]; |
+ } |
+ } |
+ } |
+ |
+ STAssertEqualObjects(expectedOutputContents, resultString, @"test file: %@", testFilename); |
+} |
+ |
+#if 1 |
+- (void)test01; |
+{ |
+ NSString *first = @"{_NSRange=II}"; |
+ int phase; |
+ |
+ STAssertNotNil(classDump, @"classDump"); |
+ STAssertNotNil([classDump ivarTypeFormatter], @"[classDump ivarTypeFormatter]"); |
+ |
+ for (phase = 1; phase <= 2; phase++) |
+ [self registerStructsFromType:first phase:phase]; |
+ [self testVariableName:@"foo" type:first expectedResult:@" struct _NSRange foo"]; |
+ |
+ // Register {_NSRange=II} |
+ // Test {_NSRange=II} |
+} |
+ |
+- (void)test02; |
+{ |
+ NSString *first = @"{_NSRange=II}"; |
+ NSString *second = @"{_NSRange=\"location\"I\"length\"I}"; |
+ int phase; |
+ |
+ for (phase = 1; phase <= 2; phase++) { |
+ [self registerStructsFromType:first phase:phase]; |
+ [self registerStructsFromType:second phase:phase]; |
+ } |
+ |
+ [self testVariableName:@"foo" type:first expectedResult:@" struct _NSRange foo"]; |
+ [self testVariableName:@"bar" type:second expectedResult:@" struct _NSRange bar"]; |
+ |
+ // Register {_NSRange=II} |
+ // Register {_NSRange="location"I"length"I} |
+ // Test {_NSRange=II} |
+ // Test {_NSRange="location"I"length"I} |
+} |
+ |
+- (void)test03; |
+{ |
+ NSString *first = @"{_NSRange=\"location\"I\"length\"I}"; |
+ NSString *second = @"{_NSRange=II}"; |
+ int phase; |
+ |
+ for (phase = 1; phase <= 2; phase++) { |
+ [self registerStructsFromType:first phase:phase]; |
+ [self registerStructsFromType:second phase:phase]; |
+ } |
+ |
+ [self testVariableName:@"foo" type:first expectedResult:@" struct _NSRange foo"]; |
+ [self testVariableName:@"bar" type:second expectedResult:@" struct _NSRange bar"]; |
+ |
+ // Register {_NSRange="location"I"length"I} |
+ // Register {_NSRange=II} |
+ // Test {_NSRange="location"I"length"I} |
+ // Test {_NSRange=II} |
+} |
+ |
+- (void)test04; |
+{ |
+ // I'm guessing that "shud" could stand for Struct Handling Unittest Data. |
+ [self testFilename:@"shud01"]; |
+} |
+ |
+- (void)test05; |
+{ |
+ [self testFilename:@"shud02"]; |
+} |
+ |
+- (void)test06; |
+{ |
+ //[self testFilename:@"shud03"]; |
+} |
+ |
+- (void)test07; |
+{ |
+ [self testFilename:@"shud04"]; |
+} |
+ |
+- (void)test08; |
+{ |
+ [self testFilename:@"shud05"]; |
+} |
+ |
+- (void)test09; |
+{ |
+ [self testFilename:@"shud06"]; |
+} |
+ |
+- (void)test10; |
+{ |
+ [self testFilename:@"shud07"]; |
+} |
+ |
+- (void)test11; |
+{ |
+ [self testFilename:@"shud08"]; |
+} |
+ |
+- (void)test12; |
+{ |
+ [self testFilename:@"shud09"]; |
+} |
+ |
+- (void)test13; |
+{ |
+ [self testFilename:@"shud10"]; |
+} |
+ |
+- (void)test14; |
+{ |
+ [self testFilename:@"shud11"]; |
+} |
+#endif |
+ |
+- (void)test15; |
+{ |
+ [self testFilename:@"shud13"]; |
+} |
+ |
+- (void)test16; |
+{ |
+ //[self testFilename:@"shud14"]; |
+} |
+ |
+// This tests the new code for dealing with named objects and field names in structures. |
+- (void)test17; |
+{ |
+ [self testFilename:@"shud15"]; |
+} |
+ |
+- (void)test18; |
+{ |
+ [self testFilename:@"shud16"]; |
+} |
+ |
+@end |
Property changes on: class-dump/src/UnitTests/CDStructHandlingUnitTest.m |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |