/core/externals/google-toolbox-for-mac/Foundation/GTMValidatingContainersTest.m

http://macfuse.googlecode.com/ · Objective C · 378 lines · 286 code · 69 blank · 23 comment · 16 complexity · ed01af6574a5a5642d8cfefa7a9848df MD5 · raw file

  1. //
  2. // GTMValidatingContainersTest.m
  3. //
  4. // Copyright 2008 Google Inc.
  5. //
  6. // Licensed under the Apache License, Version 2.0 (the "License"); you may not
  7. // use this file except in compliance with the License. You may obtain a copy
  8. // of the License at
  9. //
  10. // http://www.apache.org/licenses/LICENSE-2.0
  11. //
  12. // Unless required by applicable law or agreed to in writing, software
  13. // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  14. // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  15. // License for the specific language governing permissions and limitations under
  16. // the License.
  17. //
  18. #import "GTMValidatingContainers.h"
  19. #import "GTMSenTestCase.h"
  20. #import "GTMUnitTestDevLog.h"
  21. #pragma mark Test Support Declarations
  22. @protocol GTMVCTestProtocol
  23. @end
  24. @interface GTMVCTestClass : NSObject
  25. + (id)instance;
  26. @end
  27. @interface GTMVCTestSubClass : GTMVCTestClass <GTMVCTestProtocol>
  28. - (void)foo;
  29. @end
  30. @interface GTMVCValidatingTests : GTMTestCase {
  31. GTMVCTestClass *testClass_;
  32. GTMVCTestSubClass *testSubClass_;
  33. }
  34. @end
  35. @interface GTMVCValidatorTests : GTMVCValidatingTests
  36. @end
  37. @interface GTMVCContainerTests : GTMVCValidatingTests {
  38. GTMConformsToProtocolValidator *validator_;
  39. SEL selector_;
  40. }
  41. @end
  42. @interface GTMVCArrayTests : GTMVCContainerTests
  43. @end
  44. @interface GTMVCDictionaryTests : GTMVCContainerTests
  45. @end
  46. @interface GTMVCSetTests : GTMVCContainerTests
  47. @end
  48. @interface GTMValidateContainerTests : GTMTestCase
  49. @end
  50. #pragma mark -
  51. #pragma mark Test Support Definitions
  52. @implementation GTMVCTestClass
  53. + (id)instance {
  54. return [[[self alloc] init] autorelease];
  55. }
  56. - (NSString*)description {
  57. return NSStringFromClass([self class]);
  58. }
  59. @end
  60. @implementation GTMVCTestSubClass
  61. - (void)foo {
  62. }
  63. @end
  64. @implementation GTMVCContainerTests
  65. - (void)setUp {
  66. [super setUp];
  67. Protocol *prot = @protocol(GTMVCTestProtocol);
  68. validator_ = [[GTMConformsToProtocolValidator alloc] initWithProtocol:prot];
  69. selector_ = @selector(validateObject:forContainer:);
  70. }
  71. - (void)tearDown {
  72. [validator_ release];
  73. [super tearDown];
  74. }
  75. @end
  76. @implementation GTMVCValidatingTests
  77. - (void)setUp {
  78. [super setUp];
  79. testClass_ = [[GTMVCTestClass alloc] init];
  80. testSubClass_ = [[GTMVCTestSubClass alloc] init];
  81. }
  82. - (void)tearDown {
  83. [testClass_ release];
  84. [testSubClass_ release];
  85. [super tearDown];
  86. }
  87. @end
  88. @implementation GTMVCValidatorTests
  89. - (void)testKindOfClassValidator {
  90. #if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  91. [GTMUnitTestDevLog expectString:@"nil class"];
  92. GTMKindOfClassValidator *validator;
  93. validator = [GTMKindOfClassValidator validateAgainstClass:nil];
  94. STAssertNil(validator, @"should be nil");
  95. Class cls = [GTMVCTestClass class];
  96. validator = [GTMKindOfClassValidator validateAgainstClass:cls];
  97. STAssertNotNil(validator, @"should be valid");
  98. BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
  99. STAssertTrue(isGood, @"should be validated");
  100. isGood = [validator validateObject:testSubClass_ forContainer:nil];
  101. STAssertTrue(isGood, @"should be validated");
  102. isGood = [validator validateObject:[NSNumber numberWithInt:0]
  103. forContainer:nil];
  104. STAssertFalse(isGood, @"should fail");
  105. #else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  106. GTMKindOfClassValidator *validator;
  107. validator = [GTMKindOfClassValidator validateAgainstClass:nil];
  108. STAssertNil(validator, @"should be nil");
  109. Class cls = [GTMVCTestClass class];
  110. validator = [GTMKindOfClassValidator validateAgainstClass:cls];
  111. STAssertNil(validator, @"should be nil");
  112. #endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  113. }
  114. - (void)testMemberOfClassValidator {
  115. #if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  116. [GTMUnitTestDevLog expectString:@"nil class"];
  117. GTMMemberOfClassValidator *validator;
  118. validator = [GTMMemberOfClassValidator validateAgainstClass:nil];
  119. STAssertNil(validator, @"should be nil");
  120. Class cls = [GTMVCTestClass class];
  121. validator = [GTMMemberOfClassValidator validateAgainstClass:cls];
  122. STAssertNotNil(validator, @"should be valid");
  123. BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
  124. STAssertTrue(isGood, @"should be validated");
  125. isGood = [validator validateObject:testSubClass_ forContainer:nil];
  126. STAssertFalse(isGood, @"should fail");
  127. isGood = [validator validateObject:nil forContainer:nil];
  128. STAssertFalse(isGood, @"should fail");
  129. isGood = [validator validateObject:[NSNumber numberWithInt:0]
  130. forContainer:nil];
  131. STAssertFalse(isGood, @"should fail");
  132. #else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  133. GTMMemberOfClassValidator *validator;
  134. validator = [GTMMemberOfClassValidator validateAgainstClass:nil];
  135. STAssertNil(validator, @"should be nil");
  136. Class cls = [GTMVCTestClass class];
  137. validator = [GTMMemberOfClassValidator validateAgainstClass:cls];
  138. STAssertNil(validator, @"should be nil");
  139. #endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  140. }
  141. - (void)testConformsToProtocolValidator {
  142. #if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  143. [GTMUnitTestDevLog expectString:@"nil protocol"];
  144. GTMConformsToProtocolValidator *validator;
  145. validator = [GTMConformsToProtocolValidator validateAgainstProtocol:nil];
  146. STAssertNil(validator, @"should be nil");
  147. Protocol *prot = @protocol(GTMVCTestProtocol);
  148. validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot];
  149. STAssertNotNil(validator, @"should be valid");
  150. BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
  151. STAssertFalse(isGood, @"should fail");
  152. isGood = [validator validateObject:testSubClass_ forContainer:nil];
  153. STAssertTrue(isGood, @"should succeed");
  154. isGood = [validator validateObject:nil forContainer:nil];
  155. STAssertFalse(isGood, @"should fail");
  156. #else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  157. GTMConformsToProtocolValidator *validator;
  158. validator = [GTMConformsToProtocolValidator validateAgainstProtocol:nil];
  159. STAssertNil(validator, @"should be nil");
  160. Protocol *prot = @protocol(GTMVCTestProtocol);
  161. validator = [GTMConformsToProtocolValidator validateAgainstProtocol:prot];
  162. STAssertNil(validator, @"should be nil");
  163. #endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  164. }
  165. - (void)testRespondsToSelectorValidator {
  166. #if GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  167. [GTMUnitTestDevLog expectString:@"nil selector"];
  168. GTMRespondsToSelectorValidator *validator;
  169. validator = [GTMRespondsToSelectorValidator validateAgainstSelector:nil];
  170. STAssertNil(validator, @"should be nil");
  171. SEL sel = @selector(foo);
  172. validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel];
  173. STAssertNotNil(validator, @"should be valid");
  174. BOOL isGood = [validator validateObject:testClass_ forContainer:nil];
  175. STAssertFalse(isGood, @"should fail");
  176. isGood = [validator validateObject:testSubClass_ forContainer:nil];
  177. STAssertTrue(isGood, @"should succeed");
  178. isGood = [validator validateObject:nil forContainer:nil];
  179. STAssertFalse(isGood, @"should fail");
  180. #else // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  181. GTMRespondsToSelectorValidator *validator;
  182. validator = [GTMRespondsToSelectorValidator validateAgainstSelector:nil];
  183. STAssertNil(validator, @"should be nil");
  184. SEL sel = @selector(foo);
  185. validator = [GTMRespondsToSelectorValidator validateAgainstSelector:sel];
  186. STAssertNil(validator, @"should be nil");
  187. #endif // GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
  188. }
  189. @end
  190. @implementation GTMVCArrayTests
  191. - (void)testContainer {
  192. GTMValidatingArray *array;
  193. array = [GTMValidatingArray validatingArrayWithTarget:validator_
  194. selector:selector_];
  195. STAssertNotNil(array, @"should be valid");
  196. array = [[[GTMValidatingArray alloc] initValidatingWithTarget:validator_
  197. selector:selector_] autorelease];
  198. STAssertNotNil(array, @"should be valid");
  199. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"];
  200. [array addObject:testSubClass_];
  201. [array addObject:testClass_];
  202. STAssertEquals([array objectAtIndex:0], testSubClass_, @"");
  203. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"];
  204. [array insertObject:testClass_ atIndex:0];
  205. [array insertObject:testSubClass_ atIndex:0];
  206. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingArray .*"];
  207. [array replaceObjectAtIndex:0 withObject:testClass_];
  208. [array replaceObjectAtIndex:0 withObject:testSubClass_];
  209. [array removeLastObject];
  210. [array removeObjectAtIndex:0];
  211. NSUInteger expectedCount = 0U;
  212. #if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  213. // If we're not validating, we don't expect any logs
  214. [GTMUnitTestDevLog resetExpectedLogs];
  215. expectedCount = 2U;
  216. #endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  217. STAssertEquals([array count], expectedCount, @"should have no objects left");
  218. }
  219. @end
  220. @implementation GTMVCDictionaryTests
  221. - (void)testContainer {
  222. GTMValidatingDictionary *dictionary;
  223. dictionary = [GTMValidatingDictionary validatingDictionaryWithTarget:validator_
  224. selector:selector_];
  225. STAssertNotNil(dictionary, @"should be valid");
  226. dictionary = [[[GTMValidatingDictionary alloc] initValidatingWithTarget:validator_
  227. selector:selector_] autorelease];
  228. STAssertNotNil(dictionary, @"should be valid");
  229. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingDictionary .*"];
  230. [dictionary setObject:testClass_ forKey:@"Key1"];
  231. [dictionary setObject:testSubClass_ forKey:@"Key2"];
  232. STAssertEquals([dictionary objectForKey:@"Key2"], testSubClass_, @"");
  233. STAssertNotNil([dictionary keyEnumerator], @"");
  234. [dictionary removeObjectForKey:@"Key2"];
  235. [dictionary removeObjectForKey:@"Key1"];
  236. STAssertEquals([dictionary count], (NSUInteger)0, @"should have no objects left");
  237. // So we get full code coverage
  238. [testSubClass_ foo];
  239. #if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  240. // If we're not validating, we don't expect any logs
  241. [GTMUnitTestDevLog resetExpectedLogs];
  242. #endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  243. }
  244. @end
  245. @implementation GTMVCSetTests
  246. - (void)testContainer {
  247. GTMValidatingSet *set;
  248. set = [GTMValidatingSet validatingSetWithTarget:validator_
  249. selector:selector_];
  250. STAssertNotNil(set, @"should be valid");
  251. set = [[[GTMValidatingSet alloc] initValidatingWithTarget:validator_
  252. selector:selector_] autorelease];
  253. STAssertNotNil(set, @"should be valid");
  254. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for GTMValidatingSet .*"];
  255. [set addObject:testClass_];
  256. [set addObject:testSubClass_];
  257. STAssertEqualObjects([set member:testSubClass_], testSubClass_, @"");
  258. STAssertNotNil([set objectEnumerator], @"");
  259. [set removeObject:testClass_];
  260. [set removeObject:testSubClass_];
  261. #if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  262. // If we're not validating, we don't expect any logs
  263. [GTMUnitTestDevLog resetExpectedLogs];
  264. #endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  265. STAssertEquals([set count], (NSUInteger)0, @"should have no objects left");
  266. }
  267. @end
  268. @implementation GTMValidateContainerTests
  269. - (void)testValidatingContainers {
  270. NSDictionary *homogenousDict = [NSDictionary dictionaryWithObjectsAndKeys:
  271. [GTMVCTestSubClass instance], @"key1",
  272. [GTMVCTestSubClass instance], @"key2",
  273. nil];
  274. NSDictionary *heterogenousDict = [NSDictionary dictionaryWithObjectsAndKeys:
  275. [GTMVCTestClass instance], @"key1",
  276. [GTMVCTestSubClass instance], @"key2",
  277. nil];
  278. // Test bad container
  279. [GTMUnitTestDevLog expectPattern:@"container does not respont to -objectEnumerator: .*"];
  280. _GTMValidateContainerContainsKindOfClass([NSString string],
  281. [GTMVCTestSubClass class]);
  282. _GTMValidateContainerContainsKindOfClass(homogenousDict,
  283. [GTMVCTestSubClass class]);
  284. _GTMValidateContainerContainsKindOfClass(heterogenousDict,
  285. [GTMVCTestClass class]);
  286. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"];
  287. _GTMValidateContainerContainsKindOfClass(heterogenousDict,
  288. [GTMVCTestSubClass class]);
  289. _GTMValidateContainerContainsMemberOfClass(homogenousDict,
  290. [GTMVCTestSubClass class]);
  291. [GTMUnitTestDevLog expectPattern:@"GTMVCTestSubClass failed container verification for .*"];
  292. _GTMValidateContainerContainsMemberOfClass(heterogenousDict,
  293. [GTMVCTestClass class]);
  294. _GTMValidateContainerConformsToProtocol(homogenousDict,
  295. @protocol(GTMVCTestProtocol));
  296. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"];
  297. _GTMValidateContainerConformsToProtocol(heterogenousDict,
  298. @protocol(GTMVCTestProtocol));
  299. _GTMValidateContainerItemsRespondToSelector(homogenousDict,
  300. @selector(foo));
  301. [GTMUnitTestDevLog expectPattern:@"GTMVCTestClass failed container verification for .*"];
  302. _GTMValidateContainerItemsRespondToSelector(heterogenousDict,
  303. @selector(foo));
  304. #if !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  305. // If we're not validating, we don't expect any logs
  306. [GTMUnitTestDevLog resetExpectedLogs];
  307. #endif // !(GTM_CONTAINERS_VALIDATE && GTM_CONTAINERS_VALIDATION_FAILED_LOG && !GTM_CONTAINERS_VALIDATION_FAILED_ASSERT)
  308. }
  309. @end