/src/tests/Public/v6.0/GRMustacheTagDelegateTest.m

https://github.com/oleganza/GRMustache · Objective C · 830 lines · 694 code · 115 blank · 21 comment · 26 complexity · 354f7fc65e1b17b4376343e9edf44ede MD5 · raw file

  1. // The MIT License
  2. //
  3. // Copyright (c) 2013 Gwendal Roué
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. #define GRMUSTACHE_VERSION_MAX_ALLOWED GRMUSTACHE_VERSION_6_0
  23. #import "GRMustachePublicAPITest.h"
  24. @interface GRMustacheTagDelegateTest : GRMustachePublicAPITest
  25. @end
  26. @implementation GRMustacheTagDelegateTest
  27. - (void)testMustacheTagWillRenderIsNotTriggeredByText
  28. {
  29. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  30. __block BOOL success = YES;
  31. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  32. success = NO;
  33. return object;
  34. };
  35. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"---" error:NULL];
  36. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  37. [template renderObject:nil error:NULL];
  38. STAssertEquals(success, YES, @"");
  39. }
  40. - (void)testMustacheTagDidRenderIsNotTriggeredByText
  41. {
  42. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  43. __block BOOL success = YES;
  44. delegate.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  45. success = NO;
  46. };
  47. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"---" error:NULL];
  48. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  49. [template renderObject:nil error:NULL];
  50. STAssertEquals(success, YES, @"");
  51. }
  52. - (void)testVariableTagDelegate
  53. {
  54. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  55. __block GRMustacheTagType preRenderingTagType = -1;
  56. __block GRMustacheTagType postRenderingTagType = -1;
  57. __block id preRenderedObjet = nil;
  58. __block id postRenderedObjet = nil;
  59. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  60. preRenderedObjet = object;
  61. preRenderingTagType = tag.type;
  62. return @"delegate";
  63. };
  64. delegate.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  65. postRenderedObjet = object;
  66. postRenderingTagType = tag.type;
  67. };
  68. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"---{{foo}}---" error:NULL];
  69. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  70. NSString *rendering = [template renderObject:@{@"foo": @"value"} error:NULL];
  71. STAssertEqualObjects(rendering, @"---delegate---", @"");
  72. STAssertEquals(preRenderingTagType, GRMustacheTagTypeVariable, @"", @"");
  73. STAssertEquals(postRenderingTagType, GRMustacheTagTypeVariable, @"", @"");
  74. STAssertEqualObjects(preRenderedObjet, @"value", @"");
  75. STAssertEqualObjects(postRenderedObjet, @"delegate", @"");
  76. }
  77. - (void)testSectionTagDelegate
  78. {
  79. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  80. __block GRMustacheTagType preRenderingTagType = -1;
  81. __block GRMustacheTagType postRenderingTagType = -1;
  82. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  83. preRenderingTagType = tag.type;
  84. return object;
  85. };
  86. delegate.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  87. postRenderingTagType = tag.type;
  88. };
  89. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{#foo}}{{bar}}{{/foo}}>" error:NULL];
  90. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  91. NSString *rendering = [template renderObject:nil error:NULL];
  92. STAssertEqualObjects(rendering, @"<>", @"");
  93. STAssertEquals(preRenderingTagType, GRMustacheTagTypeSection, @"", @"");
  94. STAssertEquals(postRenderingTagType, GRMustacheTagTypeSection, @"", @"");
  95. }
  96. - (void)testMultipleTagsDelegate
  97. {
  98. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  99. __block NSUInteger templateWillInterpretCount = 0;
  100. __block NSUInteger templateDidInterpretCount = 0;
  101. __block GRMustacheTagType preRenderingTagType1 = -1;
  102. __block GRMustacheTagType postRenderingTagType1 = -1;
  103. __block id preRenderedObjet1 = nil;
  104. __block id postRenderedObjet1 = nil;
  105. __block GRMustacheTagType preRenderingTagType2 = -1;
  106. __block GRMustacheTagType postRenderingTagType2 = -1;
  107. __block id preRenderedObjet2 = nil;
  108. __block id postRenderedObjet2 = nil;
  109. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  110. ++templateWillInterpretCount;
  111. switch (templateWillInterpretCount) {
  112. case 1:
  113. preRenderedObjet1 = object;
  114. preRenderingTagType1 = tag.type;
  115. return @YES;
  116. case 2:
  117. preRenderedObjet2 = object;
  118. preRenderingTagType2 = tag.type;
  119. return @"delegate";
  120. }
  121. return object;
  122. };
  123. delegate.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  124. ++templateDidInterpretCount;
  125. switch (templateDidInterpretCount) {
  126. case 1:
  127. postRenderedObjet1 = object;
  128. postRenderingTagType1 = tag.type;
  129. break;
  130. case 2:
  131. postRenderedObjet2 = object;
  132. postRenderingTagType2 = tag.type;
  133. break;
  134. }
  135. };
  136. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{#foo}}{{bar}}{{/foo}}>" error:NULL];
  137. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  138. NSString *rendering = [template renderObject:nil error:NULL];
  139. STAssertEqualObjects(rendering, @"<delegate>", @"");
  140. STAssertEquals(templateWillInterpretCount, (NSUInteger)2, @"");
  141. STAssertEquals(templateDidInterpretCount, (NSUInteger)2, @"");
  142. STAssertEqualObjects(preRenderedObjet1, (id)nil, @"");
  143. STAssertEqualObjects(preRenderedObjet2, (id)nil, @"");
  144. STAssertEqualObjects(postRenderedObjet1, @"delegate", @"");
  145. STAssertEqualObjects(postRenderedObjet2, @(YES), @"");
  146. STAssertEquals(preRenderingTagType1, GRMustacheTagTypeSection, @"", @"");
  147. STAssertEquals(preRenderingTagType2, GRMustacheTagTypeVariable, @"", @"");
  148. STAssertEquals(postRenderingTagType1, GRMustacheTagTypeVariable, @"", @"");
  149. STAssertEquals(postRenderingTagType2, GRMustacheTagTypeSection, @"", @"");
  150. }
  151. - (void)testDelegateInterpretsRenderedValue
  152. {
  153. {
  154. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  155. __block id renderedObject = nil;
  156. __block NSUInteger templateWillInterpretCount = 0;
  157. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  158. ++templateWillInterpretCount;
  159. renderedObject = object;
  160. return object;
  161. };
  162. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{subject}}" error:NULL];
  163. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  164. NSString *rendering = [template renderObject:nil error:NULL];
  165. STAssertEqualObjects(rendering, @"", @"");
  166. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  167. STAssertEquals(renderedObject, (id)nil, @"");
  168. }
  169. {
  170. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  171. __block id renderedObject = nil;
  172. __block NSUInteger templateWillInterpretCount = 0;
  173. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  174. ++templateWillInterpretCount;
  175. renderedObject = object;
  176. return object;
  177. };
  178. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{subject}}" error:NULL];
  179. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  180. NSString *rendering = [template renderObject:@{@"subject":@"foo"} error:NULL];
  181. STAssertEqualObjects(rendering, @"foo", @"");
  182. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  183. STAssertEqualObjects(renderedObject, @"foo", @"");
  184. }
  185. {
  186. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  187. __block id renderedObject = nil;
  188. __block NSUInteger templateWillInterpretCount = 0;
  189. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  190. ++templateWillInterpretCount;
  191. renderedObject = object;
  192. return object;
  193. };
  194. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{subject.foo}}" error:NULL];
  195. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  196. NSString *rendering = [template renderObject:nil error:NULL];
  197. STAssertEqualObjects(rendering, @"", @"");
  198. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  199. STAssertEquals(renderedObject, (id)nil, @"");
  200. }
  201. {
  202. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  203. __block id renderedObject = nil;
  204. __block NSUInteger templateWillInterpretCount = 0;
  205. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  206. ++templateWillInterpretCount;
  207. renderedObject = object;
  208. return object;
  209. };
  210. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{subject.foo}}" error:NULL];
  211. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  212. NSString *rendering = [template renderObject:@{@"subject":@"foo"} error:NULL];
  213. STAssertEqualObjects(rendering, @"", @"");
  214. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  215. STAssertEquals(renderedObject, (id)nil, @"");
  216. }
  217. {
  218. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  219. __block id renderedObject = nil;
  220. __block NSUInteger templateWillInterpretCount = 0;
  221. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  222. ++templateWillInterpretCount;
  223. renderedObject = object;
  224. return object;
  225. };
  226. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{subject.foo}}" error:NULL];
  227. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  228. NSString *rendering = [template renderObject:@{@"subject":@{@"foo":@"bar"}} error:NULL];
  229. STAssertEqualObjects(rendering, @"bar", @"");
  230. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  231. STAssertEqualObjects(renderedObject, @"bar", @"");
  232. }
  233. {
  234. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  235. __block id renderedObject = nil;
  236. __block NSUInteger templateWillInterpretCount = 0;
  237. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  238. ++templateWillInterpretCount;
  239. renderedObject = object;
  240. return object;
  241. };
  242. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{uppercase(subject)}}" error:NULL];
  243. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  244. NSString *rendering = [template renderObject:nil error:NULL];
  245. STAssertEqualObjects(rendering, @"", @"");
  246. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  247. STAssertEquals(renderedObject, (id)nil, @"");
  248. }
  249. {
  250. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  251. __block id renderedObject = nil;
  252. __block NSUInteger templateWillInterpretCount = 0;
  253. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  254. ++templateWillInterpretCount;
  255. [renderedObject release];
  256. renderedObject = [object retain];
  257. return object;
  258. };
  259. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{uppercase(subject)}}" error:NULL];
  260. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  261. NSString *rendering = [template renderObject:@{@"subject":@"foo"} error:NULL];
  262. STAssertEqualObjects(rendering, @"FOO", @"");
  263. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  264. STAssertEqualObjects(renderedObject, @"FOO", @"");
  265. }
  266. {
  267. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  268. __block id renderedObject = nil;
  269. __block NSUInteger templateWillInterpretCount = 0;
  270. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  271. ++templateWillInterpretCount;
  272. renderedObject = object;
  273. return object;
  274. };
  275. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{uppercase(subject).length}}" error:NULL];
  276. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  277. NSString *rendering = [template renderObject:@{@"subject":@"foo"} error:NULL];
  278. STAssertEqualObjects(rendering, @"3", @"");
  279. STAssertEquals(templateWillInterpretCount, (NSUInteger)1, @"");
  280. STAssertEqualObjects(renderedObject, @3, @"");
  281. }
  282. }
  283. - (void)testTagDescriptionContainsTag
  284. {
  285. {
  286. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  287. __block NSString *description = nil;
  288. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  289. [description release];
  290. description = [[tag description] retain];
  291. return object;
  292. };
  293. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{name}}" error:NULL];
  294. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  295. [template renderObject:nil error:NULL];
  296. STAssertNotNil(description, @"");
  297. NSRange range = [description rangeOfString:@"{{name}}"];
  298. STAssertTrue(range.location != NSNotFound, @"");
  299. }
  300. {
  301. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  302. __block NSString *description = nil;
  303. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  304. [description release];
  305. description = [[tag description] retain];
  306. return object;
  307. };
  308. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#name}}{{/name}}" error:NULL];
  309. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  310. [template renderObject:nil error:NULL];
  311. STAssertNotNil(description, @"");
  312. NSRange range = [description rangeOfString:@"{{#name}}"];
  313. STAssertTrue(range.location != NSNotFound, @"");
  314. }
  315. {
  316. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  317. __block NSString *description = nil;
  318. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  319. [description release];
  320. description = [[tag description] retain];
  321. return object;
  322. };
  323. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{ name\t}}" error:NULL];
  324. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  325. [template renderObject:nil error:NULL];
  326. STAssertNotNil(description, @"");
  327. NSRange range = [description rangeOfString:@"{{ name\t}}"];
  328. STAssertTrue(range.location != NSNotFound, @"");
  329. }
  330. }
  331. - (void)testTagDescriptionContainsLineNumber
  332. {
  333. {
  334. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  335. __block NSString *description = nil;
  336. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  337. [description release];
  338. description = [[tag description] retain];
  339. return object;
  340. };
  341. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{name}}" error:NULL];
  342. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  343. [template renderObject:nil error:NULL];
  344. STAssertNotNil(description, @"");
  345. NSRange range = [description rangeOfString:@"line 1"];
  346. STAssertTrue(range.location != NSNotFound, @"");
  347. }
  348. {
  349. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  350. __block NSString *description = nil;
  351. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  352. [description release];
  353. description = [[tag description] retain];
  354. return object;
  355. };
  356. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"\n {{name}}" error:NULL];
  357. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  358. [template renderObject:nil error:NULL];
  359. STAssertNotNil(description, @"");
  360. NSRange range = [description rangeOfString:@"line 2"];
  361. STAssertTrue(range.location != NSNotFound, @"");
  362. }
  363. {
  364. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  365. __block NSString *description = nil;
  366. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  367. [description release];
  368. description = [[tag description] retain];
  369. return object;
  370. };
  371. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"\n\n {{#name}}\n\n{{/name}}" error:NULL];
  372. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  373. [template renderObject:nil error:NULL];
  374. STAssertNotNil(description, @"");
  375. NSRange range = [description rangeOfString:@"line 3"];
  376. STAssertTrue(range.location != NSNotFound, @"");
  377. }
  378. }
  379. - (void)testTagDescriptionContainsResourceBasedTemplatePath
  380. {
  381. {
  382. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  383. __block NSString *description = nil;
  384. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  385. [description release];
  386. description = [[tag description] retain];
  387. return object;
  388. };
  389. GRMustacheTemplate *template = [GRMustacheTemplate templateFromResource:@"GRMustacheTagDelegateTest" bundle:self.testBundle error:NULL];
  390. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  391. [template renderObject:nil error:NULL];
  392. STAssertNotNil(description, @"");
  393. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  394. STAssertTrue(range.location != NSNotFound, @"");
  395. }
  396. {
  397. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  398. __block NSString *description = nil;
  399. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  400. [description release];
  401. description = [[tag description] retain];
  402. return object;
  403. };
  404. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithBundle:self.testBundle];
  405. GRMustacheTemplate *template = [repository templateNamed:@"GRMustacheTagDelegateTest" error:NULL];
  406. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  407. [template renderObject:nil error:NULL];
  408. STAssertNotNil(description, @"");
  409. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  410. STAssertTrue(range.location != NSNotFound, @"");
  411. }
  412. }
  413. - (void)testTagDescriptionContainsURLBasedTemplatePath
  414. {
  415. {
  416. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  417. __block NSString *description = nil;
  418. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  419. [description release];
  420. description = [[tag description] retain];
  421. return object;
  422. };
  423. GRMustacheTemplate *template = [GRMustacheTemplate templateFromContentsOfURL:[self.testBundle URLForResource:@"GRMustacheTagDelegateTest" withExtension:@"mustache"] error:NULL];
  424. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  425. [template renderObject:nil error:NULL];
  426. STAssertNotNil(description, @"");
  427. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  428. STAssertTrue(range.location != NSNotFound, @"");
  429. }
  430. {
  431. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  432. __block NSString *description = nil;
  433. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  434. [description release];
  435. description = [[tag description] retain];
  436. return object;
  437. };
  438. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithBaseURL:[self.testBundle resourceURL]];
  439. GRMustacheTemplate *template = [repository templateNamed:@"GRMustacheTagDelegateTest" error:NULL];
  440. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  441. [template renderObject:nil error:NULL];
  442. STAssertNotNil(description, @"");
  443. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  444. STAssertTrue(range.location != NSNotFound, @"");
  445. }
  446. }
  447. - (void)testTagDescriptionContainsPathBasedTemplatePath
  448. {
  449. {
  450. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  451. __block NSString *description = nil;
  452. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  453. [description release];
  454. description = [[tag description] retain];
  455. return object;
  456. };
  457. GRMustacheTemplate *template = [GRMustacheTemplate templateFromContentsOfFile:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"] error:NULL];
  458. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  459. [template renderObject:nil error:NULL];
  460. STAssertNotNil(description, @"");
  461. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  462. STAssertTrue(range.location != NSNotFound, @"");
  463. }
  464. {
  465. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  466. __block NSString *description = nil;
  467. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  468. [description release];
  469. description = [[tag description] retain];
  470. return object;
  471. };
  472. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithDirectory:[self.testBundle resourcePath]];
  473. GRMustacheTemplate *template = [repository templateNamed:@"GRMustacheTagDelegateTest" error:NULL];
  474. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  475. [template renderObject:nil error:NULL];
  476. STAssertNotNil(description, @"");
  477. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  478. STAssertTrue(range.location != NSNotFound, @"");
  479. }
  480. }
  481. - (void)testTagDescriptionContainsResourceBasedPartialPath
  482. {
  483. {
  484. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  485. __block NSString *description = nil;
  486. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  487. [description release];
  488. description = [[tag description] retain];
  489. return object;
  490. };
  491. GRMustacheTemplate *template = [GRMustacheTemplate templateFromResource:@"GRMustacheTagDelegateTest_wrapper" bundle:self.testBundle error:NULL];
  492. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  493. [template renderObject:nil error:NULL];
  494. STAssertNotNil(description, @"");
  495. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  496. STAssertTrue(range.location != NSNotFound, @"");
  497. }
  498. {
  499. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  500. __block NSString *description = nil;
  501. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  502. [description release];
  503. description = [[tag description] retain];
  504. return object;
  505. };
  506. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithBundle:self.testBundle];
  507. GRMustacheTemplate *template = [repository templateNamed:@"GRMustacheTagDelegateTest_wrapper" error:NULL];
  508. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  509. [template renderObject:nil error:NULL];
  510. STAssertNotNil(description, @"");
  511. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  512. STAssertTrue(range.location != NSNotFound, @"");
  513. }
  514. {
  515. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  516. __block NSString *description = nil;
  517. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  518. [description release];
  519. description = [[tag description] retain];
  520. return object;
  521. };
  522. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithBundle:self.testBundle];
  523. GRMustacheTemplate *template = [repository templateFromString:@"{{>GRMustacheTagDelegateTest}}" error:NULL];
  524. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  525. [template renderObject:nil error:NULL];
  526. STAssertNotNil(description, @"");
  527. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  528. STAssertTrue(range.location != NSNotFound, @"");
  529. }
  530. }
  531. - (void)testTagDescriptionContainsURLBasedPartialPath
  532. {
  533. {
  534. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  535. __block NSString *description = nil;
  536. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  537. [description release];
  538. description = [[tag description] retain];
  539. return object;
  540. };
  541. GRMustacheTemplate *template = [GRMustacheTemplate templateFromContentsOfURL:[self.testBundle URLForResource:@"GRMustacheTagDelegateTest_wrapper" withExtension:@"mustache"] error:NULL];
  542. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  543. [template renderObject:nil error:NULL];
  544. STAssertNotNil(description, @"");
  545. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  546. STAssertTrue(range.location != NSNotFound, @"");
  547. }
  548. {
  549. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  550. __block NSString *description = nil;
  551. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  552. [description release];
  553. description = [[tag description] retain];
  554. return object;
  555. };
  556. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithBaseURL:[self.testBundle resourceURL]];
  557. GRMustacheTemplate *template = [repository templateNamed:@"GRMustacheTagDelegateTest_wrapper" error:NULL];
  558. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  559. [template renderObject:nil error:NULL];
  560. STAssertNotNil(description, @"");
  561. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  562. STAssertTrue(range.location != NSNotFound, @"");
  563. }
  564. {
  565. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  566. __block NSString *description = nil;
  567. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  568. [description release];
  569. description = [[tag description] retain];
  570. return object;
  571. };
  572. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithBaseURL:[self.testBundle resourceURL]];
  573. GRMustacheTemplate *template = [repository templateFromString:@"{{>GRMustacheTagDelegateTest}}" error:NULL];
  574. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  575. [template renderObject:nil error:NULL];
  576. STAssertNotNil(description, @"");
  577. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  578. STAssertTrue(range.location != NSNotFound, @"");
  579. }
  580. }
  581. - (void)testTagDescriptionContainsPathBasedPartialPath
  582. {
  583. {
  584. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  585. __block NSString *description = nil;
  586. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  587. [description release];
  588. description = [[tag description] retain];
  589. return object;
  590. };
  591. GRMustacheTemplate *template = [GRMustacheTemplate templateFromContentsOfFile:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest_wrapper" ofType:@"mustache"] error:NULL];
  592. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  593. [template renderObject:nil error:NULL];
  594. STAssertNotNil(description, @"");
  595. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  596. STAssertTrue(range.location != NSNotFound, @"");
  597. }
  598. {
  599. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  600. __block NSString *description = nil;
  601. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  602. [description release];
  603. description = [[tag description] retain];
  604. return object;
  605. };
  606. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithDirectory:[self.testBundle resourcePath]];
  607. GRMustacheTemplate *template = [repository templateNamed:@"GRMustacheTagDelegateTest_wrapper" error:NULL];
  608. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  609. [template renderObject:nil error:NULL];
  610. STAssertNotNil(description, @"");
  611. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  612. STAssertTrue(range.location != NSNotFound, @"");
  613. }
  614. {
  615. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  616. __block NSString *description = nil;
  617. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  618. [description release];
  619. description = [[tag description] retain];
  620. return object;
  621. };
  622. GRMustacheTemplateRepository *repository = [GRMustacheTemplateRepository templateRepositoryWithDirectory:[self.testBundle resourcePath]];
  623. GRMustacheTemplate *template = [repository templateFromString:@"{{>GRMustacheTagDelegateTest}}" error:NULL];
  624. template.baseContext = [template.baseContext contextByAddingTagDelegate:delegate];
  625. [template renderObject:nil error:NULL];
  626. STAssertNotNil(description, @"");
  627. NSRange range = [description rangeOfString:[self.testBundle pathForResource:@"GRMustacheTagDelegateTest" ofType:@"mustache"]];
  628. STAssertTrue(range.location != NSNotFound, @"");
  629. }
  630. }
  631. - (void)testTagDelegateOnSection
  632. {
  633. GRMustacheTestingDelegate *delegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  634. __block GRMustacheTagType preRenderingTagType = -1;
  635. __block GRMustacheTagType postRenderingTagType = -1;
  636. __block id preRenderedObjet = nil;
  637. __block id postRenderedObjet = nil;
  638. delegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  639. preRenderedObjet = object;
  640. preRenderingTagType = tag.type;
  641. return @"delegate";
  642. };
  643. delegate.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  644. postRenderedObjet = object;
  645. postRenderingTagType = tag.type;
  646. };
  647. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#delegate}}{{value}}{{/delegate}}" error:NULL];
  648. NSString *rendering = [template renderObject:@{@"delegate":delegate, @"value":@"foo"} error:NULL];
  649. STAssertEqualObjects(rendering, @"delegate", @"");
  650. STAssertEquals(preRenderingTagType, GRMustacheTagTypeVariable, @"");
  651. STAssertEquals(postRenderingTagType, GRMustacheTagTypeVariable, @"");
  652. STAssertEqualObjects(preRenderedObjet, @"foo", @"");
  653. STAssertEqualObjects(postRenderedObjet, @"delegate", @"");
  654. }
  655. - (void)testTagDelegateOrdering
  656. {
  657. GRMustacheTestingDelegate *uppercaseDelegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  658. uppercaseDelegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  659. if ([object isKindOfClass:[NSString class]]) {
  660. return [[object description] uppercaseString];
  661. }
  662. return object;
  663. };
  664. GRMustacheTestingDelegate *prefixDelegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  665. prefixDelegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  666. if ([object isKindOfClass:[NSString class]]) {
  667. return [NSString stringWithFormat:@"prefix%@", object];
  668. }
  669. return object;
  670. };
  671. GRMustacheTestingDelegate *wrapDelegate = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  672. wrapDelegate.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  673. if ([object isKindOfClass:[NSString class]]) {
  674. return [NSString stringWithFormat:@"(%@)", object];
  675. }
  676. return object;
  677. };
  678. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#prefix}}{{value}} {{#uppercase}}{{value}}{{/uppercase}}{{/prefix}} {{#uppercase}}{{value}} {{#prefix}}{{value}}{{/prefix}}{{/uppercase}} {{value}}" error:NULL];
  679. template.baseContext = [template.baseContext contextByAddingTagDelegate:wrapDelegate];
  680. NSString *rendering = [template renderObject:@{@"prefix":prefixDelegate, @"uppercase":uppercaseDelegate, @"value":@"foo"} error:NULL];
  681. STAssertEqualObjects(rendering, @"(prefixfoo) (prefixFOO) (FOO) (PREFIXFOO) (foo)", @"");
  682. }
  683. - (void)testTagDelegatePreAndPostHooksConsistency
  684. {
  685. GRMustacheTestingDelegate *delegate1 = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  686. delegate1.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  687. return @"1";
  688. };
  689. delegate1.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  690. STAssertEqualObjects(object, @"1", @"");
  691. };
  692. GRMustacheTestingDelegate *delegate2 = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  693. delegate2.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) {
  694. return @"2";
  695. };
  696. delegate2.mustacheTagDidRenderBlock = ^(GRMustacheTag *tag, id object, NSString *rendering) {
  697. STAssertEqualObjects(object, @"2", @"");
  698. };
  699. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#d1}}{{#d2}}{{value}}{{/}}{{/}} {{#d2}}{{#d1}}{{value}}{{/}}{{/}}" error:NULL];
  700. [template renderObject:@{@"d1":delegate1, @"d2":delegate2} error:NULL];
  701. }
  702. - (void)testArrayOfTagDelegatesInSectionTag
  703. {
  704. __block BOOL delegate1HasBeenInvoked = NO;
  705. GRMustacheTestingDelegate *delegate1 = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  706. delegate1.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) { delegate1HasBeenInvoked = YES; return object; };
  707. __block BOOL delegate2HasBeenInvoked = NO;
  708. GRMustacheTestingDelegate *delegate2 = [[[GRMustacheTestingDelegate alloc] init] autorelease];
  709. delegate2.mustacheTagWillRenderBlock = ^id(GRMustacheTag *tag, id object) { delegate2HasBeenInvoked = YES; return object; };
  710. id items = @{@"items": @[delegate1, delegate2] };
  711. [[GRMustacheTemplate templateFromString:@"{{#items}}{{.}}{{/items}}" error:NULL] renderObject:items error:NULL];
  712. STAssertTrue(delegate1HasBeenInvoked, @"");
  713. STAssertTrue(delegate2HasBeenInvoked, @"");
  714. }
  715. @end