/src/tests/Public/v6.4/GRMustacheNSFormatterTest.m

https://github.com/oleganza/GRMustache · Objective C · 381 lines · 285 code · 53 blank · 43 comment · 0 complexity · 22235f51ffb09e824363a04859d96ee3 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_4
  23. #import "GRMustachePublicAPITest.h"
  24. @interface GRMustacheNSFormatterTest : GRMustachePublicAPITest
  25. @end
  26. @implementation GRMustacheNSFormatterTest
  27. - (void)testFormatterIsAFilterForProcessableValues
  28. {
  29. NSNumberFormatter *percentFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  30. percentFormatter.numberStyle = NSNumberFormatterPercentStyle;
  31. percentFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
  32. // test that number is processable
  33. NSNumber *number = [NSNumber numberWithFloat:0.5];
  34. STAssertEqualObjects([percentFormatter stringFromNumber:number], @"50%", @"");
  35. // test filtering a number
  36. id data = @{ @"number": number, @"percent": percentFormatter };
  37. NSString *rendering = [GRMustacheTemplate renderObject:data
  38. fromString:@"{{ percent(number) }}"
  39. error:NULL];
  40. STAssertEqualObjects(rendering, @"50%", @"");
  41. }
  42. - (void)testFormatterIsAFilterForUnprocessableValues
  43. {
  44. NSNumberFormatter *percentFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  45. percentFormatter.numberStyle = NSNumberFormatterPercentStyle;
  46. percentFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
  47. // test that string is unprocessable
  48. NSString *unprocessableValue = @"foo";
  49. STAssertNil([percentFormatter stringForObjectValue:unprocessableValue], @"");
  50. // test filtering a string
  51. id data = @{ @"value": unprocessableValue, @"percent": percentFormatter };
  52. NSString *rendering = [GRMustacheTemplate renderObject:data
  53. fromString:@"{{ percent(value) }}"
  54. error:NULL];
  55. STAssertEqualObjects(rendering, @"", @"");
  56. }
  57. - (void)testFormatterSectionFormatsInnerVariableTags
  58. {
  59. NSNumberFormatter *percentFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  60. percentFormatter.numberStyle = NSNumberFormatterPercentStyle;
  61. percentFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
  62. NSNumber *number = [NSNumber numberWithFloat:0.5];
  63. id data = @{ @"number": number, @"percent": percentFormatter };
  64. NSString *rendering = [GRMustacheTemplate renderObject:data
  65. fromString:@"{{# percent }}{{ number }} {{ number }}{{/ percent }}"
  66. error:NULL];
  67. STAssertEqualObjects(rendering, @"50% 50%", @"");
  68. }
  69. - (void)testFormatterSectionDoesNotFormatUnprocessableInnerVariableTags
  70. {
  71. NSNumberFormatter *percentFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  72. percentFormatter.numberStyle = NSNumberFormatterPercentStyle;
  73. percentFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
  74. // test that string is unprocessable
  75. NSString *unprocessableValue = @"foo";
  76. STAssertNil([percentFormatter stringForObjectValue:unprocessableValue], @"");
  77. // test filtering a string
  78. id data = @{ @"value": unprocessableValue, @"percent": percentFormatter };
  79. NSString *rendering = [GRMustacheTemplate renderObject:data
  80. fromString:@"{{# percent }}{{ value }}{{/ percent }}"
  81. error:NULL];
  82. STAssertEqualObjects(rendering, @"foo", @"");
  83. }
  84. - (void)testFormatterAsSectionFormatsDeepInnerVariableTags
  85. {
  86. NSNumberFormatter *percentFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  87. percentFormatter.numberStyle = NSNumberFormatterPercentStyle;
  88. percentFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
  89. NSNumber *number = [NSNumber numberWithFloat:0.5];
  90. STAssertEqualObjects([percentFormatter stringFromNumber:number], @"50%", @"");
  91. id data = @{ @"number": number, @"percent": percentFormatter };
  92. NSString *rendering = [GRMustacheTemplate renderObject:data
  93. fromString:@"{{# percent }}{{# number }}Number is {{ number }}.{{/ number }}{{/ percent }}"
  94. error:NULL];
  95. STAssertEqualObjects(rendering, @"Number is 50%.", @"");
  96. }
  97. - (void)testFormatterAsSectionDoesNotFormatInnerSectionTags
  98. {
  99. NSNumberFormatter *percentFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  100. percentFormatter.numberStyle = NSNumberFormatterPercentStyle;
  101. percentFormatter.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
  102. NSNumber *number = [NSNumber numberWithFloat:0.5];
  103. STAssertEqualObjects([percentFormatter stringFromNumber:number], @"50%", @"");
  104. id data = @{ @"number": number, @"percent": percentFormatter, @"NO": [NSNumber numberWithBool:NO] };
  105. NSString *rendering = [GRMustacheTemplate renderObject:data
  106. fromString:@"NO is {{ NO }}. {{^ NO }}NO is false.{{/ NO }} percent(NO) is {{ percent(NO) }}. {{# percent(NO) }}percent(NO) is true.{{/ percent(NO) }} {{# percent }}{{^ NO }}NO is now {{ NO }} and is still false.{{/ NO }}{{/ percent }}"
  107. error:NULL];
  108. STAssertEqualObjects(rendering, @"NO is 0. NO is false. percent(NO) is 0%. percent(NO) is true. NO is now 0% and is still false.", @"");
  109. }
  110. - (void)testFormatterIsTruthy
  111. {
  112. NSFormatter *formatter = [[[NSFormatter alloc] init] autorelease];
  113. id data = @{ @"formatter": formatter };
  114. NSString *rendering = [GRMustacheTemplate renderObject:data
  115. fromString:@"{{# formatter }}Formatter is true.{{/ formatter }}{{^ formatter }}Formatter is false.{{/ formatter }}"
  116. error:NULL];
  117. STAssertEqualObjects(rendering, @"Formatter is true.", @"");
  118. }
  119. - (void)testFormatterRendersSelfAsSomething
  120. {
  121. NSFormatter *formatter = [[[NSFormatter alloc] init] autorelease];
  122. id data = @{ @"formatter": formatter };
  123. NSString *rendering = [GRMustacheTemplate renderObject:data
  124. fromString:@"{{ formatter }}"
  125. error:NULL];
  126. STAssertTrue(rendering.length > 0, @"");
  127. }
  128. - (void)testNumberFormatterRendersNothingForNil
  129. {
  130. // Check that NSNumberFormatter does not have surprising behavior, and
  131. // does not format nil.
  132. NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
  133. formatter.numberStyle = NSNumberFormatterPercentStyle;
  134. id data = @{ @"format":formatter };
  135. {
  136. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  137. NSString *rendering = [template renderObject:data error:NULL];
  138. STAssertEqualObjects(rendering, @"<>", @"");
  139. }
  140. {
  141. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  142. NSString *rendering = [template renderObject:data error:NULL];
  143. STAssertEqualObjects(rendering, @"NO", @"");
  144. }
  145. }
  146. - (void)testNumberFormatterRendersNothingForNSNull
  147. {
  148. // Check that NSNumberFormatter does not have surprising behavior, and
  149. // does not format NSNull.
  150. NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
  151. formatter.numberStyle = NSNumberFormatterPercentStyle;
  152. id data = @{ @"format":formatter, @"value": [NSNull null] };
  153. {
  154. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  155. NSString *rendering = [template renderObject:data error:NULL];
  156. STAssertEqualObjects(rendering, @"<>", @"");
  157. }
  158. {
  159. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  160. NSString *rendering = [template renderObject:data error:NULL];
  161. STAssertEqualObjects(rendering, @"NO", @"");
  162. }
  163. }
  164. - (void)testNumberFormatterRendersNothingForNSString
  165. {
  166. // Check that NSNumberFormatter does not have surprising behavior, and
  167. // does not format NSString.
  168. NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
  169. formatter.numberStyle = NSNumberFormatterPercentStyle;
  170. {
  171. id data = @{ @"format":formatter, @"value":@"1" };
  172. {
  173. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  174. NSString *rendering = [template renderObject:data error:NULL];
  175. STAssertEqualObjects(rendering, @"<>", @"");
  176. }
  177. {
  178. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  179. NSString *rendering = [template renderObject:data error:NULL];
  180. STAssertEqualObjects(rendering, @"NO", @"");
  181. }
  182. }
  183. {
  184. id data = @{ @"format":formatter, @"value":@"YES" };
  185. {
  186. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  187. NSString *rendering = [template renderObject:data error:NULL];
  188. STAssertEqualObjects(rendering, @"<>", @"");
  189. }
  190. {
  191. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  192. NSString *rendering = [template renderObject:data error:NULL];
  193. STAssertEqualObjects(rendering, @"NO", @"");
  194. }
  195. }
  196. {
  197. id data = @{ @"format":formatter, @"value":@"foo" };
  198. {
  199. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  200. NSString *rendering = [template renderObject:data error:NULL];
  201. STAssertEqualObjects(rendering, @"<>", @"");
  202. }
  203. {
  204. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  205. NSString *rendering = [template renderObject:data error:NULL];
  206. STAssertEqualObjects(rendering, @"NO", @"");
  207. }
  208. }
  209. }
  210. - (void)testNumberFormatterRendersNothingForNSDate
  211. {
  212. // Check that NSNumberFormatter does not have surprising behavior, and
  213. // does not format NSDate.
  214. NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
  215. formatter.numberStyle = NSNumberFormatterPercentStyle;
  216. id data = @{ @"format":formatter, @"value": [NSDate date] };
  217. {
  218. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  219. NSString *rendering = [template renderObject:data error:NULL];
  220. STAssertEqualObjects(rendering, @"<>", @"");
  221. }
  222. {
  223. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  224. NSString *rendering = [template renderObject:data error:NULL];
  225. STAssertEqualObjects(rendering, @"NO", @"");
  226. }
  227. }
  228. - (void)testDateFormatterRendersNothingForNil
  229. {
  230. // Check that NSDateFormatter does not have surprising behavior, and
  231. // does not format nil.
  232. NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
  233. formatter.dateStyle = NSDateFormatterFullStyle;
  234. id data = @{ @"format":formatter };
  235. {
  236. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  237. NSString *rendering = [template renderObject:data error:NULL];
  238. STAssertEqualObjects(rendering, @"<>", @"");
  239. }
  240. {
  241. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  242. NSString *rendering = [template renderObject:data error:NULL];
  243. STAssertEqualObjects(rendering, @"NO", @"");
  244. }
  245. }
  246. - (void)testDateFormatterRendersNothingForNSNull
  247. {
  248. // Check that NSDateFormatter does not have surprising behavior, and
  249. // does not format NSNull.
  250. NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
  251. formatter.dateStyle = NSDateFormatterFullStyle;
  252. id data = @{ @"format":formatter, @"value": [NSNull null] };
  253. {
  254. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  255. NSString *rendering = [template renderObject:data error:NULL];
  256. STAssertEqualObjects(rendering, @"<>", @"");
  257. }
  258. {
  259. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  260. NSString *rendering = [template renderObject:data error:NULL];
  261. STAssertEqualObjects(rendering, @"NO", @"");
  262. }
  263. }
  264. - (void)testDateFormatterRendersNothingForNSString
  265. {
  266. // Check that NSDateFormatter does not have surprising behavior, and
  267. // does not format NSString.
  268. NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
  269. formatter.dateStyle = NSDateFormatterFullStyle;
  270. {
  271. id data = @{ @"format":formatter, @"value":@"1" };
  272. {
  273. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  274. NSString *rendering = [template renderObject:data error:NULL];
  275. STAssertEqualObjects(rendering, @"<>", @"");
  276. }
  277. {
  278. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  279. NSString *rendering = [template renderObject:data error:NULL];
  280. STAssertEqualObjects(rendering, @"NO", @"");
  281. }
  282. }
  283. {
  284. id data = @{ @"format":formatter, @"value":@"YES" };
  285. {
  286. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  287. NSString *rendering = [template renderObject:data error:NULL];
  288. STAssertEqualObjects(rendering, @"<>", @"");
  289. }
  290. {
  291. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  292. NSString *rendering = [template renderObject:data error:NULL];
  293. STAssertEqualObjects(rendering, @"NO", @"");
  294. }
  295. }
  296. {
  297. id data = @{ @"format":formatter, @"value":@"foo" };
  298. {
  299. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  300. NSString *rendering = [template renderObject:data error:NULL];
  301. STAssertEqualObjects(rendering, @"<>", @"");
  302. }
  303. {
  304. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  305. NSString *rendering = [template renderObject:data error:NULL];
  306. STAssertEqualObjects(rendering, @"NO", @"");
  307. }
  308. }
  309. }
  310. - (void)testDateFormatterRendersNothingForNSNumber
  311. {
  312. // Check that NSDateFormatter does not have surprising behavior, and
  313. // does not format NSNumber.
  314. NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
  315. formatter.dateStyle = NSDateFormatterFullStyle;
  316. id data = @{ @"format":formatter, @"value": [NSNumber numberWithInteger:0] };
  317. {
  318. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"<{{format(value)}}>" error:NULL];
  319. NSString *rendering = [template renderObject:data error:NULL];
  320. STAssertEqualObjects(rendering, @"<>", @"");
  321. }
  322. {
  323. GRMustacheTemplate *template = [GRMustacheTemplate templateFromString:@"{{#format(value)}}YES{{/}}{{^format(value)}}NO{{/}}" error:NULL];
  324. NSString *rendering = [template renderObject:data error:NULL];
  325. STAssertEqualObjects(rendering, @"NO", @"");
  326. }
  327. }
  328. @end