diff --git a/MonsterCards/Helpers/JSONHelper.h b/MonsterCards/Helpers/JSONHelper.h index f8efb01..c4027c5 100644 --- a/MonsterCards/Helpers/JSONHelper.h +++ b/MonsterCards/Helpers/JSONHelper.h @@ -14,8 +14,13 @@ NS_ASSUME_NONNULL_BEGIN +(NSString*)readStringFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key; +(NSString*)readStringFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSString* _Nullable)defaultValue; ++(NSNumber*)readNumberFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key; ++(NSNumber*)readNumberFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSNumber* _Nullable)defaultValue; +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index; +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSString* _Nullable)defaultValue; ++(NSNumber*)readNumberFromArray:(NSArray*)array forIndex:(NSUInteger)index; ++(NSNumber*)readNumberFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSNumber* _Nullable)defaultValue; + @end NS_ASSUME_NONNULL_END diff --git a/MonsterCards/Helpers/JSONHelper.m b/MonsterCards/Helpers/JSONHelper.m index 61c956e..07a0015 100644 --- a/MonsterCards/Helpers/JSONHelper.m +++ b/MonsterCards/Helpers/JSONHelper.m @@ -18,6 +18,14 @@ NSString* coerceObjectToString(NSObject *object, NSString *defaultValue) { return defaultValue; } +NSNumber* coerceObjectToNumber(NSObject *object, NSNumber *defaultValue) { + if ([object isKindOfClass:[NSNumber class]]) { + return (NSNumber*)object; + } + + return defaultValue; +} + +(NSString*)readStringFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key { return [JSONHelper readStringFromDictionary:dictionary forKey:key withDefaultValue:nil]; } @@ -27,6 +35,15 @@ NSString* coerceObjectToString(NSObject *object, NSString *defaultValue) { return coerceObjectToString(object, defaultValue); } ++(NSNumber*)readNumberFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key { + return [JSONHelper readNumberFromDictionary:dictionary forKey:key withDefaultValue:nil]; +} + ++(NSNumber*)readNumberFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSNumber* _Nullable)defaultValue { + NSObject *object = [dictionary objectForKey:key]; + return coerceObjectToNumber(object, defaultValue); +} + +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index{ return [JSONHelper readStringFromArray:array forIndex:index withDefaultValue:nil]; } @@ -36,4 +53,13 @@ NSString* coerceObjectToString(NSObject *object, NSString *defaultValue) { return coerceObjectToString(object, defaultValue); } ++(NSNumber*)readNumberFromArray:(NSArray*)array forIndex:(NSUInteger)index { + return [JSONHelper readNumberFromArray:array forIndex:index withDefaultValue:nil]; +} + ++(NSNumber*)readNumberFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSNumber* _Nullable)defaultValue { + NSObject *object = [array objectAtIndex:index]; + return coerceObjectToNumber(object, defaultValue); +} + @end diff --git a/MonsterCardsTests/Helpers/JSONHelperTests.m b/MonsterCardsTests/Helpers/JSONHelperTests.m index 1acd0cc..77a2470 100644 --- a/MonsterCardsTests/Helpers/JSONHelperTests.m +++ b/MonsterCardsTests/Helpers/JSONHelperTests.m @@ -144,4 +144,90 @@ NSArray* readJSONArrayFromString(NSString *jsonString) { XCTAssertEqualObjects(_jsonStringValue, readString); } +#pragma mark - Integers in Dictionaries + +- (void)testReadIntegerFromDictionaryReturnsNilIfKeyNotPresent { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonStringFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromDictionary:jsonRoot forKey:_jsonIntegerKey]; + XCTAssertNil(readNumber); +} + +- (void)testReadIntegerFromDictionaryWithDefaultReturnsDefaultIfKeyNotPresent { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonStringFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromDictionary:jsonRoot forKey:_jsonIntegerKey withDefaultValue:_jsonIntegerValue]; + XCTAssertEqualObjects(_jsonIntegerValue, readNumber); +} + +- (void) testReadIntegerFromDictionaryReturnsCorrectValue { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonIntegerFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromDictionary:jsonRoot forKey:_jsonIntegerKey]; + XCTAssertEqualObjects(_jsonIntegerValue, readNumber); +} + +- (void)testReadIntegerFromDictionaryWithDefaultReturnsCorrectValue { + NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonIntegerFragment]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromDictionary:jsonRoot forKey:_jsonIntegerKey withDefaultValue:@67890]; + XCTAssertEqualObjects(_jsonIntegerValue, readNumber); +} + +- (void) testReadIntegerFromDictionaryReturnsNilIfWrongType { + NSString *jsonString = [NSString stringWithFormat:@"{\"%@\":\"%@\"}", _jsonIntegerKey, _jsonStringValue]; + NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromDictionary:jsonRoot forKey:_jsonIntegerKey]; + XCTAssertNil(readNumber); +} + +#pragma mark - Integers in Arrays + +- (void)testReadIntegerFromArrayReturnsNilIfNotAnInteger { + NSString *jsonString = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue]; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromArray:jsonRoot forIndex:0]; + XCTAssertNil(readNumber); +} + +- (void)testReadIntegerFromArrayWithDefaultReturnsDefaultValueIfNotAnInteger { + NSString *jsonString = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue]; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromArray:jsonRoot forIndex:0 withDefaultValue:_jsonIntegerValue]; + XCTAssertEqualObjects(_jsonIntegerValue, readNumber); +} + +- (void)testReadIntegerFromArrayThrowsIfIndexOutOfRange { + // TODO: Decide if this should throw or return nil + NSString *jsonString = @"[]"; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + XCTAssertThrows([JSONHelper readNumberFromArray:jsonRoot forIndex:0]); + XCTAssertThrows([JSONHelper readNumberFromArray:jsonRoot forIndex:-1]); +} + +- (void)testReadIntegerFromArrayReturnsCorrectValue { + NSString *jsonString = [NSString stringWithFormat:@"[%@]", _jsonIntegerValue]; + NSArray *jsonRoot = readJSONArrayFromString(jsonString); + XCTAssertNotNil(jsonRoot); + + NSNumber *readNumber = [JSONHelper readNumberFromArray:jsonRoot forIndex:0]; + XCTAssertEqualObjects(_jsonIntegerValue, readNumber); +} + @end