YYTestCustomClass.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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) NSSet *userSet;
  40. @property (nonatomic, strong) YYBaseUser *user;
  41. @end
  42. @implementation YYTestCustomClassModel
  43. + (NSDictionary *)modelContainerPropertyGenericClass {
  44. return @{@"users" : YYBaseUser.class,
  45. @"userSet" : YYBaseUser.class};
  46. }
  47. + (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {
  48. if (dictionary[@"localName"]) {
  49. return [YYLocalUser class];
  50. } else if (dictionary[@"remoteName"]) {
  51. return [YYRemoteUser class];
  52. }
  53. return nil;
  54. }
  55. @end
  56. @interface YYTestCustomClass : XCTestCase
  57. @end
  58. @implementation YYTestCustomClass
  59. - (void)test {
  60. YYTestCustomClassModel *model;
  61. YYBaseUser *user;
  62. NSDictionary *jsonUserBase = @{@"uid" : @123, @"name" : @"Harry"};
  63. NSDictionary *jsonUserLocal = @{@"uid" : @123, @"name" : @"Harry", @"localName" : @"HarryLocal"};
  64. NSDictionary *jsonUserRemote = @{@"uid" : @123, @"name" : @"Harry", @"remoteName" : @"HarryRemote"};
  65. user = [YYBaseUser yy_modelWithDictionary:jsonUserBase];
  66. XCTAssert([user isMemberOfClass:[YYBaseUser class]]);
  67. user = [YYBaseUser yy_modelWithDictionary:jsonUserLocal];
  68. XCTAssert([user isMemberOfClass:[YYLocalUser class]]);
  69. user = [YYBaseUser yy_modelWithDictionary:jsonUserRemote];
  70. XCTAssert([user isMemberOfClass:[YYRemoteUser class]]);
  71. model = [YYTestCustomClassModel yy_modelWithJSON:@{@"user" : jsonUserLocal}];
  72. XCTAssert([model.user isMemberOfClass:[YYLocalUser class]]);
  73. model = [YYTestCustomClassModel yy_modelWithJSON:@{@"users" : @[jsonUserBase, jsonUserLocal, jsonUserRemote]}];
  74. XCTAssert([model.users[0] isMemberOfClass:[YYBaseUser class]]);
  75. XCTAssert([model.users[1] isMemberOfClass:[YYLocalUser class]]);
  76. XCTAssert([model.users[2] isMemberOfClass:[YYRemoteUser class]]);
  77. model = [YYTestCustomClassModel yy_modelWithJSON:@{@"userSet" : @[jsonUserBase, jsonUserLocal, jsonUserRemote]}];
  78. XCTAssert([model.userSet.anyObject isKindOfClass:[YYBaseUser class]]);
  79. }
  80. @end