diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..b5b21a2d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 diff --git a/Classes/SBJson4Parser.m b/Classes/SBJson4Parser.m index 32fb81d7..8adba175 100644 --- a/Classes/SBJson4Parser.m +++ b/Classes/SBJson4Parser.m @@ -147,7 +147,7 @@ - (void)pop { } - (void)parserFound:(id)obj isValue:(BOOL)isValue { - NSParameterAssert(obj); + NSParameterAssert(obj); if(processBlock&&path) { if(isValue) { @@ -158,27 +158,27 @@ - (void)parserFound:(id)obj isValue:(BOOL)isValue { } } - switch (currentType) { - case SBJson4ChunkArray: - [array addObject:obj]; - break; - - case SBJson4ChunkObject: - NSParameterAssert(keyStack.count); - [dict setObject:obj forKey:[keyStack lastObject]]; - [keyStack removeLastObject]; - break; - - case SBJson4ChunkNone: { - __block BOOL stop = NO; - valueBlock(obj, &stop); - if (stop) [_parser stop]; - } - break; + switch (currentType) { + case SBJson4ChunkArray: + [array addObject:obj]; + break; + + case SBJson4ChunkObject: + NSParameterAssert(keyStack.count); + [dict setObject:obj forKey:[keyStack lastObject]]; + [keyStack removeLastObject]; + break; + + case SBJson4ChunkNone: { + __block BOOL stop = NO; + valueBlock(obj, &stop); + if (stop) [_parser stop]; + } + break; - default: - break; - } + default: + break; + } } diff --git a/Classes/SBJson4StreamParser.m b/Classes/SBJson4StreamParser.m index 9571914a..63c05154 100644 --- a/Classes/SBJson4StreamParser.m +++ b/Classes/SBJson4StreamParser.m @@ -42,21 +42,21 @@ @implementation SBJson4StreamParser { @private - SBJson4StreamTokeniser *tokeniser; - BOOL stopped; - NSMutableArray *_stateStack; + SBJson4StreamTokeniser *tokeniser; + BOOL stopped; + NSMutableArray *_stateStack; } #pragma mark Housekeeping - (id)init { - self = [super init]; - if (self) { + self = [super init]; + if (self) { _stateStack = [[NSMutableArray alloc] initWithCapacity:32]; _state = [SBJson4StreamParserStateStart sharedInstance]; - tokeniser = [[SBJson4StreamTokeniser alloc] init]; - } - return self; + tokeniser = [[SBJson4StreamTokeniser alloc] init]; + } + return self; } @@ -64,41 +64,41 @@ - (id)init { - (NSString*)tokenName:(sbjson4_token_t)token { switch (token) { - case sbjson4_token_array_open: - return @"start of array"; + case sbjson4_token_array_open: + return @"start of array"; - case sbjson4_token_array_close: - return @"end of array"; + case sbjson4_token_array_close: + return @"end of array"; - case sbjson4_token_integer: - case sbjson4_token_real: - return @"number"; + case sbjson4_token_integer: + case sbjson4_token_real: + return @"number"; - case sbjson4_token_string: - case sbjson4_token_encoded: - return @"string"; + case sbjson4_token_string: + case sbjson4_token_encoded: + return @"string"; - case sbjson4_token_bool: - return @"boolean"; + case sbjson4_token_bool: + return @"boolean"; - case sbjson4_token_null: - return @"null"; + case sbjson4_token_null: + return @"null"; - case sbjson4_token_entry_sep: - return @"key-value separator"; + case sbjson4_token_entry_sep: + return @"key-value separator"; - case sbjson4_token_value_sep: - return @"value separator"; + case sbjson4_token_value_sep: + return @"value separator"; - case sbjson4_token_object_open: - return @"start of object"; + case sbjson4_token_object_open: + return @"start of object"; - case sbjson4_token_object_close: - return @"end of object"; + case sbjson4_token_object_close: + return @"end of object"; - case sbjson4_token_eof: - case sbjson4_token_error: - break; + case sbjson4_token_eof: + case sbjson4_token_error: + break; } NSAssert(NO, @"Should not get here"); return @""; @@ -156,99 +156,99 @@ - (SBJson4ParserStatus)parse:(NSData *)data_ { sbjson4_token_t tok = [tokeniser getToken:&token length:&token_len]; switch (tok) { - case sbjson4_token_eof: - return [_state parserShouldReturn:self]; + case sbjson4_token_eof: + return [_state parserShouldReturn:self]; - case sbjson4_token_error: - _state = [SBJson4StreamParserStateError sharedInstance]; - [_delegate parserFoundError:[NSError errorWithDomain:@"org.sbjson.parser" code:3 - userInfo:@{NSLocalizedDescriptionKey : tokeniser.error}]]; - return SBJson4ParserError; + case sbjson4_token_error: + _state = [SBJson4StreamParserStateError sharedInstance]; + [_delegate parserFoundError:[NSError errorWithDomain:@"org.sbjson.parser" code:3 + userInfo:@{NSLocalizedDescriptionKey : tokeniser.error}]]; + return SBJson4ParserError; - default: + default: - if (![_state parser:self shouldAcceptToken:tok]) { - [self handleTokenNotExpectedHere: tok]; - return SBJson4ParserError; - } + if (![_state parser:self shouldAcceptToken:tok]) { + [self handleTokenNotExpectedHere: tok]; + return SBJson4ParserError; + } - switch (tok) { - case sbjson4_token_object_open: - [self handleObjectStart]; - break; + switch (tok) { + case sbjson4_token_object_open: + [self handleObjectStart]; + break; - case sbjson4_token_object_close: - [self handleObjectEnd: tok]; - break; + case sbjson4_token_object_close: + [self handleObjectEnd: tok]; + break; - case sbjson4_token_array_open: - [self handleArrayStart]; - break; + case sbjson4_token_array_open: + [self handleArrayStart]; + break; - case sbjson4_token_array_close: - [self handleArrayEnd: tok]; - break; + case sbjson4_token_array_close: + [self handleArrayEnd: tok]; + break; - case sbjson4_token_value_sep: - case sbjson4_token_entry_sep: - [_state parser:self shouldTransitionTo:tok]; - break; + case sbjson4_token_value_sep: + case sbjson4_token_entry_sep: + [_state parser:self shouldTransitionTo:tok]; + break; - case sbjson4_token_bool: - [_delegate parserFoundBoolean:token[0] == 't']; - [_state parser:self shouldTransitionTo:tok]; - break; + case sbjson4_token_bool: + [_delegate parserFoundBoolean:token[0] == 't']; + [_state parser:self shouldTransitionTo:tok]; + break; - case sbjson4_token_null: - [_delegate parserFoundNull]; - [_state parser:self shouldTransitionTo:tok]; - break; - - case sbjson4_token_integer: { - const int UNSIGNED_LONG_LONG_MAX_DIGITS = 20; - if (token_len <= UNSIGNED_LONG_LONG_MAX_DIGITS) { - if (*token == '-') - [_delegate parserFoundNumber:@(strtoll(token, NULL, 10))]; - else - [_delegate parserFoundNumber:@(strtoull(token, NULL, 10))]; + case sbjson4_token_null: + [_delegate parserFoundNull]; + [_state parser:self shouldTransitionTo:tok]; + break; + + case sbjson4_token_integer: { + const int UNSIGNED_LONG_LONG_MAX_DIGITS = 20; + if (token_len <= UNSIGNED_LONG_LONG_MAX_DIGITS) { + if (*token == '-') + [_delegate parserFoundNumber:@(strtoll(token, NULL, 10))]; + else + [_delegate parserFoundNumber:@(strtoull(token, NULL, 10))]; - [_state parser:self shouldTransitionTo:tok]; - break; - } - } - // FALL THROUGH - - case sbjson4_token_real: { - [_delegate parserFoundNumber:@(strtod(token, NULL))]; - [_state parser:self shouldTransitionTo:tok]; - break; - } - - case sbjson4_token_string: { - NSString *string = [[NSString alloc] initWithBytes:token length:token_len encoding:NSUTF8StringEncoding]; - if ([_state needKey]) - [_delegate parserFoundObjectKey:string]; - else - [_delegate parserFoundString:string]; - [_state parser:self shouldTransitionTo:tok]; - break; - } - - case sbjson4_token_encoded: { - NSString *string = [self decodeStringToken:token length:token_len]; - if ([_state needKey]) - [_delegate parserFoundObjectKey:string]; - else - [_delegate parserFoundString:string]; - [_state parser:self shouldTransitionTo:tok]; - break; - } - - default: - break; + [_state parser:self shouldTransitionTo:tok]; + break; } + } + // FALL THROUGH + + case sbjson4_token_real: { + [_delegate parserFoundNumber:@(strtod(token, NULL))]; + [_state parser:self shouldTransitionTo:tok]; break; + } + + case sbjson4_token_string: { + NSString *string = [[NSString alloc] initWithBytes:token length:token_len encoding:NSUTF8StringEncoding]; + if ([_state needKey]) + [_delegate parserFoundObjectKey:string]; + else + [_delegate parserFoundString:string]; + [_state parser:self shouldTransitionTo:tok]; + break; + } + + case sbjson4_token_encoded: { + NSString *string = [self decodeStringToken:token length:token_len]; + if ([_state needKey]) + [_delegate parserFoundObjectKey:string]; + else + [_delegate parserFoundString:string]; + [_state parser:self shouldTransitionTo:tok]; + break; + } + + default: + break; + } + break; } } return SBJson4ParserComplete; @@ -261,10 +261,10 @@ - (unichar)decodeHexQuad:(char *)quad { int c = quad[i]; ch *= 16; switch (c) { - case '0' ... '9': ch += c - '0'; break; - case 'a' ... 'f': ch += 10 + c - 'a'; break; - case 'A' ... 'F': ch += 10 + c - 'A'; break; - default: @throw @"FUT FUT FUT"; + case '0' ... '9': ch += c - '0'; break; + case 'a' ... 'f': ch += 10 + c - 'a'; break; + case 'A' ... 'F': ch += 10 + c - 'A'; break; + default: @throw @"FUT FUT FUT"; } } return ch; @@ -274,37 +274,37 @@ - (NSString*)decodeStringToken:(char*)bytes length:(NSUInteger)len { NSMutableData *buf = [NSMutableData dataWithCapacity:len]; for (NSUInteger i = 0; i < len;) { switch ((unsigned char)bytes[i]) { - case '\\': { - switch ((unsigned char)bytes[++i]) { - case '"': [buf appendBytes:"\"" length:1]; i++; break; - case '/': [buf appendBytes:"/" length:1]; i++; break; - case '\\': [buf appendBytes:"\\" length:1]; i++; break; - case 'b': [buf appendBytes:"\b" length:1]; i++; break; - case 'f': [buf appendBytes:"\f" length:1]; i++; break; - case 'n': [buf appendBytes:"\n" length:1]; i++; break; - case 'r': [buf appendBytes:"\r" length:1]; i++; break; - case 't': [buf appendBytes:"\t" length:1]; i++; break; - case 'u': { - unichar hi = [self decodeHexQuad:bytes + i + 1]; - i += 5; - if (SBStringIsSurrogateHighCharacter(hi)) { - // Skip past \u that we know is there.. - unichar lo = [self decodeHexQuad:bytes + i + 2]; - i += 6; - [buf appendData:[[NSString stringWithFormat:@"%C%C", hi, lo] dataUsingEncoding:NSUTF8StringEncoding]]; - } else { - [buf appendData:[[NSString stringWithFormat:@"%C", hi] dataUsingEncoding:NSUTF8StringEncoding]]; - } - break; - } - default: @throw @"FUT FUT FUT"; + case '\\': { + switch ((unsigned char)bytes[++i]) { + case '"': [buf appendBytes:"\"" length:1]; i++; break; + case '/': [buf appendBytes:"/" length:1]; i++; break; + case '\\': [buf appendBytes:"\\" length:1]; i++; break; + case 'b': [buf appendBytes:"\b" length:1]; i++; break; + case 'f': [buf appendBytes:"\f" length:1]; i++; break; + case 'n': [buf appendBytes:"\n" length:1]; i++; break; + case 'r': [buf appendBytes:"\r" length:1]; i++; break; + case 't': [buf appendBytes:"\t" length:1]; i++; break; + case 'u': { + unichar hi = [self decodeHexQuad:bytes + i + 1]; + i += 5; + if (SBStringIsSurrogateHighCharacter(hi)) { + // Skip past \u that we know is there.. + unichar lo = [self decodeHexQuad:bytes + i + 2]; + i += 6; + [buf appendData:[[NSString stringWithFormat:@"%C%C", hi, lo] dataUsingEncoding:NSUTF8StringEncoding]]; + } else { + [buf appendData:[[NSString stringWithFormat:@"%C", hi] dataUsingEncoding:NSUTF8StringEncoding]]; } break; } - default: - [buf appendBytes:bytes + i length:1]; - i++; - break; + default: @throw @"FUT FUT FUT"; + } + break; + } + default: + [buf appendBytes:bytes + i length:1]; + i++; + break; } } return [[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding]; diff --git a/Classes/SBJson4StreamParserState.m b/Classes/SBJson4StreamParserState.m index 9435bf1f..85281f07 100644 --- a/Classes/SBJson4StreamParserState.m +++ b/Classes/SBJson4StreamParserState.m @@ -36,37 +36,37 @@ #import "SBJson4StreamParserState.h" -#define SINGLETON \ -+ (id)sharedInstance { \ - static id state = nil; \ - if (!state) { \ - @synchronized(self) { \ - if (!state) state = [[self alloc] init]; \ - } \ - } \ - return state; \ -} +#define SINGLETON \ + + (id)sharedInstance { \ + static id state = nil; \ + if (!state) { \ + @synchronized(self) { \ + if (!state) state = [[self alloc] init]; \ + } \ + } \ + return state; \ + } @implementation SBJson4StreamParserState + (id)sharedInstance { return nil; } - (BOOL)parser:(SBJson4StreamParser *)parser shouldAcceptToken:(sbjson4_token_t)token { - return NO; + return NO; } - (SBJson4ParserStatus)parserShouldReturn:(SBJson4StreamParser *)parser { - return SBJson4ParserWaitingForData; + return SBJson4ParserWaitingForData; } - (void)parser:(SBJson4StreamParser *)parser shouldTransitionTo:(sbjson4_token_t)tok {} - (BOOL)needKey { - return NO; + return NO; } - (NSString*)name { - return @""; + return @""; } - (BOOL)isError { @@ -82,36 +82,36 @@ @implementation SBJson4StreamParserStateStart SINGLETON - (BOOL)parser:(SBJson4StreamParser *)parser shouldAcceptToken:(sbjson4_token_t)token { - return token == sbjson4_token_array_open || token == sbjson4_token_object_open; + return token == sbjson4_token_array_open || token == sbjson4_token_object_open; } - (void)parser:(SBJson4StreamParser *)parser shouldTransitionTo:(sbjson4_token_t)tok { - SBJson4StreamParserState *state = nil; - switch (tok) { - case sbjson4_token_array_open: - state = [SBJson4StreamParserStateArrayStart sharedInstance]; - break; - - case sbjson4_token_object_open: - state = [SBJson4StreamParserStateObjectStart sharedInstance]; - break; - - case sbjson4_token_array_close: - case sbjson4_token_object_close: - if ([parser.delegate respondsToSelector:@selector(parserShouldSupportManyDocuments)] && [parser.delegate parserShouldSupportManyDocuments]) - state = parser.state; - else - state = [SBJson4StreamParserStateComplete sharedInstance]; - break; - - case sbjson4_token_eof: - return; - - default: - state = [SBJson4StreamParserStateError sharedInstance]; - break; - } + SBJson4StreamParserState *state = nil; + switch (tok) { + case sbjson4_token_array_open: + state = [SBJson4StreamParserStateArrayStart sharedInstance]; + break; + + case sbjson4_token_object_open: + state = [SBJson4StreamParserStateObjectStart sharedInstance]; + break; + + case sbjson4_token_array_close: + case sbjson4_token_object_close: + if ([parser.delegate respondsToSelector:@selector(parserShouldSupportManyDocuments)] && [parser.delegate parserShouldSupportManyDocuments]) + state = parser.state; + else + state = [SBJson4StreamParserStateComplete sharedInstance]; + break; + + case sbjson4_token_eof: + return; + + default: + state = [SBJson4StreamParserStateError sharedInstance]; + break; + } parser.state = state; diff --git a/Classes/SBJson4StreamWriterState.m b/Classes/SBJson4StreamWriterState.m index ed7890ac..12d59b9d 100644 --- a/Classes/SBJson4StreamWriterState.m +++ b/Classes/SBJson4StreamWriterState.m @@ -37,16 +37,16 @@ #import "SBJson4StreamWriterState.h" #import "SBJson4StreamWriter.h" -#define SINGLETON \ -+ (id)sharedInstance { \ - static id state = nil; \ - if (!state) { \ - @synchronized(self) { \ - if (!state) state = [[self alloc] init]; \ - } \ - } \ - return state; \ -} +#define SINGLETON \ + + (id)sharedInstance { \ + static id state = nil; \ + if (!state) { \ + @synchronized(self) { \ + if (!state) state = [[self alloc] init]; \ + } \ + } \ + return state; \ + } @implementation SBJson4StreamWriterState @@ -56,9 +56,9 @@ - (void)appendSeparator:(SBJson4StreamWriter *)writer {} - (BOOL)expectingKey:(SBJson4StreamWriter *)writer { return NO; } - (void)transitionState:(SBJson4StreamWriter *)writer {} - (void)appendWhitespace:(SBJson4StreamWriter *)writer { - [writer appendBytes:"\n" length:1]; - for (NSUInteger i = 0; i < writer.stateStack.count; i++) - [writer appendBytes:" " length:2]; + [writer appendBytes:"\n" length:1]; + for (NSUInteger i = 0; i < writer.stateStack.count; i++) + [writer appendBytes:" " length:2]; } @end @@ -67,11 +67,11 @@ @implementation SBJson4StreamWriterStateObjectStart SINGLETON - (void)transitionState:(SBJson4StreamWriter *)writer { - writer.state = [SBJson4StreamWriterStateObjectValue sharedInstance]; + writer.state = [SBJson4StreamWriterStateObjectValue sharedInstance]; } - (BOOL)expectingKey:(SBJson4StreamWriter *)writer { - writer.error = @"JSON object key must be string"; - return YES; + writer.error = @"JSON object key must be string"; + return YES; } @end @@ -80,7 +80,7 @@ @implementation SBJson4StreamWriterStateObjectKey SINGLETON - (void)appendSeparator:(SBJson4StreamWriter *)writer { - [writer appendBytes:"," length:1]; + [writer appendBytes:"," length:1]; } @end @@ -89,13 +89,13 @@ @implementation SBJson4StreamWriterStateObjectValue SINGLETON - (void)appendSeparator:(SBJson4StreamWriter *)writer { - [writer appendBytes:":" length:1]; + [writer appendBytes:":" length:1]; } - (void)transitionState:(SBJson4StreamWriter *)writer { writer.state = [SBJson4StreamWriterStateObjectKey sharedInstance]; } - (void)appendWhitespace:(SBJson4StreamWriter *)writer { - [writer appendBytes:" " length:1]; + [writer appendBytes:" " length:1]; } @end @@ -113,7 +113,7 @@ @implementation SBJson4StreamWriterStateArrayValue SINGLETON - (void)appendSeparator:(SBJson4StreamWriter *)writer { - [writer appendBytes:"," length:1]; + [writer appendBytes:"," length:1]; } @end diff --git a/Tests/JsonCheckerSuite.m b/Tests/JsonCheckerSuite.m index 650db9a5..568f454a 100644 --- a/Tests/JsonCheckerSuite.m +++ b/Tests/JsonCheckerSuite.m @@ -67,23 +67,23 @@ - (void)testPass { }; [self foreachFilePrefixedBy:@"pass" apply:^(NSString* path) { - __block BOOL success = NO; - SBJson4ValueBlock block = ^(id obj, BOOL *stop) { - XCTAssertNotNil(obj, @"%@", path); - success = YES; - }; - - SBJson4Parser *parser = [[SBJson4Parser alloc] initWithBlock:block - processBlock:nil - multiRoot:NO - unwrapRootArray:NO - maxDepth:19 - errorHandler:eh]; - SBJson4ParserStatus status = [parser parse:[NSData dataWithContentsOfFile:path]]; - - XCTAssertTrue(success && status == SBJson4ParserComplete, @"Success block was called & parsing complete"); - - }]; + __block BOOL success = NO; + SBJson4ValueBlock block = ^(id obj, BOOL *stop) { + XCTAssertNotNil(obj, @"%@", path); + success = YES; + }; + + SBJson4Parser *parser = [[SBJson4Parser alloc] initWithBlock:block + processBlock:nil + multiRoot:NO + unwrapRootArray:NO + maxDepth:19 + errorHandler:eh]; + SBJson4ParserStatus status = [parser parse:[NSData dataWithContentsOfFile:path]]; + + XCTAssertTrue(success && status == SBJson4ParserComplete, @"Success block was called & parsing complete"); + + }]; XCTAssertEqual(count, (NSUInteger)3); } @@ -91,24 +91,24 @@ - (void)testFail { SBJson4ValueBlock block = ^(id obj, BOOL *stop) {}; [self foreachFilePrefixedBy:@"fail" apply:^(NSString* path) { - __block BOOL success = NO; - SBJson4ErrorBlock eh = ^(NSError *err) { - XCTAssertNotNil(err, @"%@", path); - success = YES; - }; + __block BOOL success = NO; + SBJson4ErrorBlock eh = ^(NSError *err) { + XCTAssertNotNil(err, @"%@", path); + success = YES; + }; - SBJson4Parser *parser = [[SBJson4Parser alloc] initWithBlock:block - processBlock:nil - multiRoot:NO - unwrapRootArray:NO - maxDepth:19 - errorHandler:eh]; + SBJson4Parser *parser = [[SBJson4Parser alloc] initWithBlock:block + processBlock:nil + multiRoot:NO + unwrapRootArray:NO + maxDepth:19 + errorHandler:eh]; - SBJson4ParserStatus status = [parser parse:[NSData dataWithContentsOfFile:path]]; + SBJson4ParserStatus status = [parser parse:[NSData dataWithContentsOfFile:path]]; - if (status != SBJson4ParserWaitingForData) - XCTAssertTrue(success, @"ErrorHandler block was called: %@", [path lastPathComponent]); - }]; + if (status != SBJson4ParserWaitingForData) + XCTAssertTrue(success, @"ErrorHandler block was called: %@", [path lastPathComponent]); + }]; XCTAssertEqual(count, (NSUInteger)33); } diff --git a/Tests/MainSuite.m b/Tests/MainSuite.m index 119cb8dc..77f1ddd5 100644 --- a/Tests/MainSuite.m +++ b/Tests/MainSuite.m @@ -37,10 +37,13 @@ - (void)setUp { - (NSString*)suitePath:(NSString*)suite { NSBundle *bundle = [NSBundle bundleForClass:[self class]]; return [[[bundle resourcePath] stringByAppendingPathComponent:@"TestData"] - stringByAppendingPathComponent:suite]; + stringByAppendingPathComponent:suite]; } -- (void)inExtForeachInSuite:(NSString *)suite inext:(NSString *)inext outExt:(NSString *)outext block:(void (^)(NSString *, NSString *))block { +- (void)inExtForeachInSuite:(NSString *)suite + inext:(NSString *)inext + outExt:(NSString *)outext + block:(void (^)(NSString *, NSString *))block { NSString *root = [self suitePath:suite]; for (NSString *fileName in [[NSFileManager defaultManager] enumeratorAtPath:root]) { if (![inext isEqualToString:[fileName pathExtension]]) @@ -57,67 +60,75 @@ - (void)inExtForeachInSuite:(NSString *)suite inext:(NSString *)inext outExt:(NS } - (void)testRoundtrip { - [self inExtForeachInSuite:@"main" inext:@"in" outExt:@"out" block:^(NSString *inpath, NSString *outpath) { - id parser = [SBJson4Parser parserWithBlock:^(id value, BOOL *string) { - XCTAssertNotNil(value); - NSString *output = [writer stringWithObject:value]; - XCTAssertNotNil(output, @"%@", writer.error); - XCTAssertEqualObjects(output, chomp(slurp(outpath)), @"%@", [[inpath pathComponents] lastObject]); - } - allowMultiRoot:NO - unwrapRootArray:NO - errorHandler:^(NSError *error) { - XCTFail(@"%@", error); - }]; - [parser parse:slurpd(inpath)]; - }]; + [self inExtForeachInSuite:@"main" + inext:@"in" + outExt:@"out" + block:^(NSString *inpath, NSString *outpath) { + id parser = [SBJson4Parser parserWithBlock:^(id value, BOOL *string) { + XCTAssertNotNil(value); + NSString *output = [writer stringWithObject:value]; + XCTAssertNotNil(output, @"%@", writer.error); + XCTAssertEqualObjects(output, chomp(slurp(outpath)), @"%@", [[inpath pathComponents] lastObject]); + } + allowMultiRoot:NO + unwrapRootArray:NO + errorHandler:^(NSError *error) { + XCTFail(@"%@", error); + }]; + [parser parse:slurpd(inpath)]; + }]; XCTAssertEqual(count, (NSUInteger)38); } /* -- (void)IGNOREDtestReallyBrokenUTF8 { - [self inExtForeachInSuite:@"kuhn" inext:@"in" outExt:@"out" block:^(NSString *inpath, NSString *outpath) { - id value = [parser objectWithData:slurpd(inpath)]; - STAssertNotNil(value, parser.error); + - (void)IGNOREDtestReallyBrokenUTF8 { + [self inExtForeachInSuite:@"kuhn" inext:@"in" outExt:@"out" block:^(NSString *inpath, NSString *outpath) { + id value = [parser objectWithData:slurpd(inpath)]; + STAssertNotNil(value, parser.error); - NSString *output = [writer stringWithObject:value]; - STAssertNotNil(output, writer.error); - STAssertEqualObjects(output, chomp(slurp(outpath)), nil); - }]; + NSString *output = [writer stringWithObject:value]; + STAssertNotNil(output, writer.error); + STAssertEqualObjects(output, chomp(slurp(outpath)), nil); + }]; - STAssertEquals(count, (NSUInteger)1, nil); -}*/ + STAssertEquals(count, (NSUInteger)1, nil); + }*/ - (void)testParseError { - [self inExtForeachInSuite:@"main" inext:@"in" outExt:@"err" block:^(NSString *inpath, NSString *outpath) { - id parser = [[SBJson4Parser alloc] - initWithBlock:^(id o, BOOL *string) { + [self inExtForeachInSuite:@"main" + inext:@"in" + outExt:@"err" + block:^(NSString *inpath, NSString *outpath) { + id parser = [[SBJson4Parser alloc] initWithBlock:^(id o, BOOL *string) { XCTFail(@"%@", o); - } processBlock:nil - multiRoot:NO - unwrapRootArray:NO - maxDepth:3 - errorHandler:^(NSError *error) { - XCTAssertNotNil(error, @"%@", inpath); - XCTAssertEqualObjects([error localizedDescription], chomp(slurp(outpath)), @"%@", [[inpath pathComponents] - lastObject]); - }]; - [parser parse:slurpd(inpath)]; - - }]; + } + processBlock:nil + multiRoot:NO + unwrapRootArray:NO + maxDepth:3 + errorHandler:^(NSError *error) { + XCTAssertNotNil(error, @"%@", inpath); + XCTAssertEqualObjects([error localizedDescription], chomp(slurp(outpath)), @"%@", [[inpath pathComponents] + lastObject]); + }]; + [parser parse:slurpd(inpath)]; + + }]; XCTAssertEqual(count, (NSUInteger)35); - } - (void)testWriteSuccess { - [self inExtForeachInSuite:@"main" inext:@"plist" outExt:@"out" block:^(NSString *inpath, NSString *outpath) { - id value = [NSArray arrayWithContentsOfFile:inpath]; - NSString *output = [writer stringWithObject:value]; - XCTAssertNotNil(output, @"%@", writer.error); - XCTAssertEqualObjects(output, chomp(slurp(outpath))); - }]; + [self inExtForeachInSuite:@"main" + inext:@"plist" + outExt:@"out" + block:^(NSString *inpath, NSString *outpath) { + id value = [NSArray arrayWithContentsOfFile:inpath]; + NSString *output = [writer stringWithObject:value]; + XCTAssertNotNil(output, @"%@", writer.error); + XCTAssertEqualObjects(output, chomp(slurp(outpath))); + }]; XCTAssertEqual(count, (NSUInteger)2); @@ -126,11 +137,14 @@ - (void)testWriteSuccess { - (void)testWriteError { writer.maxDepth = 4u; - [self inExtForeachInSuite:@"main" inext:@"plist" outExt:@"err" block:^(NSString *inpath, NSString *outpath) { - id value = [NSArray arrayWithContentsOfFile:inpath]; - XCTAssertNil([writer stringWithObject:value]); - XCTAssertEqualObjects(writer.error, chomp(slurp(outpath))); - }]; + [self inExtForeachInSuite:@"main" + inext:@"plist" + outExt:@"err" + block:^(NSString *inpath, NSString *outpath) { + id value = [NSArray arrayWithContentsOfFile:inpath]; + XCTAssertNil([writer stringWithObject:value]); + XCTAssertEqualObjects(writer.error, chomp(slurp(outpath))); + }]; XCTAssertEqual(count, (NSUInteger)5); } @@ -140,19 +154,22 @@ - (void)testFormat { writer.humanReadable = YES; writer.sortKeys = YES; - [self inExtForeachInSuite:@"format" inext:@"in" outExt:@"out" block:^(NSString *inpath, NSString *outpath) { - id parser = [SBJson4Parser parserWithBlock:^(id value, BOOL *string) { - NSString *output = [writer stringWithObject:value]; - XCTAssertNotNil(output, @"%@", writer.error); - XCTAssertEqualObjects(output, chomp(slurp(outpath))); - } - allowMultiRoot:NO - unwrapRootArray:NO - errorHandler:^(NSError *error) { - XCTFail(@"%@", error); - }]; - [parser parse:slurpd(inpath)]; - }]; + [self inExtForeachInSuite:@"format" + inext:@"in" + outExt:@"out" + block:^(NSString *inpath, NSString *outpath) { + id parser = [SBJson4Parser parserWithBlock:^(id value, BOOL *string) { + NSString *output = [writer stringWithObject:value]; + XCTAssertNotNil(output, @"%@", writer.error); + XCTAssertEqualObjects(output, chomp(slurp(outpath))); + } + allowMultiRoot:NO + unwrapRootArray:NO + errorHandler:^(NSError *error) { + XCTFail(@"%@", error); + }]; + [parser parse:slurpd(inpath)]; + }]; XCTAssertEqual(count, (NSUInteger)8); } @@ -160,23 +177,26 @@ - (void)testFormat { - (void)testComparatorSort { writer.humanReadable = YES; writer.sortKeys = YES; - writer.sortKeysComparator = ^(id obj1, id obj2) { - return [obj1 compare:obj2 options:NSCaseInsensitiveSearch|NSLiteralSearch]; - }; - - [self inExtForeachInSuite:@"comparatorsort" inext:@"in" outExt:@"out" block:^(NSString *inpath, NSString *outpath) { - id parser = [SBJson4Parser parserWithBlock:^(id value, BOOL *string) { - NSString *output = [writer stringWithObject:value]; - XCTAssertNotNil(output, @"%@", writer.error); - XCTAssertEqualObjects(output, chomp(slurp(outpath))); - } - allowMultiRoot:NO - unwrapRootArray:NO - errorHandler:^(NSError *error) { - XCTFail(@"%@", error); - }]; - [parser parse:slurpd(inpath)]; - }]; + writer.sortKeysComparator = ^(id obj1, id obj2) { + return [obj1 compare:obj2 options:NSCaseInsensitiveSearch|NSLiteralSearch]; + }; + + [self inExtForeachInSuite:@"comparatorsort" + inext:@"in" + outExt:@"out" + block:^(NSString *inpath, NSString *outpath) { + id parser = [SBJson4Parser parserWithBlock:^(id value, BOOL *string) { + NSString *output = [writer stringWithObject:value]; + XCTAssertNotNil(output, @"%@", writer.error); + XCTAssertEqualObjects(output, chomp(slurp(outpath))); + } + allowMultiRoot:NO + unwrapRootArray:NO + errorHandler:^(NSError *error) { + XCTFail(@"%@", error); + }]; + [parser parse:slurpd(inpath)]; + }]; XCTAssertEqual(count, (NSUInteger)3); } diff --git a/Tests/StreamSuite.m b/Tests/StreamSuite.m index 53e0d1f2..4a88b564 100644 --- a/Tests/StreamSuite.m +++ b/Tests/StreamSuite.m @@ -56,39 +56,39 @@ - (void)setUp { eh = ^(NSError *e) { error = e; }; - arrayCount = objectCount = 0u; + arrayCount = objectCount = 0u; } - (void) testParsingWithShortWorkBuffer{ - char* validjson = "[{\"description\": \"Lorem ipsum dolor sit amet, "\ - "consectetur adipiscing elit. Donec ultrices ornare gravida. Vestibulum"\ - " ante ipsum primisin faucibus orci luctus et ultrices posuere\"}]"; + char* validjson = "[{\"description\": \"Lorem ipsum dolor sit amet, "\ + "consectetur adipiscing elit. Donec ultrices ornare gravida. Vestibulum"\ + " ante ipsum primisin faucibus orci luctus et ultrices posuere\"}]"; - id parser = [SBJson4Parser parserWithBlock:block - allowMultiRoot:NO - unwrapRootArray:NO - errorHandler:eh]; + id parser = [SBJson4Parser parserWithBlock:block + allowMultiRoot:NO + unwrapRootArray:NO + errorHandler:eh]; - SBJson4ParserStatus status = SBJson4ParserWaitingForData; - NSData* data = nil; + SBJson4ParserStatus status = SBJson4ParserWaitingForData; + NSData* data = nil; - for (int i=0, e=(int)strlen(validjson); i