Framework/ROADSerialization/ROADSerializationTest/Classes/RFCustomJSONSerializationHandlingTest.m (89 lines of code) (raw):
//
// RFCustomJSONSerializationHandlingTest.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 "RFAttributedCoder.h"
#import "RFAttributedDecoder.h"
#import "RFJSONCustomSerializationHandler.h"
#import "RFJSONCustomClassHandlerEntity.h"
#import "RFJSONCustomClassPropertyHandlerEntity.h"
#import "RFJSONCustomPropertyHandlerEntity.h"
#import "RFJSONCustomPropertyKeyHandlerEntity.h"
#import "RFSerializableStringChecker.h"
#import "RFJSONPropertyPreprocessingClass.h"
@interface RFCustomJSONSerializationHandlingTest : XCTestCase
@end
@implementation RFCustomJSONSerializationHandlingTest
- (void)testClassCustomSerializationHandler {
NSString *encodedObject = [RFAttributedCoder encodeRootObject:[RFJSONCustomClassHandlerEntity sampleObject]];
NSString *stringForSampleObject = @"\"Success Encoding\"";
XCTAssertTrue([stringForSampleObject isEqualToString:encodedObject], @"JSON custom serialization handling for class failed! Result of encoding is undefined!");
}
- (void)testClassCustomDeserializationHandler {
NSError *fileError;
NSString *jsonString = [[NSString alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"DeserializationCustomHandlingTest" ofType:@"json"] encoding:NSUTF8StringEncoding error:&fileError];
XCTAssertNil(fileError, @"File for deserialization was not loaded properly");
NSString *decodedObject = [RFAttributedDecoder decodeJSONString:jsonString withRootClassNamed:NSStringFromClass([RFJSONCustomClassHandlerEntity class])];
NSString *stringForSampleObject = @"Success Decoding";
XCTAssertTrue([stringForSampleObject isEqualToString:decodedObject], @"JSON custom deserialization handling for class failed! Result of decoding is undefined!");
}
- (void)testClassPropertyCustomSerializationHandler {
NSString *encodedObject = [RFAttributedCoder encodeRootObject:[RFJSONCustomClassPropertyHandlerEntity sampleObject]];
NSString *stringForSampleObject = @"{\n"
" \"string1\" : \"Success Encoding\",\n"
" \"RFSerializedObjectClassName\" : \"RFJSONCustomClassPropertyHandlerEntity\"\n"
"}";
XCTAssertTrue([stringForSampleObject isEqualToString:encodedObject], @"JSON custom serialization handling for class property failed! Result of encoding is undefined!");
}
- (void)testClassPropertyCustomDeserializationHandler {
NSError *fileError;
NSString *jsonString = [[NSString alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"DeserializationCustomHandlingTest" ofType:@"json"] encoding:NSUTF8StringEncoding error:&fileError];
XCTAssertNil(fileError, @"File for deserialization was not loaded properly");
NSString *decodedObject = [RFAttributedDecoder decodeJSONString:jsonString withRootClassNamed:NSStringFromClass([RFJSONCustomClassPropertyHandlerEntity class])];
NSString *deserializationTestObject = [RFJSONCustomClassPropertyHandlerEntity deserializationTestObject];
XCTAssertTrue([deserializationTestObject isEqual:decodedObject], @"JSON custom deserialization handling for class property failed! Result of decoding is undefined!");
}
- (void)testPropertyCustomSerializationHandler {
NSString *encodedObject = [RFAttributedCoder encodeRootObject:[RFJSONCustomPropertyHandlerEntity sampleObject]];
NSString *stringForSampleObject = @"{\n"
" \"string1\" : \"Success Encoding\",\n"
" \"RFSerializedObjectClassName\" : \"RFJSONCustomPropertyHandlerEntity\"\n"
"}";
XCTAssertTrue([stringForSampleObject isEqualToString:encodedObject], @"JSON custom serialization handling for property failed! Result of encoding is undefined!");
}
- (void)testPropertyCustomDeserializationHandler {
NSError *fileError;
NSString *jsonString = [[NSString alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"DeserializationCustomHandlingTest" ofType:@"json"] encoding:NSUTF8StringEncoding error:&fileError];
XCTAssertNil(fileError, @"File for deserialization was not loaded properly");
NSString *decodedObject = [RFAttributedDecoder decodeJSONString:jsonString withRootClassNamed:NSStringFromClass([RFJSONCustomPropertyHandlerEntity class])];
NSString *deserializationTestObject = [RFJSONCustomPropertyHandlerEntity deserializationTestObject];
XCTAssertTrue([deserializationTestObject isEqual:decodedObject], @"JSON custom deserialization handling for property failed! Result of decoding is undefined!");
}
- (void)testPropertyKeyCustomSerializationHandler {
NSString *encodedString = [RFAttributedCoder encodeRootObject:[RFJSONCustomPropertyKeyHandlerEntity sampleObject]];
NSString *stringForSampleObject = @"{\n"
" \"subDictionary\" : {\n"
" \"string1\" : \"Success Encoding\"\n"
" },\n"
" \"RFSerializedObjectClassName\" : \"RFJSONCustomPropertyKeyHandlerEntity\"\n"
"}";
NSString *errorMessage = [RFSerializableStringChecker serializeAndCheckEqualityOfString:encodedString withString:stringForSampleObject];
XCTAssertNil(errorMessage, @"%@", errorMessage);
}
- (void)testPropertyKeyCustomDeserializationHandler {
NSError *fileError;
NSString *jsonString = [[NSString alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"DeserializationCustomPropertyKeyHandlingTest" ofType:@"json"] encoding:NSUTF8StringEncoding error:&fileError];
XCTAssertNil(fileError, @"File for deserialization was not loaded properly");
NSString *decodedObject = [RFAttributedDecoder decodeJSONString:jsonString withRootClassNamed:NSStringFromClass([RFJSONCustomPropertyKeyHandlerEntity class])];
NSString *deserializationTestObject = [RFJSONCustomPropertyKeyHandlerEntity deserializationTestObject];
XCTAssertTrue([deserializationTestObject isEqual:decodedObject], @"JSON custom deserialization handling for property failed! Result of decoding is undefined!");
}
- (void)testCustomDateSerialization {
NSString *inputString = @"{ \"customDate\" : 90000000 }";
RFJSONPropertyPreprocessingClass *testObject = [RFAttributedDecoder decodeJSONString:inputString withRootClassNamed:NSStringFromClass([RFJSONPropertyPreprocessingClass class])];
XCTAssertTrue([testObject.customDate isEqualToDate:[NSDate dateWithTimeIntervalSince1970:90000000 - 10000]], @"Interval from custom handling NSDate is not correct");
NSString *outputString = [RFAttributedCoder encodeRootObject:testObject];
NSError *error;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[outputString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
XCTAssertNil(error, @"Attribute decoder generate not parsable json string");
XCTAssertTrue([dictionary isKindOfClass:[NSDictionary class]], @"JSON has wrong type");
XCTAssertEqualObjects(dictionary[@"customDate"], @90000000, @"Custom date was serialized incorrectly");
}
@end