/Testing/GBObjectiveCParser-MethodsParsingTesting.m

https://github.com/SinnerSchraderMobileMirrors/appledoc · Objective C · 580 lines · 396 code · 53 blank · 131 comment · 0 complexity · c3e7f078a7fb04890547a8124a7c2616 MD5 · raw file

  1. //
  2. // GBObjectiveCParser-MethodsParsingTesting.m
  3. // appledoc
  4. //
  5. // Created by Tomaz Kragelj on 25.7.10.
  6. // Copyright (C) 2010 Gentle Bytes. All rights reserved.
  7. //
  8. #import "GBStore.h"
  9. #import "GBDataObjects.h"
  10. #import "GBObjectiveCParser.h"
  11. // Note that we use class for invoking parsing of methods. Probably not the best option - i.e. we could isolate method parsing code altogether and only parse relevant stuff here, but it seemed not much would be gained by doing this. Separating unit tests does avoid repetition in top-level objects testing code - we only need to test specific data there.
  12. @interface GBObjectiveCParserMethodsParsingTesting : GBObjectsAssertor
  13. @end
  14. @implementation GBObjectiveCParserMethodsParsingTesting
  15. #pragma mark Method definitions parsing
  16. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionWithNoArguments {
  17. // setup
  18. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  19. GBStore *store = [[GBStore alloc] init];
  20. // execute
  21. [parser parseObjectsFromString:@"@interface MyClass -(id)method; @end" sourceFile:@"filename.h" toStore:store];
  22. // verify
  23. GBClassData *class = [[store classes] anyObject];
  24. NSArray *methods = [[class methods] methods];
  25. assertThatInteger([methods count], equalToInteger(1));
  26. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", nil];
  27. }
  28. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionWithArguments {
  29. // setup
  30. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  31. GBStore *store = [[GBStore alloc] init];
  32. // execute
  33. [parser parseObjectsFromString:@"@interface MyClass -(id)method:(NSString*)var; @end" sourceFile:@"filename.h" toStore:store];
  34. // verify
  35. GBClassData *class = [[store classes] anyObject];
  36. NSArray *methods = [[class methods] methods];
  37. assertThatInteger([methods count], equalToInteger(1));
  38. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", @"NSString", @"*", @"var", nil];
  39. }
  40. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionWithMutlipleArguments {
  41. // setup
  42. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  43. GBStore *store = [[GBStore alloc] init];
  44. // execute
  45. [parser parseObjectsFromString:@"@interface MyClass -(id)arg1:(int)var1 arg2:(long)var2; @end" sourceFile:@"filename.h" toStore:store];
  46. // verify
  47. GBClassData *class = [[store classes] anyObject];
  48. NSArray *methods = [[class methods] methods];
  49. assertThatInteger([methods count], equalToInteger(1));
  50. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"arg1", @"int", @"var1", @"arg2", @"long", @"var2", nil];
  51. }
  52. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionBlockArgument {
  53. // setup
  54. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  55. GBStore *store = [[GBStore alloc] init];
  56. // execute
  57. [parser parseObjectsFromString:@"@interface MyClass -(id)method:(void (^)(id obj, NSUInteger idx))block; @end" sourceFile:@"filename.h" toStore:store];
  58. // verify
  59. GBClassData *class = [[store classes] anyObject];
  60. NSArray *methods = [[class methods] methods];
  61. assertThatInteger([methods count], equalToInteger(1));
  62. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", @"void", @"(", @"^", @")", @"(", @"id", @"obj", @",", @"NSUInteger", @"idx", @")", @"block", nil];
  63. }
  64. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionVariableArgsArgument {
  65. // setup
  66. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  67. GBStore *store = [[GBStore alloc] init];
  68. // execute
  69. [parser parseObjectsFromString:@"@interface MyClass -(id)method:(id)first,...; @end" sourceFile:@"filename.h" toStore:store];
  70. // verify
  71. GBClassData *class = [[store classes] anyObject];
  72. NSArray *methods = [[class methods] methods];
  73. assertThatInteger([methods count], equalToInteger(1));
  74. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", @"id", @"first", @"...", nil];
  75. }
  76. - (void)testParseObjectsFromString_shouldRegisterAllMethodDefinitions {
  77. // setup
  78. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  79. GBStore *store = [[GBStore alloc] init];
  80. // execute
  81. [parser parseObjectsFromString:@"@interface MyClass -(id)method1; +(void)method2; @end" sourceFile:@"filename.h" toStore:store];
  82. // verify
  83. GBClassData *class = [[store classes] anyObject];
  84. NSArray *methods = [[class methods] methods];
  85. assertThatInteger([methods count], equalToInteger(2));
  86. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method1", nil];
  87. [self assertMethod:[methods objectAtIndex:1] matchesClassComponents:@"void", @"method2", nil];
  88. }
  89. - (void)testParseObjectsFromString_shouldHandleAttributeDirectiveForMethods {
  90. // setup
  91. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  92. GBStore *store = [[GBStore alloc] init];
  93. // execute
  94. [parser parseObjectsFromString:@"@interface Class - (void)method __attribute__((anything 00 ~!@#$%^&*)); @end" sourceFile:@"filename.h" toStore:store];
  95. // verify
  96. GBClassData *class = [[store classes] anyObject];
  97. NSArray *methods = [[class methods] methods];
  98. assertThatInteger([methods count], equalToInteger(1));
  99. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"void", @"method", nil];
  100. }
  101. #pragma mark Method declarations parsing
  102. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationWithNoArguments {
  103. // setup
  104. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  105. GBStore *store = [[GBStore alloc] init];
  106. // execute
  107. [parser parseObjectsFromString:@"@implementation MyClass -(id)method { } @end" sourceFile:@"filename.h" toStore:store];
  108. // verify
  109. GBClassData *class = [[store classes] anyObject];
  110. NSArray *methods = [[class methods] methods];
  111. assertThatInteger([methods count], equalToInteger(1));
  112. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", nil];
  113. }
  114. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationWithArguments {
  115. // setup
  116. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  117. GBStore *store = [[GBStore alloc] init];
  118. // execute
  119. [parser parseObjectsFromString:@"@implementation MyClass -(id)method:(NSString*)var { } @end" sourceFile:@"filename.h" toStore:store];
  120. // verify
  121. GBClassData *class = [[store classes] anyObject];
  122. NSArray *methods = [[class methods] methods];
  123. assertThatInteger([methods count], equalToInteger(1));
  124. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", @"NSString", @"*", @"var", nil];
  125. }
  126. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationWithMutlipleArguments {
  127. // setup
  128. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  129. GBStore *store = [[GBStore alloc] init];
  130. // execute
  131. [parser parseObjectsFromString:@"@implementation MyClass -(id)arg1:(int)var1 arg2:(long)var2 { } @end" sourceFile:@"filename.h" toStore:store];
  132. // verify
  133. GBClassData *class = [[store classes] anyObject];
  134. NSArray *methods = [[class methods] methods];
  135. assertThatInteger([methods count], equalToInteger(1));
  136. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"arg1", @"int", @"var1", @"arg2", @"long", @"var2", nil];
  137. }
  138. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationBlockArgument {
  139. // setup
  140. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  141. GBStore *store = [[GBStore alloc] init];
  142. // execute
  143. [parser parseObjectsFromString:@"@implementation MyClass -(id)method:(void (^)(id obj, NSUInteger idx))block{} @end" sourceFile:@"filename.h" toStore:store];
  144. // verify
  145. GBClassData *class = [[store classes] anyObject];
  146. NSArray *methods = [[class methods] methods];
  147. assertThatInteger([methods count], equalToInteger(1));
  148. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", @"void", @"(", @"^", @")", @"(", @"id", @"obj", @",", @"NSUInteger", @"idx", @")", @"block", nil];
  149. }
  150. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationVariableArgsArgument {
  151. // setup
  152. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  153. GBStore *store = [[GBStore alloc] init];
  154. // execute
  155. [parser parseObjectsFromString:@"@implementation MyClass -(id)method:(id)first,...{} @end" sourceFile:@"filename.h" toStore:store];
  156. // verify
  157. GBClassData *class = [[store classes] anyObject];
  158. NSArray *methods = [[class methods] methods];
  159. assertThatInteger([methods count], equalToInteger(1));
  160. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", @"id", @"first", @"...", nil];
  161. }
  162. - (void)testParseObjectsFromString_shouldRegisterAllMethodDeclarations {
  163. // setup
  164. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  165. GBStore *store = [[GBStore alloc] init];
  166. // execute
  167. [parser parseObjectsFromString:@"@implementation MyClass -(id)method1{} +(void)method2{} @end" sourceFile:@"filename.h" toStore:store];
  168. // verify
  169. GBClassData *class = [[store classes] anyObject];
  170. NSArray *methods = [[class methods] methods];
  171. assertThatInteger([methods count], equalToInteger(2));
  172. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method1", nil];
  173. [self assertMethod:[methods objectAtIndex:1] matchesClassComponents:@"void", @"method2", nil];
  174. }
  175. - (void)testParseObjectsFromString_shouldIgnoreMethodDeclarationSemicolon {
  176. // setup
  177. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  178. GBStore *store = [[GBStore alloc] init];
  179. // execute
  180. [parser parseObjectsFromString:@"@implementation MyClass -(id)method; {} @end" sourceFile:@"filename.h" toStore:store];
  181. // verify
  182. GBClassData *class = [[store classes] anyObject];
  183. NSArray *methods = [[class methods] methods];
  184. assertThatInteger([methods count], equalToInteger(1));
  185. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", nil];
  186. }
  187. - (void)testParseObjectsFromString_shouldIgnoreMethodDeclarationNestedCode {
  188. // setup
  189. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  190. GBStore *store = [[GBStore alloc] init];
  191. // execute
  192. [parser parseObjectsFromString:@"@implementation MyClass -(id)method { if (_var) { if(a>b) { [self quit]; } else { MY_MACRO(_var); } } } @end" sourceFile:@"filename.h" toStore:store];
  193. // verify
  194. GBClassData *class = [[store classes] anyObject];
  195. NSArray *methods = [[class methods] methods];
  196. assertThatInteger([methods count], equalToInteger(1));
  197. [self assertMethod:[methods objectAtIndex:0] matchesInstanceComponents:@"id", @"method", nil];
  198. }
  199. #pragma mark Properties parsing testing
  200. - (void)testParseObjectsFromString_shouldRegisterSimplePropertyDefinition {
  201. // setup
  202. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  203. GBStore *store = [[GBStore alloc] init];
  204. // execute
  205. [parser parseObjectsFromString:@"@interface MyClass @property(readonly) int name; @end" sourceFile:@"filename.h" toStore:store];
  206. // verify
  207. GBClassData *class = [[store classes] anyObject];
  208. NSArray *methods = [[class methods] methods];
  209. assertThatInteger([methods count], equalToInteger(1));
  210. [self assertMethod:[methods objectAtIndex:0] matchesPropertyComponents:@"readonly", @"int", @"name", nil];
  211. }
  212. - (void)testParseObjectsFromString_shouldRegisterComplexPropertyDefinition {
  213. // setup
  214. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  215. GBStore *store = [[GBStore alloc] init];
  216. // execute
  217. [parser parseObjectsFromString:@"@interface MyClass @property(retain,nonatomic) IBOutlet NSString *name; @end" sourceFile:@"filename.h" toStore:store];
  218. // verify
  219. GBClassData *class = [[store classes] anyObject];
  220. NSArray *methods = [[class methods] methods];
  221. assertThatInteger([methods count], equalToInteger(1));
  222. [self assertMethod:[methods objectAtIndex:0] matchesPropertyComponents:@"retain", @"nonatomic", @"IBOutlet", @"NSString", @"*", @"name", nil];
  223. }
  224. - (void)testParseObjectsFromString_shouldRegisterBlockPropertyDefinition {
  225. // setup
  226. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  227. GBStore *store = [[GBStore alloc] init];
  228. // execute
  229. [parser parseObjectsFromString:@"@interface MyClass @property (retain) void (^name)(id, NSUInteger); @end" sourceFile:@"filename.h" toStore:store];
  230. // verify
  231. GBClassData *class = [[store classes] anyObject];
  232. NSArray *methods = [[class methods] methods];
  233. assertThatInteger([methods count], equalToInteger(1));
  234. [self assertMethod:[methods objectAtIndex:0] matchesPropertyComponents:@"retain", @"void", @"(", @"^", @"name", @")", @"(", @"id", @",", @"NSUInteger", @")", @"name", nil];
  235. }
  236. - (void)testParseObjectsFromString_shouldRegisterAllPropertyDefinitions {
  237. // setup
  238. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  239. GBStore *store = [[GBStore alloc] init];
  240. // execute
  241. [parser parseObjectsFromString:@"@interface MyClass @property(readonly) int name1; @property(readwrite)long name2; @end" sourceFile:@"filename.h" toStore:store];
  242. // verify
  243. GBClassData *class = [[store classes] anyObject];
  244. NSArray *methods = [[class methods] methods];
  245. assertThatInteger([methods count], equalToInteger(2));
  246. [self assertMethod:[methods objectAtIndex:0] matchesPropertyComponents:@"readonly", @"int", @"name1", nil];
  247. [self assertMethod:[methods objectAtIndex:1] matchesPropertyComponents:@"readwrite", @"long", @"name2", nil];
  248. }
  249. - (void)testParseObjectsFromString_shouldHandleAttributeDirectiveForProperties {
  250. // setup
  251. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  252. GBStore *store = [[GBStore alloc] init];
  253. // execute
  254. [parser parseObjectsFromString:@"@interface Class @property (readonly) int name __attribute__((anything 00 ~!@#$%^&*)); @end" sourceFile:@"filename.h" toStore:store];
  255. // verify
  256. GBClassData *class = [[store classes] anyObject];
  257. NSArray *methods = [[class methods] methods];
  258. assertThatInteger([methods count], equalToInteger(1));
  259. [self assertMethod:[methods objectAtIndex:0] matchesPropertyComponents:@"readonly", @"int", @"name", nil];
  260. }
  261. #pragma mark Methods & properties required/optional parsing
  262. - (void)testParseObjectsFromString_shouldRegisterRequiredMethodDefinitionForProtocols {
  263. // setup
  264. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  265. GBStore *store = [[GBStore alloc] init];
  266. // execute
  267. [parser parseObjectsFromString:@"@protocol Protocol -(id)m1; -(id)m2; @end" sourceFile:@"filename.h" toStore:store];
  268. // verify
  269. GBProtocolData *protocol = [[store protocols] anyObject];
  270. NSArray *methods = [[protocol methods] methods];
  271. assertThatBool([[methods objectAtIndex:0] isRequired], equalToBool(YES));
  272. assertThatBool([[methods objectAtIndex:1] isRequired], equalToBool(YES));
  273. }
  274. - (void)testParseObjectsFromString_shouldRegisterOptionalMethodDefinitionForProtocols {
  275. // setup
  276. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  277. GBStore *store = [[GBStore alloc] init];
  278. // execute
  279. [parser parseObjectsFromString:@"@protocol Protocol @optional -(id)m1; -(id)m2; @end" sourceFile:@"filename.h" toStore:store];
  280. // verify
  281. GBProtocolData *protocol = [[store protocols] anyObject];
  282. NSArray *methods = [[protocol methods] methods];
  283. assertThatBool([[methods objectAtIndex:0] isRequired], equalToBool(NO));
  284. assertThatBool([[methods objectAtIndex:1] isRequired], equalToBool(NO));
  285. }
  286. - (void)testParseObjectsFromString_shouldRegisterMixedRequiredOptionalMethodDefinitionForProtocols {
  287. // setup
  288. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  289. GBStore *store = [[GBStore alloc] init];
  290. // execute
  291. [parser parseObjectsFromString:@"@protocol Protocol -(id)m1; @optional -(id)m2; @required -(id)m3; @end" sourceFile:@"filename.h" toStore:store];
  292. // verify
  293. GBProtocolData *protocol = [[store protocols] anyObject];
  294. NSArray *methods = [[protocol methods] methods];
  295. assertThatBool([[methods objectAtIndex:0] isRequired], equalToBool(YES));
  296. assertThatBool([[methods objectAtIndex:1] isRequired], equalToBool(NO));
  297. assertThatBool([[methods objectAtIndex:2] isRequired], equalToBool(YES));
  298. }
  299. - (void)testParseObjectsFromString_shouldRegisterRequiredPropertyDefinitionForProtocols {
  300. // setup
  301. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  302. GBStore *store = [[GBStore alloc] init];
  303. // execute
  304. [parser parseObjectsFromString:@"@protocol Protocol @property(readonly)int p1; @property(readonly)int p2; @end" sourceFile:@"filename.h" toStore:store];
  305. // verify
  306. GBProtocolData *protocol = [[store protocols] anyObject];
  307. NSArray *methods = [[protocol methods] methods];
  308. assertThatBool([[methods objectAtIndex:0] isRequired], equalToBool(YES));
  309. assertThatBool([[methods objectAtIndex:1] isRequired], equalToBool(YES));
  310. }
  311. - (void)testParseObjectsFromString_shouldRegisterOptionalPropertyDefinitionForProtocols {
  312. // setup
  313. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  314. GBStore *store = [[GBStore alloc] init];
  315. // execute
  316. [parser parseObjectsFromString:@"@protocol Protocol @optional @property(readonly)int p1; @property(readonly)int p2; @end" sourceFile:@"filename.h" toStore:store];
  317. // verify
  318. GBProtocolData *protocol = [[store protocols] anyObject];
  319. NSArray *methods = [[protocol methods] methods];
  320. assertThatBool([[methods objectAtIndex:0] isRequired], equalToBool(NO));
  321. assertThatBool([[methods objectAtIndex:1] isRequired], equalToBool(NO));
  322. }
  323. - (void)testParseObjectsFromString_shouldRegisterMixedRequiredOptionalPropertyDefinitionForProtocols {
  324. // setup
  325. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  326. GBStore *store = [[GBStore alloc] init];
  327. // execute
  328. [parser parseObjectsFromString:@"@protocol Protocol @property(readonly)int p1; @optional @property(readonly)int p2; @required @property(readonly)int p3; @end" sourceFile:@"filename.h" toStore:store];
  329. // verify
  330. GBProtocolData *protocol = [[store protocols] anyObject];
  331. NSArray *methods = [[protocol methods] methods];
  332. assertThatBool([[methods objectAtIndex:0] isRequired], equalToBool(YES));
  333. assertThatBool([[methods objectAtIndex:1] isRequired], equalToBool(NO));
  334. assertThatBool([[methods objectAtIndex:2] isRequired], equalToBool(YES));
  335. }
  336. #pragma mark Methods & properties extras parsing
  337. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionSourceFileAndLineNumber {
  338. // setup
  339. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  340. GBStore *store = [[GBStore alloc] init];
  341. // execute
  342. [parser parseObjectsFromString:@"@interface MyClass -(id)method; @end" sourceFile:@"filename.h" toStore:store];
  343. // verify
  344. GBMethodData *method = [[[[[store classes] anyObject] methods] methods] objectAtIndex:0];
  345. NSSet *files = [method sourceInfos];
  346. assertThatInteger([files count], equalToInteger(1));
  347. assertThat([[files anyObject] filename], is(@"filename.h"));
  348. assertThatInteger([[files anyObject] lineNumber], equalToInteger(1));
  349. }
  350. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionProperLineNumber {
  351. // setup
  352. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  353. GBStore *store = [[GBStore alloc] init];
  354. // execute
  355. [parser parseObjectsFromString:@"// comment\n#define SOMETHING\n\n@interface MyClass\n\n-(id)method; @end" sourceFile:@"filename.h" toStore:store];
  356. // verify
  357. GBMethodData *method = [[[[[store classes] anyObject] methods] methods] objectAtIndex:0];
  358. NSSet *files = [method sourceInfos];
  359. assertThatInteger([[files anyObject] lineNumber], equalToInteger(6));
  360. }
  361. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationSourceFileAndLineNumber {
  362. // setup
  363. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  364. GBStore *store = [[GBStore alloc] init];
  365. // execute
  366. [parser parseObjectsFromString:@"@implementation MyClass -(id)method {} @end" sourceFile:@"filename.h" toStore:store];
  367. // verify
  368. GBMethodData *method = [[[[[store classes] anyObject] methods] methods] objectAtIndex:0];
  369. NSSet *files = [method sourceInfos];
  370. assertThatInteger([files count], equalToInteger(1));
  371. assertThat([[files anyObject] filename], is(@"filename.h"));
  372. assertThatInteger([[files anyObject] lineNumber], equalToInteger(1));
  373. }
  374. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationProperLineNumber {
  375. // setup
  376. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  377. GBStore *store = [[GBStore alloc] init];
  378. // execute
  379. [parser parseObjectsFromString:@"// comment\n#define SOMETHING\n\n@implementation MyClass\n\n-(id)method {} @end" sourceFile:@"filename.h" toStore:store];
  380. // verify
  381. GBMethodData *method = [[[[[store classes] anyObject] methods] methods] objectAtIndex:0];
  382. NSSet *files = [method sourceInfos];
  383. assertThatInteger([[files anyObject] lineNumber], equalToInteger(6));
  384. }
  385. - (void)testParseObjectsFromString_shouldRegisterProperyDefinitionSourceFileAndLineNumber {
  386. // setup
  387. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  388. GBStore *store = [[GBStore alloc] init];
  389. // execute
  390. [parser parseObjectsFromString:@"@interface MyClass @property(readonly)int p1; @end" sourceFile:@"filename.h" toStore:store];
  391. // verify
  392. GBMethodData *method = [[[[[store classes] anyObject] methods] methods] objectAtIndex:0];
  393. NSSet *files = [method sourceInfos];
  394. assertThatInteger([files count], equalToInteger(1));
  395. assertThat([[files anyObject] filename], is(@"filename.h"));
  396. assertThatInteger([[files anyObject] lineNumber], equalToInteger(1));
  397. }
  398. - (void)testParseObjectsFromString_shouldRegisterPropertyDefinitionProperLineNumber {
  399. // setup
  400. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  401. GBStore *store = [[GBStore alloc] init];
  402. // execute
  403. [parser parseObjectsFromString:@"// comment\n#define SOMETHING\n\n@interface MyClass\n\n@property(readonly)int p1; @end" sourceFile:@"filename.h" toStore:store];
  404. // verify
  405. GBMethodData *method = [[[[[store classes] anyObject] methods] methods] objectAtIndex:0];
  406. NSSet *files = [method sourceInfos];
  407. assertThatInteger([[files anyObject] lineNumber], equalToInteger(6));
  408. }
  409. #pragma mark Method & properties comments parsing
  410. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionComment {
  411. // setup
  412. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  413. GBStore *store = [[GBStore alloc] init];
  414. // execute
  415. [parser parseObjectsFromString:@"@interface MyClass /** Comment1 */ -(id)method1; /** Comment2 */ +(void)method2; @end" sourceFile:@"filename.h" toStore:store];
  416. // verify
  417. GBClassData *class = [[store classes] anyObject];
  418. NSArray *methods = [[class methods] methods];
  419. assertThat([[(GBModelBase *)[methods objectAtIndex:0] comment] stringValue], is(@"Comment1"));
  420. assertThat([[(GBModelBase *)[methods objectAtIndex:1] comment] stringValue], is(@"Comment2"));
  421. }
  422. - (void)testParseObjectsFromString_shouldProperlyResetMethodComments {
  423. // setup
  424. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  425. GBStore *store = [[GBStore alloc] init];
  426. // execute
  427. [parser parseObjectsFromString:@"@interface MyClass /** Comment1 */ -(id)method1; +(void)method2; @end" sourceFile:@"filename.h" toStore:store];
  428. // verify
  429. GBClassData *class = [[store classes] anyObject];
  430. NSArray *methods = [[class methods] methods];
  431. assertThat([[(GBModelBase *)[methods objectAtIndex:0] comment] stringValue], is(@"Comment1"));
  432. assertThat([(GBModelBase *)[methods objectAtIndex:1] comment], is(nil));
  433. }
  434. - (void)testParseObjectsFromString_shouldProperlyResetPropertyComments {
  435. // setup
  436. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  437. GBStore *store = [[GBStore alloc] init];
  438. // execute
  439. [parser parseObjectsFromString:@"@interface MyClass /** Comment1 */ @property (readonly) id value; +(void)method2; @end" sourceFile:@"filename.h" toStore:store];
  440. // verify
  441. GBClassData *class = [[store classes] anyObject];
  442. NSArray *methods = [[class methods] methods];
  443. assertThat([[(GBModelBase *)[methods objectAtIndex:0] comment] stringValue], is(@"Comment1"));
  444. assertThat([(GBModelBase *)[methods objectAtIndex:1] comment], is(nil));
  445. }
  446. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationComment {
  447. // setup
  448. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  449. GBStore *store = [[GBStore alloc] init];
  450. // execute
  451. [parser parseObjectsFromString:@"@implementation MyClass /** Comment1 */ -(id)method1{} /** Comment2 */ +(void)method2{} @end" sourceFile:@"filename.m" toStore:store];
  452. // verify
  453. GBClassData *class = [[store classes] anyObject];
  454. NSArray *methods = [[class methods] methods];
  455. assertThat([[(GBModelBase *)[methods objectAtIndex:0] comment] stringValue], is(@"Comment1"));
  456. assertThat([[(GBModelBase *)[methods objectAtIndex:1] comment] stringValue], is(@"Comment2"));
  457. }
  458. - (void)testParseObjectsFromString_shouldRegisterPropertyDefinitionComment {
  459. // setup
  460. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  461. GBStore *store = [[GBStore alloc] init];
  462. // execute
  463. [parser parseObjectsFromString:@"@interface MyClass /** Comment1 */ @property(readonly)NSInteger p1; /** Comment2 */ @property(readonly)NSInteger p2; @end" sourceFile:@"filename.h" toStore:store];
  464. // verify
  465. GBClassData *class = [[store classes] anyObject];
  466. NSArray *methods = [[class methods] methods];
  467. assertThat([[(GBModelBase *)[methods objectAtIndex:0] comment] stringValue], is(@"Comment1"));
  468. assertThat([[(GBModelBase *)[methods objectAtIndex:1] comment] stringValue], is(@"Comment2"));
  469. }
  470. - (void)testParseObjectsFromString_shouldRegisterMethodDefinitionCommentSourceFileAndLineNumber {
  471. // setup
  472. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  473. GBStore *store = [[GBStore alloc] init];
  474. // execute
  475. [parser parseObjectsFromString:@"/// comment\n\n#define SOMETHING\n\n@interface MyClass\n/** comment */\n-(void)method; @end" sourceFile:@"filename.h" toStore:store];
  476. // verify
  477. GBClassData *class = [[store classes] anyObject];
  478. GBMethodData *method = [[[class methods] methods] objectAtIndex:0];
  479. assertThat(method.comment.sourceInfo.filename, is(@"filename.h"));
  480. assertThatInteger(method.comment.sourceInfo.lineNumber, equalToInteger(6));
  481. }
  482. - (void)testParseObjectsFromString_shouldRegisterMethodDeclarationCommentProperSourceLineNumber {
  483. // setup
  484. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  485. GBStore *store = [[GBStore alloc] init];
  486. // execute
  487. [parser parseObjectsFromString:@"/// comment\n\n#define SOMETHING\n\n@implementation MyClass\n/** comment */\n-(void)method{} @end" sourceFile:@"filename.h" toStore:store];
  488. // verify
  489. GBClassData *class = [[store classes] anyObject];
  490. GBMethodData *method = [[[class methods] methods] objectAtIndex:0];
  491. assertThat(method.comment.sourceInfo.filename, is(@"filename.h"));
  492. assertThatInteger(method.comment.sourceInfo.lineNumber, equalToInteger(6));
  493. }
  494. - (void)testParseObjectsFromString_shouldRegisterPropertyDefinitionCommentSourceFileAndLineNumber {
  495. // setup
  496. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  497. GBStore *store = [[GBStore alloc] init];
  498. // execute
  499. [parser parseObjectsFromString:@"/// comment\n\n#define SOMETHING\n\n@interface MyClass\n/** comment */\n@property(readonly)int p1; @end" sourceFile:@"filename.h" toStore:store];
  500. // verify
  501. GBClassData *class = [[store classes] anyObject];
  502. GBMethodData *method = [[[class methods] methods] objectAtIndex:0];
  503. assertThat(method.comment.sourceInfo.filename, is(@"filename.h"));
  504. assertThatInteger(method.comment.sourceInfo.lineNumber, equalToInteger(6));
  505. }
  506. #pragma mark Various cases
  507. - (void)testParseObjectsFromString_shouldSkipAnythingNotMethod {
  508. // setup
  509. GBObjectiveCParser *parser = [GBObjectiveCParser parserWithSettingsProvider:[GBTestObjectsRegistry mockSettingsProvider]];
  510. GBStore *store = [[GBStore alloc] init];
  511. // execute
  512. [parser parseObjectsFromString:
  513. @"@interface MyClass\n"
  514. @"#pragma mark -\n"
  515. @"#pragma mark Something\n"
  516. @"/** comment */\n"
  517. @"-(void)method;\n"
  518. @"@end" sourceFile:@"filename.h" toStore:store];
  519. // verify
  520. GBClassData *class = [[store classes] anyObject];
  521. NSArray *methods = [[class methods] methods];
  522. GBMethodData *method = [methods objectAtIndex:0];
  523. assertThatInteger([methods count], equalToInteger(1));
  524. [self assertMethod:method matchesInstanceComponents:@"void", @"method", nil];
  525. assertThat(method.comment.stringValue, is(@"comment"));
  526. }
  527. @end