YYTestModelMapper.m 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. //
  2. // YYTestModelMapper.m
  3. // YYModel <https://github.com/ibireme/YYModel>
  4. //
  5. // Created by ibireme on 15/11/27.
  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 YYTestPropertyMapperModelAuto : NSObject
  14. @property (nonatomic, assign) NSString *name;
  15. @property (nonatomic, assign) NSNumber *count;
  16. @end
  17. @implementation YYTestPropertyMapperModelAuto
  18. @end
  19. @interface YYTestPropertyMapperModelCustom : NSObject
  20. @property (nonatomic, assign) NSString *name;
  21. @property (nonatomic, assign) NSNumber *count;
  22. @property (nonatomic, assign) NSString *desc1;
  23. @property (nonatomic, assign) NSString *desc2;
  24. @property (nonatomic, assign) NSString *desc3;
  25. @property (nonatomic, assign) NSString *desc4;
  26. @end
  27. @implementation YYTestPropertyMapperModelCustom
  28. + (NSDictionary *)modelCustomPropertyMapper {
  29. return @{ @"name" : @"n",
  30. @"count" : @"ext.c",
  31. @"desc1" : @"ext.d", // mapped to same key path
  32. @"desc2" : @"ext.d", // mapped to same key path
  33. @"desc3" : @"ext.d.e",
  34. @"desc4" : @".ext"};
  35. }
  36. @end
  37. @interface YYTestPropertyMapperModelWarn : NSObject {
  38. NSString *_description;
  39. }
  40. @property (nonatomic, strong) NSString *description;
  41. @property (nonatomic, strong) NSNumber *id;
  42. @end
  43. @implementation YYTestPropertyMapperModelWarn
  44. @synthesize description = _description;
  45. @end
  46. @interface YYTestPropertyMapperModelContainer : NSObject
  47. @property (nonatomic, strong) NSArray *array;
  48. @property (nonatomic, strong) NSMutableArray *mArray;
  49. @property (nonatomic, strong) NSDictionary *dict;
  50. @property (nonatomic, strong) NSMutableDictionary *mDict;
  51. @property (nonatomic, strong) NSSet *set;
  52. @property (nonatomic, strong) NSMutableSet *mSet;
  53. @end
  54. @implementation YYTestPropertyMapperModelContainer
  55. @end
  56. @interface YYTestPropertyMapperModelContainerGeneric : YYTestPropertyMapperModelContainer
  57. @end
  58. @implementation YYTestPropertyMapperModelContainerGeneric
  59. + (NSDictionary *)modelCustomPropertyMapper {
  60. return @{ @"mArray" : @"array",
  61. @"mDict" : @"dict",
  62. @"mSet" : @"set"};
  63. }
  64. + (NSDictionary *)modelContainerPropertyGenericClass {
  65. return @{@"array" : YYTestPropertyMapperModelAuto.class,
  66. @"mArray" : YYTestPropertyMapperModelAuto.class,
  67. @"dict" : YYTestPropertyMapperModelAuto.class,
  68. @"mDict" : YYTestPropertyMapperModelAuto.class,
  69. @"set" : YYTestPropertyMapperModelAuto.class,
  70. @"mSet" : YYTestPropertyMapperModelAuto.class};
  71. }
  72. @end
  73. @interface YYTestModelPropertyMapper : XCTestCase
  74. @end
  75. @implementation YYTestModelPropertyMapper
  76. - (void)testAuto {
  77. NSString *json;
  78. YYTestPropertyMapperModelAuto *model;
  79. json = @"{\"name\":\"Apple\",\"count\":12}";
  80. model = [YYTestPropertyMapperModelAuto yy_modelWithJSON:json];
  81. XCTAssertTrue([model.name isEqualToString:@"Apple"]);
  82. XCTAssertTrue([model.count isEqual:@12]);
  83. json = @"{\"n\":\"Apple\",\"count\":12, \"description\":\"hehe\"}";
  84. model = [YYTestPropertyMapperModelAuto yy_modelWithJSON:json];
  85. XCTAssertTrue(model.name == nil);
  86. XCTAssertTrue([model.count isEqual:@12]);
  87. }
  88. - (void)testCustom {
  89. NSString *json;
  90. YYTestPropertyMapperModelCustom *model;
  91. json = @"{\"n\":\"Apple\",\"ext\":{\"c\":12}}";
  92. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  93. XCTAssertTrue([model.name isEqualToString:@"Apple"]);
  94. XCTAssertTrue([model.count isEqual:@12]);
  95. json = @"{\"n\":\"Apple\",\"count\":12}";
  96. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  97. XCTAssertTrue(model.count == nil);
  98. json = @"{\"n\":\"Apple\",\"ext\":12}";
  99. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  100. XCTAssertTrue(model.count == nil);
  101. json = @"{\"n\":\"Apple\",\"ext\":@{}}";
  102. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  103. XCTAssertTrue(model.count == nil);
  104. json = @"{\"ext\":{\"d\":\"Apple\"}}";
  105. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  106. XCTAssertTrue([model.desc1 isEqualToString:@"Apple"]);
  107. XCTAssertTrue([model.desc2 isEqualToString:@"Apple"]);
  108. json = @"{\"ext\":{\"d\":{ \"e\" : \"Apple\"}}}";
  109. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  110. XCTAssertTrue([model.desc3 isEqualToString:@"Apple"]);
  111. json = @"{\".ext\":\"Apple\"}";
  112. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  113. XCTAssertTrue([model.desc4 isEqualToString:@"Apple"]);
  114. }
  115. - (void)testWarn {
  116. NSString *json = @"{\"description\":\"Apple\",\"id\":12345}";
  117. YYTestPropertyMapperModelWarn *model = [YYTestPropertyMapperModelWarn yy_modelWithJSON:json];
  118. XCTAssertTrue([model.description isEqualToString:@"Apple"]);
  119. XCTAssertTrue([model.id isEqual:@12345]);
  120. }
  121. - (void)testContainer {
  122. NSString *json;
  123. NSDictionary *jsonObject = nil;
  124. YYTestPropertyMapperModelContainer *model;
  125. json = @"{\"array\":[\n {\"name\":\"Apple\", \"count\":10},\n {\"name\":\"Banana\", \"count\":11},\n {\"name\":\"Pear\", \"count\":12},\n null\n]}";
  126. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:json];
  127. XCTAssertTrue([model.array isKindOfClass:[NSArray class]]);
  128. XCTAssertTrue(model.array.count == 4);
  129. jsonObject = [model yy_modelToJSONObject];
  130. XCTAssertTrue([jsonObject[@"array"] isKindOfClass:[NSArray class]]);
  131. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:json];
  132. XCTAssertTrue([model.array isKindOfClass:[NSArray class]]);
  133. XCTAssertTrue(model.array.count == 3);
  134. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[0]).name isEqualToString:@"Apple"]);
  135. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[0]).count isEqual:@10]);
  136. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[2]).name isEqualToString:@"Pear"]);
  137. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[2]).count isEqual:@12]);
  138. XCTAssertTrue([model.mArray isKindOfClass:[NSMutableArray class]]);
  139. jsonObject = [model yy_modelToJSONObject];
  140. XCTAssertTrue([jsonObject[@"array"] isKindOfClass:[NSArray class]]);
  141. json = @"{\"dict\":{\n \"A\":{\"name\":\"Apple\", \"count\":10},\n \"B\":{\"name\":\"Banana\", \"count\":11},\n \"P\":{\"name\":\"Pear\", \"count\":12},\n \"N\":null\n}}";
  142. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:json];
  143. XCTAssertTrue([model.dict isKindOfClass:[NSDictionary class]]);
  144. XCTAssertTrue(model.dict.count == 4);
  145. jsonObject = [model yy_modelToJSONObject];
  146. XCTAssertTrue(jsonObject != nil);
  147. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:json];
  148. XCTAssertTrue([model.dict isKindOfClass:[NSDictionary class]]);
  149. XCTAssertTrue(model.dict.count == 3);
  150. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"A"]).name isEqualToString:@"Apple"]);
  151. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"A"]).count isEqual:@10]);
  152. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"P"]).name isEqualToString:@"Pear"]);
  153. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"P"]).count isEqual:@12]);
  154. XCTAssertTrue([model.mDict isKindOfClass:[NSMutableDictionary class]]);
  155. jsonObject = [model yy_modelToJSONObject];
  156. XCTAssertTrue(jsonObject != nil);
  157. json = @"{\"set\":[\n {\"name\":\"Apple\", \"count\":10},\n {\"name\":\"Banana\", \"count\":11},\n {\"name\":\"Pear\", \"count\":12},\n null\n]}";
  158. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:json];
  159. XCTAssertTrue([model.set isKindOfClass:[NSSet class]]);
  160. XCTAssertTrue(model.set.count == 4);
  161. jsonObject = [model yy_modelToJSONObject];
  162. XCTAssertTrue(jsonObject != nil);
  163. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:json];
  164. XCTAssertTrue([model.set isKindOfClass:[NSSet class]]);
  165. XCTAssertTrue(model.set.count == 3);
  166. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.set.anyObject).name isKindOfClass:[NSString class]]);
  167. XCTAssertTrue([model.mSet isKindOfClass:[NSMutableSet class]]);
  168. jsonObject = [model yy_modelToJSONObject];
  169. XCTAssertTrue(jsonObject != nil);
  170. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:@{@"set" : @[[YYTestPropertyMapperModelAuto new]]}];
  171. XCTAssertTrue([model.set isKindOfClass:[NSSet class]]);
  172. XCTAssertTrue([[model.set anyObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  173. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:@{@"array" : [NSSet setWithArray:@[[YYTestPropertyMapperModelAuto new]]]}];
  174. XCTAssertTrue([model.array isKindOfClass:[NSArray class]]);
  175. XCTAssertTrue([[model.array firstObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  176. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:@{@"mArray" : @[[YYTestPropertyMapperModelAuto new]]}];
  177. XCTAssertTrue([model.mArray isKindOfClass:[NSMutableArray class]]);
  178. XCTAssertTrue([[model.mArray firstObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  179. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:@{@"mArray" : [NSSet setWithArray:@[[YYTestPropertyMapperModelAuto new]]]}];
  180. XCTAssertTrue([model.mArray isKindOfClass:[NSMutableArray class]]);
  181. XCTAssertTrue([[model.mArray firstObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  182. }
  183. @end