Adds JSONHelper methods to read dictionaries.

This commit is contained in:
2020-09-17 01:32:52 -07:00
parent 9bf1595f29
commit 555efac0c4
3 changed files with 125 additions and 0 deletions

View File

@@ -20,6 +20,8 @@ NS_ASSUME_NONNULL_BEGIN
+(int)readIntFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(int)defaultValue; +(int)readIntFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(int)defaultValue;
+(BOOL)readBoolFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key; +(BOOL)readBoolFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key;
+(BOOL)readBoolFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(BOOL)defaultValue; +(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;
+(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index; +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index;
+(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSString* _Nullable)defaultValue; +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSString* _Nullable)defaultValue;
@@ -29,6 +31,8 @@ NS_ASSUME_NONNULL_BEGIN
+(int)readIntFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(int)defaultValue; +(int)readIntFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(int)defaultValue;
+(BOOL)readBoolFromArray:(NSArray*)array forIndex:(NSUInteger)index; +(BOOL)readBoolFromArray:(NSArray*)array forIndex:(NSUInteger)index;
+(BOOL)readBoolFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(BOOL)defaultValue; +(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;
@end @end

View File

@@ -87,6 +87,19 @@ BOOL coerceObjectToBool(NSObject *object, BOOL defaultValue) {
return coerceObjectToBool(object, defaultValue); return coerceObjectToBool(object, defaultValue);
} }
+(NSDictionary*)readDictionaryFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key {
return [JSONHelper readDictionaryFromDictionary:dictionary forKey:key withDefaultValue:nil];
}
+(NSDictionary*)readDictionaryFromDictionary:(NSDictionary*)dictionary forKey:(NSString*)key withDefaultValue:(NSDictionary* _Nullable)defaultValue {
NSObject *object = [dictionary objectForKey:key];
if ([object isKindOfClass:[NSDictionary class]]) {
return (NSDictionary*)object;
}
return defaultValue;
}
+(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index{ +(NSString*)readStringFromArray:(NSArray*)array forIndex:(NSUInteger)index{
return [JSONHelper readStringFromArray:array forIndex:index withDefaultValue:nil]; return [JSONHelper readStringFromArray:array forIndex:index withDefaultValue:nil];
} }
@@ -123,4 +136,17 @@ BOOL coerceObjectToBool(NSObject *object, BOOL defaultValue) {
return coerceObjectToBool(object, defaultValue); return coerceObjectToBool(object, defaultValue);
} }
+(NSDictionary*)readDictionaryFromArray:(NSArray*)array forIndex:(NSUInteger)index {
return [JSONHelper readDictionaryFromArray:array forIndex:index withDefaultValue:nil];
}
+(NSDictionary*)readDictionaryFromArray:(NSArray*)array forIndex:(NSUInteger)index withDefaultValue:(NSDictionary* _Nullable)defaultValue {
NSObject *object = [array objectAtIndex:index];
if ([object isKindOfClass:[NSDictionary class]]) {
return (NSDictionary*)object;
}
return defaultValue;
}
@end @end

View File

@@ -23,6 +23,10 @@
NSString *_jsonBooleanKey; NSString *_jsonBooleanKey;
BOOL _jsonBooleanValue; BOOL _jsonBooleanValue;
NSString *_jsonBooleanFragment; NSString *_jsonBooleanFragment;
NSString *_jsonDictionaryKey;
NSDictionary *_jsonDictionaryValue;
NSString *_jsonDictionaryFragment;
NSString *_jsonDictionaryStringValue;
} }
NSString* escapeStringForJSON(NSString *unescaped) { NSString* escapeStringForJSON(NSString *unescaped) {
@@ -59,6 +63,10 @@ NSArray* readJSONArrayFromString(NSString *jsonString) {
_jsonBooleanKey = @"my_bool"; _jsonBooleanKey = @"my_bool";
_jsonBooleanValue = YES; _jsonBooleanValue = YES;
_jsonBooleanFragment = [NSString stringWithFormat:@"\"%@\":true", escapeStringForJSON(_jsonBooleanKey)]; _jsonBooleanFragment = [NSString stringWithFormat:@"\"%@\":true", escapeStringForJSON(_jsonBooleanKey)];
_jsonDictionaryKey = @"my_dictionary";
_jsonDictionaryValue = [NSDictionary dictionaryWithObjectsAndKeys:_jsonStringValue, _jsonStringKey, nil];
_jsonDictionaryStringValue = [NSString stringWithFormat:@"{%@}", _jsonStringFragment];
_jsonDictionaryFragment = [NSString stringWithFormat:@"\"%@\":%@", escapeStringForJSON(_jsonDictionaryKey), _jsonDictionaryStringValue];
} }
- (void)tearDown { - (void)tearDown {
@@ -242,6 +250,54 @@ NSArray* readJSONArrayFromString(NSString *jsonString) {
XCTAssertEqual(0, readNumber); XCTAssertEqual(0, readNumber);
} }
#pragma mark - Dictionaries in Dictionaries
- (void)testReadDictionaryFromDictionaryReturnsNilIfKeyNotPresent {
NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonStringFragment];
NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromDictionary:jsonRoot forKey:_jsonDictionaryKey];
XCTAssertNil(readValue);
}
- (void)testReadDictionaryFromDictionaryWithDefaultReturnsDefaultIfKeyNotPresent{
NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonStringFragment];
NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromDictionary:jsonRoot forKey:_jsonDictionaryKey withDefaultValue:@{}];
XCTAssertEqualObjects(@{}, readValue);
}
- (void)testReadDictionaryFromDictionaryReturnsCorrectValue {
NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonDictionaryFragment];
NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromDictionary:jsonRoot forKey:_jsonDictionaryKey];
XCTAssertEqualObjects(_jsonDictionaryValue, readValue);
}
- (void)testReadDictionaryFromDictionaryWithDefaultReturnsCorrectValue {
NSString *jsonString = [NSString stringWithFormat:@"{%@}", _jsonIntegerFragment];
NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromDictionary:jsonRoot forKey:_jsonDictionaryKey withDefaultValue:@{}];
XCTAssertEqualObjects(@{}, readValue);
}
- (void)testReadDictionaryFromDictionaryReturnsNilIfWrongType {
NSString *jsonString = [NSString stringWithFormat:@"{\"%@\":\"%@\"}", _jsonDictionaryKey, _jsonStringValue];
NSDictionary *jsonRoot = readJSONDictionaryFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromDictionary:jsonRoot forKey:_jsonDictionaryKey];
XCTAssertNil(readValue);
}
#pragma mark - Integers in Arrays #pragma mark - Integers in Arrays
- (void)testReadIntegerFromArrayReturnsNilIfNotAnInteger { - (void)testReadIntegerFromArrayReturnsNilIfNotAnInteger {
@@ -404,4 +460,43 @@ NSArray* readJSONArrayFromString(NSString *jsonString) {
XCTAssertEqual(_jsonBooleanValue, readValue); XCTAssertEqual(_jsonBooleanValue, readValue);
} }
#pragma mark - Dictionaries in Arrays
- (void)testReadDictionaryFromArrayReturnsNilIfNotCoercable {
NSString *jsonString = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue];
NSArray *jsonRoot = readJSONArrayFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromArray:jsonRoot forIndex:0];
XCTAssertNil(readValue);
}
- (void)testReadDictionaryFromArrayWithDefaultReturnsDefaultValueIfNotCoercable {
NSString *jsonString = [NSString stringWithFormat:@"[\"%@\"]", _jsonStringValue];
NSArray *jsonRoot = readJSONArrayFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromArray:jsonRoot forIndex:0 withDefaultValue:@{}];
XCTAssertEqualObjects(@{}, readValue);
}
- (void)testReadDictionaryFromArrayThrowsIfIndexOutOfRange {
// TODO: Decide if this should throw or return nil
NSString *jsonString = @"[]";
NSArray *jsonRoot = readJSONArrayFromString(jsonString);
XCTAssertNotNil(jsonRoot);
XCTAssertThrows([JSONHelper readDictionaryFromArray:jsonRoot forIndex:0]);
XCTAssertThrows([JSONHelper readDictionaryFromArray:jsonRoot forIndex:-1]);
}
- (void)testReadDictionaryFromArrayReturnsCorrectValue {
NSString *jsonString = [NSString stringWithFormat:@"[%@]", _jsonDictionaryStringValue];
NSArray *jsonRoot = readJSONArrayFromString(jsonString);
XCTAssertNotNil(jsonRoot);
NSDictionary *readValue = [JSONHelper readDictionaryFromArray:jsonRoot forIndex:0];
XCTAssertEqualObjects(_jsonDictionaryValue, readValue);
}
@end @end