| Index: class-dump/src/UnitTests/CDTypeLexerUnitTest.m
|
| ===================================================================
|
| --- class-dump/src/UnitTests/CDTypeLexerUnitTest.m (revision 0)
|
| +++ class-dump/src/UnitTests/CDTypeLexerUnitTest.m (revision 0)
|
| @@ -0,0 +1,177 @@
|
| +// 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 "CDTypeLexerUnitTest.h"
|
| +
|
| +#import <Foundation/Foundation.h>
|
| +#import "CDTypeLexer.h"
|
| +
|
| +struct tokenValuePair {
|
| + int token;
|
| + NSString *value;
|
| + int nextState;
|
| +};
|
| +
|
| +@implementation CDTypeLexerUnitTest
|
| +
|
| +- (void)setUp;
|
| +{
|
| +}
|
| +
|
| +- (void)tearDown;
|
| +{
|
| +}
|
| +
|
| +- (void)_setupLexerForString:(NSString *)str;
|
| +{
|
| + lexer = [[CDTypeLexer alloc] initWithString:str];
|
| +}
|
| +
|
| +- (void)_cleanupLexer;
|
| +{
|
| + [lexer release];
|
| + lexer = nil;
|
| +}
|
| +
|
| +- (void)_showScannedTokens;
|
| +{
|
| + int token;
|
| +
|
| + NSLog(@"----------------------------------------");
|
| + STAssertNotNil(lexer, @"");
|
| +
|
| + NSLog(@"str: %@", [lexer string]);
|
| +
|
| + [lexer setShouldShowLexing:YES];
|
| +
|
| + token = [lexer scanNextToken];
|
| + while (token != TK_EOS)
|
| + token = [lexer scanNextToken];
|
| + NSLog(@"----------------------------------------");
|
| +}
|
| +
|
| +- (void)showScannedTokensForString:(NSString *)str;
|
| +{
|
| + [self _setupLexerForString:str];
|
| + [self _showScannedTokens];
|
| + [self _cleanupLexer];
|
| +}
|
| +
|
| +// The last token in expectedResults must be TK_EOS.
|
| +- (void)testLexingString:(NSString *)str expectedResults:(struct tokenValuePair *)expectedResults;
|
| +{
|
| + int token;
|
| +
|
| + [self _setupLexerForString:str];
|
| + //NSLog(@"str: %@", [lexer string]);
|
| + //[lexer setShouldShowLexing:YES];
|
| +
|
| + while (expectedResults->token != TK_EOS) {
|
| + token = [lexer scanNextToken];
|
| + STAssertEquals(expectedResults->token, token, @"");
|
| + if (expectedResults->value != nil)
|
| + STAssertEqualObjects(expectedResults->value, [lexer lexText], @"");
|
| + if (expectedResults->nextState != -1)
|
| + [lexer setState:expectedResults->nextState];
|
| + expectedResults++;
|
| + }
|
| +
|
| + token = [lexer scanNextToken];
|
| + STAssertEquals(TK_EOS, token, @"");
|
| +
|
| + [self _cleanupLexer];
|
| +}
|
| +
|
| +- (void)testSimpleTokens;
|
| +{
|
| + NSString *str = @"i^@";
|
| + struct tokenValuePair tokens[] = {
|
| + { 'i', nil, -1 },
|
| + { '^', nil, -1 },
|
| + { '@', nil, -1 },
|
| + { TK_EOS, nil, -1 },
|
| + };
|
| +
|
| + [self testLexingString:str expectedResults:tokens];
|
| +}
|
| +
|
| +- (void)testQuotedStringToken;
|
| +{
|
| + NSString *str = @"@\"NSObject\"";
|
| + struct tokenValuePair tokens[] = {
|
| + { '@', nil, -1 },
|
| + { TK_QUOTED_STRING, @"NSObject", -1 },
|
| + { TK_EOS, nil, -1 },
|
| + };
|
| +
|
| + [self testLexingString:str expectedResults:tokens];
|
| +}
|
| +
|
| +- (void)testEmptyQuotedStringToken;
|
| +{
|
| + NSString *str = @"@\"\"";
|
| + struct tokenValuePair tokens[] = {
|
| + { '@', nil, -1 },
|
| + { TK_QUOTED_STRING, @"", -1 },
|
| + { TK_EOS, nil, -1 },
|
| + };
|
| +
|
| + [self testLexingString:str expectedResults:tokens];
|
| +}
|
| +
|
| +- (void)testUnterminatedQuotedString;
|
| +{
|
| + NSString *str = @"@\"NSObject";
|
| + struct tokenValuePair tokens[] = {
|
| + { '@', nil, -1 },
|
| + { TK_QUOTED_STRING, @"NSObject", -1 },
|
| + { TK_EOS, nil, -1 },
|
| + };
|
| +
|
| + [self testLexingString:str expectedResults:tokens];
|
| +}
|
| +
|
| +// The lexer should automatically switch back to normal mode after scanning one identifier.
|
| +- (void)testIdentifierToken;
|
| +{
|
| + NSString *str = @"iii)ii";
|
| + struct tokenValuePair tokens[] = {
|
| + { 'i', nil, CDTypeLexerStateIdentifier },
|
| + { TK_IDENTIFIER, @"ii", -1 },
|
| + { ')', nil, -1 },
|
| + { 'i', nil, -1 },
|
| + { 'i', nil, -1 },
|
| + { TK_EOS, nil, -1 },
|
| + };
|
| +
|
| + [self testLexingString:str expectedResults:tokens];
|
| +}
|
| +
|
| +
|
| +// This tests a more complicated C++ template type, and makes sure the space between the '>'s is ignored.
|
| +- (void)testTemplateTokens;
|
| +{
|
| + NSString *str = @"{vector<IPPhotoInfo*,std::allocator<IPPhotoInfo*> >=iic}";
|
| + struct tokenValuePair tokens[] = {
|
| + { '{', nil, CDTypeLexerStateIdentifier },
|
| + { TK_IDENTIFIER, @"vector", -1 },
|
| + { '<', nil, CDTypeLexerStateTemplateTypes },
|
| + { TK_TEMPLATE_TYPE, @"IPPhotoInfo*", -1 },
|
| + { ',', nil, -1 },
|
| + { TK_TEMPLATE_TYPE, @"std::allocator", -1 },
|
| + { '<', nil, CDTypeLexerStateTemplateTypes },
|
| + { TK_TEMPLATE_TYPE, @"IPPhotoInfo*", -1 },
|
| + { '>', nil, -1 },
|
| + { '>', nil, CDTypeLexerStateNormal },
|
| + { '=', nil, -1 },
|
| + { 'i', nil, -1 },
|
| + { 'i', nil, -1 },
|
| + { 'c', nil, -1 },
|
| + { '}', nil, -1 },
|
| + { TK_EOS, nil, -1 },
|
| + };
|
| +
|
| + [self testLexingString:str expectedResults:tokens];
|
| +}
|
| +
|
| +@end
|
|
|
| Property changes on: class-dump/src/UnitTests/CDTypeLexerUnitTest.m
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|