YYTestCustomClass.m 3.4 KB

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