@@ -13,61 +13,102 @@ * file. */ #include "config.h" -#import "TestsAppDelegate.h" - -static OFString *const module = @"OFJSON"; - -@implementation TestsAppDelegate (JSONTests) -- (void)JSONTests -{ - void *pool = objc_autoreleasePoolPush(); - OFString *string = @"{\"foo\"\t:'b\\na\\r', \"x\":/*foo*/ [.5\r,0xF," - @"null//bar\n,\"foo\",false]}"; - OFDictionary *dict = [OFDictionary dictionaryWithKeysAndObjects: +#import "ObjFW.h" +#import "ObjFWTest.h" + +@interface OFJSONTests: OTTestCase +{ + unsigned long long _hashSeed; + OFDictionary *_dictionary; +} +@end + +extern unsigned long long OFHashSeed; + +static OFString *string = @"{\"foo\"\t:'b\\na\\r', \"x\":/*foo*/ [.5\r,0xF," + @"null//bar\n,\"foo\",false]}"; + +@implementation OFJSONTests +- (void)setUp +{ + _hashSeed = OFHashSeed; + OFHashSeed = 0; + + _dictionary = [[OFDictionary alloc] initWithKeysAndObjects: @"foo", @"b\na\r", @"x", [OFArray arrayWithObjects: [OFNumber numberWithFloat: .5f], [OFNumber numberWithInt: 0xF], [OFNull null], @"foo", [OFNumber numberWithBool: false], nil], nil]; - - TEST(@"-[objectByParsingJSON] #1", - [string.objectByParsingJSON isEqual: dict]) - - TEST(@"-[JSONRepresentation]", - [[dict JSONRepresentation] isEqual: - @"{\"x\":[0.5,15,null,\"foo\",false],\"foo\":\"b\\na\\r\"}"]) - - TEST(@"OFJSONRepresentationOptionPretty", - [[dict JSONRepresentationWithOptions: - OFJSONRepresentationOptionPretty] isEqual: +} + +- (void)tearDown +{ + OFHashSeed = _hashSeed; +} + +- (void)dealloc +{ + [_dictionary release]; + + [super dealloc]; +} + +- (void)testObjectByParsingJSON +{ + OTAssertEqualObjects(string.objectByParsingJSON, _dictionary); +} + +- (void)testJSONRepresentation +{ + OTAssertEqualObjects(_dictionary.JSONRepresentation, + @"{\"x\":[0.5,15,null,\"foo\",false],\"foo\":\"b\\na\\r\"}"); +} + +- (void)testPrettyJSONRepresentation +{ + OTAssertEqualObjects([_dictionary JSONRepresentationWithOptions: + OFJSONRepresentationOptionPretty], @"{\n\t\"x\": [\n\t\t0.5,\n\t\t15,\n\t\tnull,\n\t\t" - @"\"foo\",\n\t\tfalse\n\t],\n\t\"foo\": \"b\\na\\r\"\n}"]) - - TEST(@"OFJSONRepresentationOptionJSON5", - [[dict JSONRepresentationWithOptions: - OFJSONRepresentationOptionJSON5] isEqual: - @"{x:[0.5,15,null,\"foo\",false],foo:\"b\\\na\\r\"}"]) - - EXPECT_EXCEPTION(@"-[objectByParsingJSON] #2", OFInvalidJSONException, - [@"{" objectByParsingJSON]) - EXPECT_EXCEPTION(@"-[objectByParsingJSON] #3", OFInvalidJSONException, - [@"]" objectByParsingJSON]) - EXPECT_EXCEPTION(@"-[objectByParsingJSON] #4", OFInvalidJSONException, - [@"bar" objectByParsingJSON]) - EXPECT_EXCEPTION(@"-[objectByParsingJSON] #5", OFInvalidJSONException, - [@"[\"a\" \"b\"]" objectByParsingJSON]) - - TEST(@"-[objectByParsingJSON] #6", - [@"[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]" - .objectByParsingJSON isEqual: [OFArray arrayWithObject: + @"\"foo\",\n\t\tfalse\n\t],\n\t\"foo\": \"b\\na\\r\"\n}"); +} + +- (void)testJSON5Representation +{ + OTAssertEqualObjects([_dictionary JSONRepresentationWithOptions: + OFJSONRepresentationOptionJSON5], + @"{x:[0.5,15,null,\"foo\",false],foo:\"b\\\na\\r\"}"); +} + +- (void)testObjectByParsingJSONFailsWithInvalidJSON +{ + OTAssertThrowsSpecific([@"{" objectByParsingJSON], + OFInvalidJSONException); + + OTAssertThrowsSpecific([@"]" objectByParsingJSON], + OFInvalidJSONException); + + OTAssertThrowsSpecific([@"bar" objectByParsingJSON], + OFInvalidJSONException); + + OTAssertThrowsSpecific([@"[\"a\" \"b\"]" objectByParsingJSON], + OFInvalidJSONException); +} + +- (void)testObjectByParsingJSONWithDeepNesting +{ + OTAssertEqualObjects( + @"[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]" + .objectByParsingJSON, + [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: @@ -79,14 +120,16 @@ [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: [OFArray arrayWithObject: - [OFDictionary dictionary]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]) + [OFDictionary dictionary]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]); +} - EXPECT_EXCEPTION(@"-[objectByParsingJSON] #7", OFInvalidJSONException, +- (void)testObjectByParsingJSONFailsWithTooDeepNesting +{ + OTAssertThrowsSpecific( [@"[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[{}]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]" - objectByParsingJSON]) - - objc_autoreleasePoolPop(pool); + objectByParsingJSON], + OFInvalidJSONException); } @end