Framework/ROADSerialization/ROADSerializationTest/Classes/RFSerializableStringChecker.m (53 lines of code) (raw):
//
// RFSerializableStringChecker.m
// ROADSerialization
//
// Copyright (c) 2014 EPAM Systems, Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// Redistributions in binary form must reproduce the above copyright notice, this
// list of conditions and the following disclaimer in the documentation and/or
// other materials provided with the distribution.
// Neither the name of the EPAM Systems, Inc. nor the names of its contributors
// may be used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// See the NOTICE file and the LICENSE file distributed with this work
// for additional information regarding copyright ownership and licensing
#import <XCTest/XCTest.h>
#import "RFSerializableStringChecker.h"
#define CHECK_AND_THROW_ERROR(check, error) if (check) { \
return error; \
} \
@implementation RFSerializableStringChecker
+ (NSString *)serializeAndCheckEqualityOfString:(NSString *)string withString:(NSString *)anotherString {
NSError *error;
NSDictionary *testDictionary = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
CHECK_AND_THROW_ERROR(error, @"Assertion: error while parsing test file");
NSDictionary *resultDictionary = [NSJSONSerialization JSONObjectWithData:[anotherString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
CHECK_AND_THROW_ERROR(error, @"Assertion: error while parsing test file");
return [self checkDictionary:testDictionary withDictionary:resultDictionary];
}
+ (NSString *)checkDictionary:(NSDictionary *)dictionary withDictionary:(NSDictionary *)anotherDictionary {
CHECK_AND_THROW_ERROR((![dictionary isKindOfClass:[NSDictionary class]]
|| ![anotherDictionary isKindOfClass:[NSDictionary class]]), @"Values are not equal. Test data differ from result of encoding");
CHECK_AND_THROW_ERROR([[dictionary allKeys] count] != [[anotherDictionary allKeys] count], @"Key count is not the same. Dictionaries is not equal");
for (NSString *key in dictionary) {
id obj = dictionary[key];
id anotherObj = anotherDictionary[key];
if ([key rangeOfString:@"date"].location == NSNotFound) {
CHECK_AND_THROW_ERROR([self checkObject:obj withObject:anotherObj], @"Values are not equal. Dictionaries is not equal");
}
else { // Don't check dates for equality, because of difference in time zone
CHECK_AND_THROW_ERROR(anotherObj == nil, @"Date value is nill. Dictionaries is not equal");
}
}
return nil;
}
+ (NSString *)checkObject:(id)obj withObject:(id)anotherObj {
if ([obj isKindOfClass:[NSDictionary class]]) { // Recursive check for dictionary value
CHECK_AND_THROW_ERROR([self checkDictionary:obj withDictionary:anotherObj], @"Values are not equal. Test data differ from result of encoding");
}
else if ([obj isKindOfClass:[NSArray class]]) { // Loop check for arrays
[self checkArray:obj withArray:anotherObj];
}
else {
CHECK_AND_THROW_ERROR(![obj isEqual:anotherObj], @"Values are not equal. Test data differ from result of encoding");
}
return nil;
}
+ (NSString *)checkArray:(NSArray *)array withArray:(NSArray *)anotherArray {
CHECK_AND_THROW_ERROR(![array isKindOfClass:[NSArray class]]
|| ![anotherArray isKindOfClass:[NSArray class]], @"Values are not equal. Test data differ from result of encoding");
for (int index = 0; index < [array count]; index++) {
id objOfFirstArray = array[index];
id objOfSecondArray = anotherArray[index];
[self checkObject:objOfFirstArray withObject:objOfSecondArray];
}
return nil;
}
@end