forked from ibireme/YYModel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathYYTestCustomClass.m
111 lines (86 loc) · 3.45 KB
/
YYTestCustomClass.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
// YYTestCustomClass.m
// YYModel <https://github.com/ibireme/YYModel>
//
// Created by ibireme on 15/11/29.
// Copyright (c) 2015 ibireme.
//
// This source code is licensed under the MIT-style license found in the
// LICENSE file in the root directory of this source tree.
//
#import <XCTest/XCTest.h>
#import "YYModel.h"
@interface YYBaseUser : NSObject
@property uint64_t uid;
@property NSString *name;
@end
@interface YYLocalUser : YYBaseUser
@property NSString *localName;
@end
@implementation YYLocalUser
@end
@interface YYRemoteUser : YYBaseUser
@property NSString *remoteName;
@end
@implementation YYRemoteUser
@end
@implementation YYBaseUser
+ (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {
if (dictionary[@"localName"]) {
return [YYLocalUser class];
} else if (dictionary[@"remoteName"]) {
return [YYRemoteUser class];
}
return [YYBaseUser class];
}
@end
@interface YYTestCustomClassModel : NSObject
@property (nonatomic, strong) NSArray *users;
@property (nonatomic, strong) NSDictionary *userDict;
@property (nonatomic, strong) NSSet *userSet;
@property (nonatomic, strong) YYBaseUser *user;
@end
@implementation YYTestCustomClassModel
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{@"users" : YYBaseUser.class,
@"userDict" : YYBaseUser.class,
@"userSet" : YYBaseUser.class};
}
+ (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {
if (dictionary[@"localName"]) {
return [YYLocalUser class];
} else if (dictionary[@"remoteName"]) {
return [YYRemoteUser class];
}
return nil;
}
@end
@interface YYTestCustomClass : XCTestCase
@end
@implementation YYTestCustomClass
- (void)test {
YYTestCustomClassModel *model;
YYBaseUser *user;
NSDictionary *jsonUserBase = @{@"uid" : @123, @"name" : @"Harry"};
NSDictionary *jsonUserLocal = @{@"uid" : @123, @"name" : @"Harry", @"localName" : @"HarryLocal"};
NSDictionary *jsonUserRemote = @{@"uid" : @123, @"name" : @"Harry", @"remoteName" : @"HarryRemote"};
user = [YYBaseUser yy_modelWithDictionary:jsonUserBase];
XCTAssert([user isMemberOfClass:[YYBaseUser class]]);
user = [YYBaseUser yy_modelWithDictionary:jsonUserLocal];
XCTAssert([user isMemberOfClass:[YYLocalUser class]]);
user = [YYBaseUser yy_modelWithDictionary:jsonUserRemote];
XCTAssert([user isMemberOfClass:[YYRemoteUser class]]);
model = [YYTestCustomClassModel yy_modelWithJSON:@{@"user" : jsonUserLocal}];
XCTAssert([model.user isMemberOfClass:[YYLocalUser class]]);
model = [YYTestCustomClassModel yy_modelWithJSON:@{@"users" : @[jsonUserBase, jsonUserLocal, jsonUserRemote]}];
XCTAssert([model.users[0] isMemberOfClass:[YYBaseUser class]]);
XCTAssert([model.users[1] isMemberOfClass:[YYLocalUser class]]);
XCTAssert([model.users[2] isMemberOfClass:[YYRemoteUser class]]);
model = [YYTestCustomClassModel yy_modelWithJSON:@{@"userDict" : @{@"a" : jsonUserBase, @"b" : jsonUserLocal, @"c" : jsonUserRemote}}];
XCTAssert([model.userDict[@"a"] isKindOfClass:[YYBaseUser class]]);
XCTAssert([model.userDict[@"b"] isKindOfClass:[YYLocalUser class]]);
XCTAssert([model.userDict[@"c"] isKindOfClass:[YYRemoteUser class]]);
model = [YYTestCustomClassModel yy_modelWithJSON:@{@"userSet" : @[jsonUserBase, jsonUserLocal, jsonUserRemote]}];
XCTAssert([model.userSet.anyObject isKindOfClass:[YYBaseUser class]]);
}
@end