diff --git a/iOS/MonsterCards/Helpers/JSONHelper.h b/iOS/MonsterCards/Helpers/JSONHelper.h index 50948e0..05b1294 100644 --- a/iOS/MonsterCards/Helpers/JSONHelper.h +++ b/iOS/MonsterCards/Helpers/JSONHelper.h @@ -22,6 +22,8 @@ NS_ASSUME_NONNULL_BEGIN +(BOOL)readBoolFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(BOOL)defaultValue; +(NSDictionary*)readDictionaryFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key; +(NSDictionary*)readDictionaryFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSDictionary* _Nullable)defaultValue; ++(NSArray*)readArrayFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key; ++(NSArray*)readArrayFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSArray* _Nullable)defaultValue; +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index; +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSString* _Nullable)defaultValue; @@ -33,6 +35,8 @@ NS_ASSUME_NONNULL_BEGIN +(BOOL)readBoolFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(BOOL)defaultValue; +(NSDictionary*)readDictionaryFromArray:(NSArray*)array forIndex:(NSUInteger)index; +(NSDictionary*)readDictionaryFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSDictionary* _Nullable)defaultValue; ++(NSArray*)readArrayFromArray:(NSArray*)array forIndex:(NSUInteger)index; ++(NSArray*)readArrayFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSArray* _Nullable)defaultValue; @end diff --git a/iOS/MonsterCards/Helpers/JSONHelper.m b/iOS/MonsterCards/Helpers/JSONHelper.m index 1b81862..f8d128d 100644 --- a/iOS/MonsterCards/Helpers/JSONHelper.m +++ b/iOS/MonsterCards/Helpers/JSONHelper.m @@ -100,6 +100,19 @@ BOOL coerceObjectToBool(NSObject *object, BOOL defaultValue) { return defaultValue; } ++(NSArray*)readArrayFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key { + return [JSONHelper readArrayFromDictionary:dictionary forKey:key withDefaultValue:nil]; +} + ++(NSArray*)readArrayFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSArray* _Nullable)defaultValue { + NSObject *object = [dictionary objectForKey:key]; + if ([object isKindOfClass:[NSArray class]]) { + return (NSArray*)object; + } + + return defaultValue; +} + +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index{ return [JSONHelper readStringFromArray:array forIndex:index withDefaultValue:nil]; } @@ -149,4 +162,17 @@ BOOL coerceObjectToBool(NSObject *object, BOOL defaultValue) { return defaultValue; } ++(NSArray*)readArrayFromArray:(NSArray*)array forIndex:(NSUInteger)index { + return [JSONHelper readArrayFromArray:array forIndex:index withDefaultValue:nil]; +} + ++(NSArray*)readArrayFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSArray* _Nullable)defaultValue { + NSObject *object = [array objectAtIndex:index]; + if ([object isKindOfClass:[NSArray class]]) { + return (NSArray*)object; + } + + return defaultValue; +} + @end diff --git a/iOS/MonsterCardsTests/Helpers/JSONHelperTests.m b/iOS/MonsterCardsTests/Helpers/JSONHelperTests.m index ddf42d6..d23ecc2 100644 --- a/iOS/MonsterCardsTests/Helpers/JSONHelperTests.m +++ b/iOS/MonsterCardsTests/Helpers/JSONHelperTests.m @@ -27,6 +27,10 @@ NSDictionary *_jsonDictionaryValue; NSString *_jsonDictionaryFragment; NSString *_jsonDictionaryStringValue; + NSString *_jsonArrayKey; + NSArray *_jsonArrayValue; + NSString *_jsonArrayFragment; + NSString *_jsonArrayStringValue; } NSString* escapeStringForJSON(NSString *unescaped) { @@ -64,9 +68,13 @@ NSArray* readJSONArrayFromString(NSString *jsonString) { _jsonBooleanValue = YES; _jsonBooleanFragment = [NSString stringWithFormat:@"\"%@\":true", escapeStringForJSON(_jsonBooleanKey)]; _jsonDictionaryKey = @"my_dictionary"; - _jsonDictionaryValue = [NSDictionary dictionaryWithObjectsAndKeys:_jsonStringValue, _jsonStringKey, nil]; + _jsonDictionaryValue = @{_jsonStringKey: _jsonStringValue}; _jsonDictionaryStringValue = [NSString stringWithFormat:@"{%@}", _jsonStringFragment]; _jsonDictionaryFragment = [NSString stringWithFormat:@"\"%@\":%@", escapeStringForJSON(_jsonDictionaryKey), _jsonDictionaryStringValue]; + _jsonArrayKey = @"my_array"; + _jsonArrayValue = @[_jsonStringValue]; + _jsonArrayStringValue = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue]; + _jsonArrayFragment = [NSString stringWithFormat:@"\"%@\":%@", escapeStringForJSON(_jsonArrayKey), _jsonArrayStringValue]; } - (void)tearDown { @@ -298,6 +306,54 @@ NSArray* readJSONArrayFromString(NSString *jsonString) { XCTAssertNil(readValue); } +#pragma mark - Arrays in Dictionaries + +- (void)testReadArrayFromDictionaryReturnsNilIfKeyNotPresent { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonStringFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + + NSArray *readValue = [JSONHelper readArrayFromDictionary:jsonRoot forKey:_jsonArrayKey]; + XCTAssertNil(readValue); +} + +- (void)testReadArrayFromDictionaryWithDefaultReturnsDefaultIfKeyNotPresent{ + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonStringFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromDictionary:jsonRoot forKey:_jsonArrayKey withDefaultValue:@[]]; + XCTAssertEqualObjects(@[], readValue); +} + +- (void)testReadArrayFromDictionaryReturnsCorrectValue { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonArrayFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromDictionary:jsonRoot forKey:_jsonArrayKey]; + XCTAssertEqualObjects(_jsonArrayValue, readValue); +} + +- (void)testReadArrayFromDictionaryWithDefaultReturnsCorrectValue { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonIntegerFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromDictionary:jsonRoot forKey:_jsonArrayKey withDefaultValue:@[]]; + XCTAssertEqualObjects(@[], readValue); +} + +- (void)testReadArrayFromDictionaryReturnsNilIfWrongType { + NSString *jsonString = [NSString stringWithFormat:@"{\"%@\":\"%@\"}", _jsonArrayKey, _jsonStringValue]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromDictionary:jsonRoot forKey:_jsonArrayKey]; + XCTAssertNil(readValue); +} + #pragma mark - Integers in Arrays - (void)testReadIntegerFromArrayReturnsNilIfNotAnInteger { @@ -499,4 +555,43 @@ NSArray* readJSONArrayFromString(NSString *jsonString) { XCTAssertEqualObjects(_jsonDictionaryValue, readValue); } +#pragma mark - Arrays in Arrays + +- (void)testReadArrayFromArrayReturnsNilIfNotCoercable { + NSString *jsonString = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue]; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromArray:jsonRoot forIndex:0]; + XCTAssertNil(readValue); +} + +- (void)testReadArrayFromArrayWithDefaultReturnsDefaultValueIfNotCoercable { + NSString *jsonString = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue]; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromArray:jsonRoot forIndex:0 withDefaultValue:@[]]; + XCTAssertEqualObjects(@[], readValue); +} + +- (void)testReadArrayFromArrayThrowsIfIndexOutOfRange { + // TODO: Decide if this should throw or return nil + NSString *jsonString = @"[]"; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + XCTAssertThrows([JSONHelper readArrayFromArray:jsonRoot forIndex:0]); + XCTAssertThrows([JSONHelper readArrayFromArray:jsonRoot forIndex:-1]); +} + +- (void)testReadArrayFromArrayReturnsCorrectValue { + NSString *jsonString = [NSString stringWithFormat:@"[%@]", _jsonArrayStringValue]; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSArray *readValue = [JSONHelper readArrayFromArray:jsonRoot forIndex:0]; + XCTAssertEqualObjects(_jsonArrayValue, readValue); +} + @end