| // |
| // MTLModelNSCodingSpec.m |
| // Mantle |
| // |
| // Created by Justin Spahr-Summers on 2013-02-13. |
| // Copyright (c) 2013 GitHub. All rights reserved. |
| // |
| |
| #import "MTLTestModel.h" |
| |
| SpecBegin(MTLModelNSCoding) |
| |
| it(@"should have default encoding behaviors", ^{ |
| NSDictionary *behaviors = MTLTestModel.encodingBehaviorsByPropertyKey; |
| expect(behaviors).notTo.beNil(); |
| |
| expect(behaviors[@"name"]).to.equal(@(MTLModelEncodingBehaviorUnconditional)); |
| expect(behaviors[@"count"]).to.equal(@(MTLModelEncodingBehaviorUnconditional)); |
| expect(behaviors[@"weakModel"]).to.equal(@(MTLModelEncodingBehaviorConditional)); |
| expect(behaviors[@"dynamicName"]).to.beNil(); |
| }); |
| |
| it(@"should have default allowed classes", ^{ |
| NSDictionary *allowedClasses = MTLTestModel.allowedSecureCodingClassesByPropertyKey; |
| expect(allowedClasses).notTo.beNil(); |
| |
| expect(allowedClasses[@"name"]).to.equal(@[ NSString.class ]); |
| expect(allowedClasses[@"count"]).to.equal(@[ NSValue.class ]); |
| expect(allowedClasses[@"weakModel"]).to.equal(@[ MTLEmptyTestModel.class ]); |
| |
| // Not encoded into archives. |
| expect(allowedClasses[@"nestedName"]).to.beNil(); |
| expect(allowedClasses[@"dynamicName"]).to.beNil(); |
| }); |
| |
| it(@"should default to version 0", ^{ |
| expect(MTLEmptyTestModel.modelVersion).to.equal(0); |
| }); |
| |
| describe(@"archiving", ^{ |
| __block MTLEmptyTestModel *emptyModel; |
| __block MTLTestModel *model; |
| __block NSDictionary *values; |
| |
| __block MTLTestModel * (^archiveAndUnarchiveModel)(void); |
| |
| beforeEach(^{ |
| emptyModel = [[MTLEmptyTestModel alloc] init]; |
| expect(emptyModel).notTo.beNil(); |
| |
| values = @{ |
| @"name": @"foobar", |
| @"count": @5, |
| }; |
| |
| NSError *error = nil; |
| model = [[MTLTestModel alloc] initWithDictionary:values error:&error]; |
| expect(model).notTo.beNil(); |
| expect(error).to.beNil(); |
| |
| archiveAndUnarchiveModel = [^{ |
| NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model]; |
| expect(data).notTo.beNil(); |
| |
| MTLTestModel *unarchivedModel = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
| expect(unarchivedModel).notTo.beNil(); |
| |
| return unarchivedModel; |
| } copy]; |
| }); |
| |
| it(@"should archive unconditional properties", ^{ |
| expect(archiveAndUnarchiveModel()).to.equal(model); |
| }); |
| |
| it(@"should not archive excluded properties", ^{ |
| model.nestedName = @"foobar"; |
| |
| MTLTestModel *unarchivedModel = archiveAndUnarchiveModel(); |
| expect(unarchivedModel.nestedName).to.beNil(); |
| expect(unarchivedModel).notTo.equal(model); |
| |
| model.nestedName = nil; |
| expect(unarchivedModel).to.equal(model); |
| }); |
| |
| it(@"should not archive conditional properties if not encoded elsewhere", ^{ |
| model.weakModel = emptyModel; |
| |
| MTLTestModel *unarchivedModel = archiveAndUnarchiveModel(); |
| expect(unarchivedModel.weakModel).to.beNil(); |
| }); |
| |
| it(@"should archive conditional properties if encoded elsewhere", ^{ |
| model.weakModel = emptyModel; |
| |
| NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@[ model, emptyModel ]]; |
| expect(data).notTo.beNil(); |
| |
| NSArray *objects = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
| expect(objects.count).to.equal(2); |
| expect(objects[1]).to.equal(emptyModel); |
| |
| MTLTestModel *unarchivedModel = objects[0]; |
| expect(unarchivedModel).to.equal(model); |
| expect(unarchivedModel.weakModel).to.equal(emptyModel); |
| }); |
| |
| it(@"should invoke custom decoding logic", ^{ |
| MTLTestModel.modelVersion = 0; |
| |
| NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model]; |
| expect(data).notTo.beNil(); |
| |
| MTLTestModel.modelVersion = 1; |
| |
| MTLTestModel *unarchivedModel = [NSKeyedUnarchiver unarchiveObjectWithData:data]; |
| expect(unarchivedModel).notTo.beNil(); |
| expect(unarchivedModel.name).to.equal(@"M: foobar"); |
| expect(unarchivedModel.count).to.equal(@5); |
| }); |
| |
| it(@"should unarchive an external representation from the old model format", ^{ |
| NSURL *archiveURL = [[NSBundle bundleForClass:self.class] URLForResource:@"MTLTestModel-OldArchive" withExtension:@"plist"]; |
| expect(archiveURL).notTo.beNil(); |
| |
| MTLTestModel *unarchivedModel = [NSKeyedUnarchiver unarchiveObjectWithFile:archiveURL.path]; |
| expect(unarchivedModel).notTo.beNil(); |
| |
| NSDictionary *expectedValues = @{ |
| @"name": @"foobar", |
| @"count": @5, |
| @"nestedName": @"fuzzbuzz", |
| @"weakModel": NSNull.null, |
| }; |
| |
| expect(unarchivedModel.dictionaryValue).to.equal(expectedValues); |
| }); |
| }); |
| |
| SpecEnd |