Adds JSONHelper methods to read arrays.

This commit is contained in:
2020-09-17 12:37:03 -07:00
parent 81726e9554
commit 74745f6d54
3 changed files with 126 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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