YYTestModelMapper.m 10 KB

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