YYTestModelMapper.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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. @property (nonatomic, assign) NSString *modelID;
  27. @end
  28. @implementation YYTestPropertyMapperModelCustom
  29. + (NSDictionary *)modelCustomPropertyMapper {
  30. return @{ @"name" : @"n",
  31. @"count" : @"ext.c",
  32. @"desc1" : @"ext.d", // mapped to same key path
  33. @"desc2" : @"ext.d", // mapped to same key path
  34. @"desc3" : @"ext.d.e",
  35. @"desc4" : @".ext",
  36. @"modelID" : @[@"ID", @"Id", @"id", @"ext.id"]};
  37. }
  38. @end
  39. @interface YYTestPropertyMapperModelWarn : NSObject {
  40. NSString *_description;
  41. }
  42. @property (nonatomic, strong) NSString *description;
  43. @property (nonatomic, strong) NSNumber *id;
  44. @end
  45. @implementation YYTestPropertyMapperModelWarn
  46. @synthesize description = _description;
  47. @end
  48. @protocol YYTestPropertyMapperModelAuto <NSObject>
  49. @end
  50. @protocol YYTestPropertyMapperModelCustom <NSObject>
  51. @end
  52. @protocol YYSimpleProtocol <NSObject>
  53. @end
  54. @interface YYTestPropertyMapperModelContainer : NSObject
  55. @property (nonatomic, strong) NSArray *array;
  56. @property (nonatomic, strong) NSMutableArray *mArray;
  57. @property (nonatomic, strong) NSDictionary *dict;
  58. @property (nonatomic, strong) NSMutableDictionary *mDict;
  59. @property (nonatomic, strong) NSSet *set;
  60. @property (nonatomic, strong) NSMutableSet *mSet;
  61. @property (nonatomic, strong) NSArray<YYTestPropertyMapperModelAuto> *pArray1;
  62. @property (nonatomic, strong) NSArray<YYSimpleProtocol,YYTestPropertyMapperModelAuto> *pArray2;
  63. @property (nonatomic, strong) NSArray<YYSimpleProtocol,YYTestPropertyMapperModelCustom> *pArray3;
  64. @end
  65. @implementation YYTestPropertyMapperModelContainer
  66. @end
  67. @interface YYTestPropertyMapperModelContainerGeneric : YYTestPropertyMapperModelContainer
  68. @end
  69. @implementation YYTestPropertyMapperModelContainerGeneric
  70. + (NSDictionary *)modelCustomPropertyMapper {
  71. return @{ @"mArray" : @"array",
  72. @"mDict" : @"dict",
  73. @"mSet" : @"set",
  74. @"pArray1" : @"array",
  75. @"pArray2" : @"array",
  76. @"pArray3" : @"array"};
  77. }
  78. + (NSDictionary *)modelContainerPropertyGenericClass {
  79. return @{@"array" : YYTestPropertyMapperModelAuto.class,
  80. @"mArray" : YYTestPropertyMapperModelAuto.class,
  81. @"dict" : YYTestPropertyMapperModelAuto.class,
  82. @"mDict" : YYTestPropertyMapperModelAuto.class,
  83. @"set" : @"YYTestPropertyMapperModelAuto",
  84. @"mSet" : @"YYTestPropertyMapperModelAuto",
  85. @"pArray3" : @"YYTestPropertyMapperModelAuto"};
  86. }
  87. @end
  88. @interface YYTestModelPropertyMapper : XCTestCase
  89. @end
  90. @implementation YYTestModelPropertyMapper
  91. - (void)testAuto {
  92. NSString *json;
  93. YYTestPropertyMapperModelAuto *model;
  94. json = @"{\"name\":\"Apple\",\"count\":12}";
  95. model = [YYTestPropertyMapperModelAuto yy_modelWithJSON:json];
  96. XCTAssertTrue([model.name isEqualToString:@"Apple"]);
  97. XCTAssertTrue([model.count isEqual:@12]);
  98. json = @"{\"n\":\"Apple\",\"count\":12, \"description\":\"hehe\"}";
  99. model = [YYTestPropertyMapperModelAuto yy_modelWithJSON:json];
  100. XCTAssertTrue(model.name == nil);
  101. XCTAssertTrue([model.count isEqual:@12]);
  102. }
  103. - (void)testCustom {
  104. NSString *json;
  105. NSDictionary *jsonObject;
  106. YYTestPropertyMapperModelCustom *model;
  107. json = @"{\"n\":\"Apple\",\"ext\":{\"c\":12}}";
  108. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  109. XCTAssertTrue([model.name isEqualToString:@"Apple"]);
  110. XCTAssertTrue([model.count isEqual:@12]);
  111. json = @"{\"n\":\"Apple\",\"count\":12}";
  112. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  113. XCTAssertTrue(model.count == nil);
  114. json = @"{\"n\":\"Apple\",\"ext\":12}";
  115. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  116. XCTAssertTrue(model.count == nil);
  117. json = @"{\"n\":\"Apple\",\"ext\":@{}}";
  118. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  119. XCTAssertTrue(model.count == nil);
  120. json = @"{\"ext\":{\"d\":\"Apple\"}}";
  121. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  122. XCTAssertTrue([model.desc1 isEqualToString:@"Apple"]);
  123. XCTAssertTrue([model.desc2 isEqualToString:@"Apple"]);
  124. jsonObject = [model yy_modelToJSONObject];
  125. XCTAssertTrue([((NSDictionary *)jsonObject[@"ext"])[@"d"] isEqualToString:@"Apple"]);
  126. json = @"{\"ext\":{\"d\":{ \"e\" : \"Apple\"}}}";
  127. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  128. XCTAssertTrue([model.desc3 isEqualToString:@"Apple"]);
  129. json = @"{\".ext\":\"Apple\"}";
  130. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  131. XCTAssertTrue([model.desc4 isEqualToString:@"Apple"]);
  132. json = @"{\".ext\":\"Apple\", \"name\":\"Apple\", \"count\":\"10\", \"desc1\":\"Apple\", \"desc2\":\"Apple\", \"desc3\":\"Apple\", \"desc4\":\"Apple\", \"modelID\":\"Apple\"}";
  133. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  134. XCTAssertTrue([model.desc4 isEqualToString:@"Apple"]);
  135. json = @"{\"id\":\"abcd\"}";
  136. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  137. XCTAssertTrue([model.modelID isEqualToString:@"abcd"]);
  138. json = @"{\"ext\":{\"id\":\"abcd\"}}";
  139. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  140. XCTAssertTrue([model.modelID isEqualToString:@"abcd"]);
  141. json = @"{\"id\":\"abcd\",\"ID\":\"ABCD\",\"Id\":\"Abcd\"}";
  142. model = [YYTestPropertyMapperModelCustom yy_modelWithJSON:json];
  143. XCTAssertTrue([model.modelID isEqualToString:@"ABCD"]);
  144. jsonObject = [model yy_modelToJSONObject];
  145. XCTAssertTrue(jsonObject[@"id"] == nil);
  146. XCTAssertTrue([jsonObject[@"ID"] isEqualToString:@"ABCD"]);
  147. }
  148. - (void)testWarn {
  149. NSString *json = @"{\"description\":\"Apple\",\"id\":12345}";
  150. YYTestPropertyMapperModelWarn *model = [YYTestPropertyMapperModelWarn yy_modelWithJSON:json];
  151. XCTAssertTrue([model.description isEqualToString:@"Apple"]);
  152. XCTAssertTrue([model.id isEqual:@12345]);
  153. }
  154. - (void)testContainer {
  155. NSString *json;
  156. NSDictionary *jsonObject = nil;
  157. YYTestPropertyMapperModelContainer *model;
  158. json = @"{\"array\":[\n {\"name\":\"Apple\", \"count\":10},\n {\"name\":\"Banana\", \"count\":11},\n {\"name\":\"Pear\", \"count\":12},\n null\n]}";
  159. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:json];
  160. XCTAssertTrue([model.array isKindOfClass:[NSArray class]]);
  161. XCTAssertTrue(model.array.count == 4);
  162. jsonObject = [model yy_modelToJSONObject];
  163. XCTAssertTrue([jsonObject[@"array"] isKindOfClass:[NSArray class]]);
  164. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:json];
  165. XCTAssertTrue([model.array isKindOfClass:[NSArray class]]);
  166. XCTAssertTrue(model.array.count == 3);
  167. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[0]).name isEqualToString:@"Apple"]);
  168. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[0]).count isEqual:@10]);
  169. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[2]).name isEqualToString:@"Pear"]);
  170. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.array[2]).count isEqual:@12]);
  171. XCTAssertTrue([model.mArray isKindOfClass:[NSMutableArray class]]);
  172. XCTAssertTrue(model.pArray1.count == 3);
  173. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.pArray1[0]).name isEqualToString:@"Apple"]);
  174. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.pArray1[0]).count isEqual:@10]);
  175. XCTAssertTrue(model.pArray2.count == 3);
  176. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.pArray2[0]).name isEqualToString:@"Apple"]);
  177. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.pArray2[0]).count isEqual:@10]);
  178. XCTAssertTrue(model.pArray3.count == 3);
  179. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.pArray3[0]).name isEqualToString:@"Apple"]);
  180. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.pArray3[0]).count isEqual:@10]);
  181. jsonObject = [model yy_modelToJSONObject];
  182. XCTAssertTrue([jsonObject[@"array"] isKindOfClass:[NSArray class]]);
  183. json = @"{\"dict\":{\n \"A\":{\"name\":\"Apple\", \"count\":10},\n \"B\":{\"name\":\"Banana\", \"count\":11},\n \"P\":{\"name\":\"Pear\", \"count\":12},\n \"N\":null\n}}";
  184. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:json];
  185. XCTAssertTrue([model.dict isKindOfClass:[NSDictionary class]]);
  186. XCTAssertTrue(model.dict.count == 4);
  187. jsonObject = [model yy_modelToJSONObject];
  188. XCTAssertTrue(jsonObject != nil);
  189. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:json];
  190. XCTAssertTrue([model.dict isKindOfClass:[NSDictionary class]]);
  191. XCTAssertTrue(model.dict.count == 3);
  192. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"A"]).name isEqualToString:@"Apple"]);
  193. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"A"]).count isEqual:@10]);
  194. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"P"]).name isEqualToString:@"Pear"]);
  195. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.dict[@"P"]).count isEqual:@12]);
  196. XCTAssertTrue([model.mDict isKindOfClass:[NSMutableDictionary class]]);
  197. jsonObject = [model yy_modelToJSONObject];
  198. XCTAssertTrue(jsonObject != nil);
  199. json = @"{\"set\":[\n {\"name\":\"Apple\", \"count\":10},\n {\"name\":\"Banana\", \"count\":11},\n {\"name\":\"Pear\", \"count\":12},\n null\n]}";
  200. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:json];
  201. XCTAssertTrue([model.set isKindOfClass:[NSSet class]]);
  202. XCTAssertTrue(model.set.count == 4);
  203. jsonObject = [model yy_modelToJSONObject];
  204. XCTAssertTrue(jsonObject != nil);
  205. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:json];
  206. XCTAssertTrue([model.set isKindOfClass:[NSSet class]]);
  207. XCTAssertTrue(model.set.count == 3);
  208. XCTAssertTrue([((YYTestPropertyMapperModelAuto *)model.set.anyObject).name isKindOfClass:[NSString class]]);
  209. XCTAssertTrue([model.mSet isKindOfClass:[NSMutableSet class]]);
  210. jsonObject = [model yy_modelToJSONObject];
  211. XCTAssertTrue(jsonObject != nil);
  212. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:@{@"set" : @[[YYTestPropertyMapperModelAuto new]]}];
  213. XCTAssertTrue([model.set isKindOfClass:[NSSet class]]);
  214. XCTAssertTrue([[model.set anyObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  215. model = [YYTestPropertyMapperModelContainerGeneric yy_modelWithJSON:@{@"array" : [NSSet setWithArray:@[[YYTestPropertyMapperModelAuto new]]]}];
  216. XCTAssertTrue([model.array isKindOfClass:[NSArray class]]);
  217. XCTAssertTrue([[model.array firstObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  218. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:@{@"mArray" : @[[YYTestPropertyMapperModelAuto new]]}];
  219. XCTAssertTrue([model.mArray isKindOfClass:[NSMutableArray class]]);
  220. XCTAssertTrue([[model.mArray firstObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  221. model = [YYTestPropertyMapperModelContainer yy_modelWithJSON:@{@"mArray" : [NSSet setWithArray:@[[YYTestPropertyMapperModelAuto new]]]}];
  222. XCTAssertTrue([model.mArray isKindOfClass:[NSMutableArray class]]);
  223. XCTAssertTrue([[model.mArray firstObject] isKindOfClass:[YYTestPropertyMapperModelAuto class]]);
  224. }
  225. @end