blob: c0d8b0dd41d04f8c9c4449fd689c8552e86f8b96 [file] [log] [blame]
// 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 "CDTypeParserUnitTest.h"
#import <Foundation/Foundation.h>
#import "NSError-CDExtensions.h"
#import "CDType.h"
#import "CDTypeLexer.h"
#import "CDTypeParser.h"
@implementation CDTypeParserUnitTest
- (void)setUp;
{
}
- (void)tearDown;
{
}
- (void)testType:(NSString *)aType showLexing:(BOOL)shouldShowLexing;
{
CDTypeParser *aTypeParser;
CDType *result;
NSError *error;
if (shouldShowLexing) {
NSLog(@"----------------------------------------");
NSLog(@"str: %@", aType);
}
aTypeParser = [[CDTypeParser alloc] initWithType:aType];
[[aTypeParser lexer] setShouldShowLexing:shouldShowLexing];
result = [aTypeParser parseType:&error];
STAssertNotNil(result, @"-[CDTypeParser parseType:] error: %@", [error myExplanation]);
[aTypeParser release];
}
- (void)testMethodType:(NSString *)aMethodType showLexing:(BOOL)shouldShowLexing;
{
CDTypeParser *aTypeParser;
NSArray *result;
NSError *error;
aTypeParser = [[CDTypeParser alloc] initWithType:aMethodType];
[[aTypeParser lexer] setShouldShowLexing:shouldShowLexing];
result = [aTypeParser parseMethodType:&error];
STAssertNotNil(result, @"-[CDTypeParser parseMethodType:] error: %@", [error myExplanation]);
[aTypeParser release];
}
- (void)testLoneConstType;
{
// On Panther, from WebCore, -[KWQPageState
// initWithDocument:URL:windowProperties:locationProperties:interpreterBuiltins:]
// has part of a method type as "r12". "r" is const, but it doesn't modify anything.
[self testMethodType:@"ri12i16" showLexing:NO]; // This works
[self testMethodType:@"r12i16" showLexing:NO]; // This didn't work.
}
// Field names:
// {?="field1"^@"NSObject"} -- end of struct, use quoted string
// {?="field1"^@"NSObject""field2"@} -- followed by field, use quoted string
// {?="field1"^@"field2"^@} -- quoted string is followed by type, don't use quoted string for object
// No field names -- always use the quoted string
// {?=^@"NSObject"}
// {?=^@"NSObject"^@"NSObject"}
- (void)testObjectQuotedStringTypes;
{
NSString *str;
str = @"{?=\"field1\"^@\"NSObject\"}";
[self testType:str showLexing:NO];
str = @"{?=\"field1\"^@\"NSObject\"\"field2\"@}";
[self testType:str showLexing:NO];
str = @"{?=\"field1\"^@\"field2\"^@}";
[self testType:str showLexing:NO];
str = @"{?=^@\"NSObject\"}";
[self testType:str showLexing:NO];
str = @"{?=^@\"NSObject\"^@\"NSObject\"}";
[self testType:str showLexing:NO];
}
- (void)testMissingFieldNames;
{
NSString *str;
str = @"{?=b8b4b1b1b18\"_field1\"[8S]}";
[self testType:str showLexing:NO];
}
- (void)testLowercaseClassName;
{
NSString *str;
str = @"@\"iToolsAccount\"";
[self testType:str showLexing:NO];
}
- (void)testLowercaseClassName2;
{
NSString *str;
str = @"{?=@\"iToolsAccount\"}";
[self testType:str showLexing:NO];
}
- (void)testPages08;
{
// Pages '08 has this bit in it: {vector<<unnamed>::AnimationChunk,std::allocator<<unnamed>::AnimationChunk> >=II}
[self testType:@"{unnamed=II}" showLexing:NO];
[self testType:@"{vector<unnamed>=II}" showLexing:NO];
[self testType:@"{vector<unnamed::blegga>=II}" showLexing:NO];
[self testType:@"{vector<<unnamed>::blegga>=II}" showLexing:NO];
[self testType:@"{vector<<unnamed>::AnimationChunk>=II}" showLexing:NO];
[self testType:@"{vector<<unnamed>::AnimationChunk>=II}" showLexing:NO];
[self testType:@"{vector<<unnamed>::AnimationChunk,std::allocator<<unnamed>::AnimationChunk> >=II}" showLexing:NO];
}
@end