liquid 3.0.6 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +154 -58
  3. data/{MIT-LICENSE → LICENSE} +0 -0
  4. data/README.md +33 -0
  5. data/lib/liquid/block.rb +42 -125
  6. data/lib/liquid/block_body.rb +99 -79
  7. data/lib/liquid/condition.rb +52 -32
  8. data/lib/liquid/context.rb +57 -51
  9. data/lib/liquid/document.rb +19 -9
  10. data/lib/liquid/drop.rb +17 -16
  11. data/lib/liquid/errors.rb +20 -24
  12. data/lib/liquid/expression.rb +26 -10
  13. data/lib/liquid/extensions.rb +19 -7
  14. data/lib/liquid/file_system.rb +11 -11
  15. data/lib/liquid/forloop_drop.rb +42 -0
  16. data/lib/liquid/i18n.rb +6 -6
  17. data/lib/liquid/interrupts.rb +1 -2
  18. data/lib/liquid/lexer.rb +12 -8
  19. data/lib/liquid/locales/en.yml +6 -2
  20. data/lib/liquid/parse_context.rb +38 -0
  21. data/lib/liquid/parse_tree_visitor.rb +42 -0
  22. data/lib/liquid/parser_switching.rb +4 -4
  23. data/lib/liquid/profiler/hooks.rb +7 -7
  24. data/lib/liquid/profiler.rb +18 -19
  25. data/lib/liquid/range_lookup.rb +16 -1
  26. data/lib/liquid/resource_limits.rb +23 -0
  27. data/lib/liquid/standardfilters.rb +207 -61
  28. data/lib/liquid/strainer.rb +15 -8
  29. data/lib/liquid/tablerowloop_drop.rb +62 -0
  30. data/lib/liquid/tag.rb +9 -8
  31. data/lib/liquid/tags/assign.rb +25 -4
  32. data/lib/liquid/tags/break.rb +0 -3
  33. data/lib/liquid/tags/capture.rb +1 -1
  34. data/lib/liquid/tags/case.rb +27 -12
  35. data/lib/liquid/tags/comment.rb +2 -2
  36. data/lib/liquid/tags/cycle.rb +16 -8
  37. data/lib/liquid/tags/decrement.rb +1 -4
  38. data/lib/liquid/tags/for.rb +103 -75
  39. data/lib/liquid/tags/if.rb +60 -44
  40. data/lib/liquid/tags/ifchanged.rb +0 -2
  41. data/lib/liquid/tags/include.rb +71 -51
  42. data/lib/liquid/tags/raw.rb +32 -4
  43. data/lib/liquid/tags/table_row.rb +21 -31
  44. data/lib/liquid/tags/unless.rb +3 -4
  45. data/lib/liquid/template.rb +42 -54
  46. data/lib/liquid/tokenizer.rb +31 -0
  47. data/lib/liquid/truffle.rb +5 -0
  48. data/lib/liquid/utils.rb +52 -8
  49. data/lib/liquid/variable.rb +59 -46
  50. data/lib/liquid/variable_lookup.rb +14 -6
  51. data/lib/liquid/version.rb +2 -1
  52. data/lib/liquid.rb +10 -7
  53. data/test/integration/assign_test.rb +8 -8
  54. data/test/integration/blank_test.rb +14 -14
  55. data/test/integration/block_test.rb +12 -0
  56. data/test/integration/context_test.rb +2 -2
  57. data/test/integration/document_test.rb +19 -0
  58. data/test/integration/drop_test.rb +42 -40
  59. data/test/integration/error_handling_test.rb +96 -43
  60. data/test/integration/filter_test.rb +60 -20
  61. data/test/integration/hash_ordering_test.rb +9 -9
  62. data/test/integration/output_test.rb +26 -27
  63. data/test/integration/parse_tree_visitor_test.rb +247 -0
  64. data/test/integration/parsing_quirks_test.rb +19 -13
  65. data/test/integration/render_profiling_test.rb +20 -20
  66. data/test/integration/security_test.rb +23 -7
  67. data/test/integration/standard_filter_test.rb +426 -46
  68. data/test/integration/tags/break_tag_test.rb +1 -2
  69. data/test/integration/tags/continue_tag_test.rb +0 -1
  70. data/test/integration/tags/for_tag_test.rb +135 -100
  71. data/test/integration/tags/if_else_tag_test.rb +75 -77
  72. data/test/integration/tags/include_tag_test.rb +50 -31
  73. data/test/integration/tags/increment_tag_test.rb +10 -11
  74. data/test/integration/tags/raw_tag_test.rb +7 -1
  75. data/test/integration/tags/standard_tag_test.rb +121 -122
  76. data/test/integration/tags/statements_test.rb +3 -5
  77. data/test/integration/tags/table_row_test.rb +20 -19
  78. data/test/integration/tags/unless_else_tag_test.rb +6 -6
  79. data/test/integration/template_test.rb +199 -49
  80. data/test/integration/trim_mode_test.rb +529 -0
  81. data/test/integration/variable_test.rb +27 -13
  82. data/test/test_helper.rb +33 -6
  83. data/test/truffle/truffle_test.rb +9 -0
  84. data/test/unit/block_unit_test.rb +8 -5
  85. data/test/unit/condition_unit_test.rb +94 -77
  86. data/test/unit/context_unit_test.rb +69 -72
  87. data/test/unit/file_system_unit_test.rb +3 -3
  88. data/test/unit/i18n_unit_test.rb +2 -2
  89. data/test/unit/lexer_unit_test.rb +12 -9
  90. data/test/unit/parser_unit_test.rb +2 -2
  91. data/test/unit/regexp_unit_test.rb +1 -1
  92. data/test/unit/strainer_unit_test.rb +96 -1
  93. data/test/unit/tag_unit_test.rb +7 -2
  94. data/test/unit/tags/case_tag_unit_test.rb +1 -1
  95. data/test/unit/tags/for_tag_unit_test.rb +2 -2
  96. data/test/unit/tags/if_tag_unit_test.rb +1 -1
  97. data/test/unit/template_unit_test.rb +14 -5
  98. data/test/unit/tokenizer_unit_test.rb +24 -7
  99. data/test/unit/variable_unit_test.rb +60 -43
  100. metadata +62 -50
  101. data/lib/liquid/module_ex.rb +0 -62
  102. data/lib/liquid/token.rb +0 -18
  103. data/test/unit/module_ex_unit_test.rb +0 -87
@@ -0,0 +1,529 @@
1
+ require 'test_helper'
2
+
3
+ class TrimModeTest < Minitest::Test
4
+ include Liquid
5
+
6
+ # Make sure the trim isn't applied to standard output
7
+ def test_standard_output
8
+ text = <<-END_TEMPLATE
9
+ <div>
10
+ <p>
11
+ {{ 'John' }}
12
+ </p>
13
+ </div>
14
+ END_TEMPLATE
15
+ expected = <<-END_EXPECTED
16
+ <div>
17
+ <p>
18
+ John
19
+ </p>
20
+ </div>
21
+ END_EXPECTED
22
+ assert_template_result(expected, text)
23
+ end
24
+
25
+ def test_variable_output_with_multiple_blank_lines
26
+ text = <<-END_TEMPLATE
27
+ <div>
28
+ <p>
29
+
30
+
31
+ {{- 'John' -}}
32
+
33
+
34
+ </p>
35
+ </div>
36
+ END_TEMPLATE
37
+ expected = <<-END_EXPECTED
38
+ <div>
39
+ <p>John</p>
40
+ </div>
41
+ END_EXPECTED
42
+ assert_template_result(expected, text)
43
+ end
44
+
45
+ def test_tag_output_with_multiple_blank_lines
46
+ text = <<-END_TEMPLATE
47
+ <div>
48
+ <p>
49
+
50
+
51
+ {%- if true -%}
52
+ yes
53
+ {%- endif -%}
54
+
55
+
56
+ </p>
57
+ </div>
58
+ END_TEMPLATE
59
+ expected = <<-END_EXPECTED
60
+ <div>
61
+ <p>yes</p>
62
+ </div>
63
+ END_EXPECTED
64
+ assert_template_result(expected, text)
65
+ end
66
+
67
+ # Make sure the trim isn't applied to standard tags
68
+ def test_standard_tags
69
+ whitespace = ' '
70
+ text = <<-END_TEMPLATE
71
+ <div>
72
+ <p>
73
+ {% if true %}
74
+ yes
75
+ {% endif %}
76
+ </p>
77
+ </div>
78
+ END_TEMPLATE
79
+ expected = <<-END_EXPECTED
80
+ <div>
81
+ <p>
82
+ #{whitespace}
83
+ yes
84
+ #{whitespace}
85
+ </p>
86
+ </div>
87
+ END_EXPECTED
88
+ assert_template_result(expected, text)
89
+
90
+ text = <<-END_TEMPLATE
91
+ <div>
92
+ <p>
93
+ {% if false %}
94
+ no
95
+ {% endif %}
96
+ </p>
97
+ </div>
98
+ END_TEMPLATE
99
+ expected = <<-END_EXPECTED
100
+ <div>
101
+ <p>
102
+ #{whitespace}
103
+ </p>
104
+ </div>
105
+ END_EXPECTED
106
+ assert_template_result(expected, text)
107
+ end
108
+
109
+ # Make sure the trim isn't too agressive
110
+ def test_no_trim_output
111
+ text = '<p>{{- \'John\' -}}</p>'
112
+ expected = '<p>John</p>'
113
+ assert_template_result(expected, text)
114
+ end
115
+
116
+ # Make sure the trim isn't too agressive
117
+ def test_no_trim_tags
118
+ text = '<p>{%- if true -%}yes{%- endif -%}</p>'
119
+ expected = '<p>yes</p>'
120
+ assert_template_result(expected, text)
121
+
122
+ text = '<p>{%- if false -%}no{%- endif -%}</p>'
123
+ expected = '<p></p>'
124
+ assert_template_result(expected, text)
125
+ end
126
+
127
+ def test_single_line_outer_tag
128
+ text = '<p> {%- if true %} yes {% endif -%} </p>'
129
+ expected = '<p> yes </p>'
130
+ assert_template_result(expected, text)
131
+
132
+ text = '<p> {%- if false %} no {% endif -%} </p>'
133
+ expected = '<p></p>'
134
+ assert_template_result(expected, text)
135
+ end
136
+
137
+ def test_single_line_inner_tag
138
+ text = '<p> {% if true -%} yes {%- endif %} </p>'
139
+ expected = '<p> yes </p>'
140
+ assert_template_result(expected, text)
141
+
142
+ text = '<p> {% if false -%} no {%- endif %} </p>'
143
+ expected = '<p> </p>'
144
+ assert_template_result(expected, text)
145
+ end
146
+
147
+ def test_single_line_post_tag
148
+ text = '<p> {% if true -%} yes {% endif -%} </p>'
149
+ expected = '<p> yes </p>'
150
+ assert_template_result(expected, text)
151
+
152
+ text = '<p> {% if false -%} no {% endif -%} </p>'
153
+ expected = '<p> </p>'
154
+ assert_template_result(expected, text)
155
+ end
156
+
157
+ def test_single_line_pre_tag
158
+ text = '<p> {%- if true %} yes {%- endif %} </p>'
159
+ expected = '<p> yes </p>'
160
+ assert_template_result(expected, text)
161
+
162
+ text = '<p> {%- if false %} no {%- endif %} </p>'
163
+ expected = '<p> </p>'
164
+ assert_template_result(expected, text)
165
+ end
166
+
167
+ def test_pre_trim_output
168
+ text = <<-END_TEMPLATE
169
+ <div>
170
+ <p>
171
+ {{- 'John' }}
172
+ </p>
173
+ </div>
174
+ END_TEMPLATE
175
+ expected = <<-END_EXPECTED
176
+ <div>
177
+ <p>John
178
+ </p>
179
+ </div>
180
+ END_EXPECTED
181
+ assert_template_result(expected, text)
182
+ end
183
+
184
+ def test_pre_trim_tags
185
+ text = <<-END_TEMPLATE
186
+ <div>
187
+ <p>
188
+ {%- if true %}
189
+ yes
190
+ {%- endif %}
191
+ </p>
192
+ </div>
193
+ END_TEMPLATE
194
+ expected = <<-END_EXPECTED
195
+ <div>
196
+ <p>
197
+ yes
198
+ </p>
199
+ </div>
200
+ END_EXPECTED
201
+ assert_template_result(expected, text)
202
+
203
+ text = <<-END_TEMPLATE
204
+ <div>
205
+ <p>
206
+ {%- if false %}
207
+ no
208
+ {%- endif %}
209
+ </p>
210
+ </div>
211
+ END_TEMPLATE
212
+ expected = <<-END_EXPECTED
213
+ <div>
214
+ <p>
215
+ </p>
216
+ </div>
217
+ END_EXPECTED
218
+ assert_template_result(expected, text)
219
+ end
220
+
221
+ def test_post_trim_output
222
+ text = <<-END_TEMPLATE
223
+ <div>
224
+ <p>
225
+ {{ 'John' -}}
226
+ </p>
227
+ </div>
228
+ END_TEMPLATE
229
+ expected = <<-END_EXPECTED
230
+ <div>
231
+ <p>
232
+ John</p>
233
+ </div>
234
+ END_EXPECTED
235
+ assert_template_result(expected, text)
236
+ end
237
+
238
+ def test_post_trim_tags
239
+ text = <<-END_TEMPLATE
240
+ <div>
241
+ <p>
242
+ {% if true -%}
243
+ yes
244
+ {% endif -%}
245
+ </p>
246
+ </div>
247
+ END_TEMPLATE
248
+ expected = <<-END_EXPECTED
249
+ <div>
250
+ <p>
251
+ yes
252
+ </p>
253
+ </div>
254
+ END_EXPECTED
255
+ assert_template_result(expected, text)
256
+
257
+ text = <<-END_TEMPLATE
258
+ <div>
259
+ <p>
260
+ {% if false -%}
261
+ no
262
+ {% endif -%}
263
+ </p>
264
+ </div>
265
+ END_TEMPLATE
266
+ expected = <<-END_EXPECTED
267
+ <div>
268
+ <p>
269
+ </p>
270
+ </div>
271
+ END_EXPECTED
272
+ assert_template_result(expected, text)
273
+ end
274
+
275
+ def test_pre_and_post_trim_tags
276
+ text = <<-END_TEMPLATE
277
+ <div>
278
+ <p>
279
+ {%- if true %}
280
+ yes
281
+ {% endif -%}
282
+ </p>
283
+ </div>
284
+ END_TEMPLATE
285
+ expected = <<-END_EXPECTED
286
+ <div>
287
+ <p>
288
+ yes
289
+ </p>
290
+ </div>
291
+ END_EXPECTED
292
+ assert_template_result(expected, text)
293
+
294
+ text = <<-END_TEMPLATE
295
+ <div>
296
+ <p>
297
+ {%- if false %}
298
+ no
299
+ {% endif -%}
300
+ </p>
301
+ </div>
302
+ END_TEMPLATE
303
+ expected = <<-END_EXPECTED
304
+ <div>
305
+ <p></p>
306
+ </div>
307
+ END_EXPECTED
308
+ assert_template_result(expected, text)
309
+ end
310
+
311
+ def test_post_and_pre_trim_tags
312
+ text = <<-END_TEMPLATE
313
+ <div>
314
+ <p>
315
+ {% if true -%}
316
+ yes
317
+ {%- endif %}
318
+ </p>
319
+ </div>
320
+ END_TEMPLATE
321
+ expected = <<-END_EXPECTED
322
+ <div>
323
+ <p>
324
+ yes
325
+ </p>
326
+ </div>
327
+ END_EXPECTED
328
+ assert_template_result(expected, text)
329
+
330
+ whitespace = ' '
331
+ text = <<-END_TEMPLATE
332
+ <div>
333
+ <p>
334
+ {% if false -%}
335
+ no
336
+ {%- endif %}
337
+ </p>
338
+ </div>
339
+ END_TEMPLATE
340
+ expected = <<-END_EXPECTED
341
+ <div>
342
+ <p>
343
+ #{whitespace}
344
+ </p>
345
+ </div>
346
+ END_EXPECTED
347
+ assert_template_result(expected, text)
348
+ end
349
+
350
+ def test_trim_output
351
+ text = <<-END_TEMPLATE
352
+ <div>
353
+ <p>
354
+ {{- 'John' -}}
355
+ </p>
356
+ </div>
357
+ END_TEMPLATE
358
+ expected = <<-END_EXPECTED
359
+ <div>
360
+ <p>John</p>
361
+ </div>
362
+ END_EXPECTED
363
+ assert_template_result(expected, text)
364
+ end
365
+
366
+ def test_trim_tags
367
+ text = <<-END_TEMPLATE
368
+ <div>
369
+ <p>
370
+ {%- if true -%}
371
+ yes
372
+ {%- endif -%}
373
+ </p>
374
+ </div>
375
+ END_TEMPLATE
376
+ expected = <<-END_EXPECTED
377
+ <div>
378
+ <p>yes</p>
379
+ </div>
380
+ END_EXPECTED
381
+ assert_template_result(expected, text)
382
+
383
+ text = <<-END_TEMPLATE
384
+ <div>
385
+ <p>
386
+ {%- if false -%}
387
+ no
388
+ {%- endif -%}
389
+ </p>
390
+ </div>
391
+ END_TEMPLATE
392
+ expected = <<-END_EXPECTED
393
+ <div>
394
+ <p></p>
395
+ </div>
396
+ END_EXPECTED
397
+ assert_template_result(expected, text)
398
+ end
399
+
400
+ def test_whitespace_trim_output
401
+ text = <<-END_TEMPLATE
402
+ <div>
403
+ <p>
404
+ {{- 'John' -}},
405
+ {{- '30' -}}
406
+ </p>
407
+ </div>
408
+ END_TEMPLATE
409
+ expected = <<-END_EXPECTED
410
+ <div>
411
+ <p>John,30</p>
412
+ </div>
413
+ END_EXPECTED
414
+ assert_template_result(expected, text)
415
+ end
416
+
417
+ def test_whitespace_trim_tags
418
+ text = <<-END_TEMPLATE
419
+ <div>
420
+ <p>
421
+ {%- if true -%}
422
+ yes
423
+ {%- endif -%}
424
+ </p>
425
+ </div>
426
+ END_TEMPLATE
427
+ expected = <<-END_EXPECTED
428
+ <div>
429
+ <p>yes</p>
430
+ </div>
431
+ END_EXPECTED
432
+ assert_template_result(expected, text)
433
+
434
+ text = <<-END_TEMPLATE
435
+ <div>
436
+ <p>
437
+ {%- if false -%}
438
+ no
439
+ {%- endif -%}
440
+ </p>
441
+ </div>
442
+ END_TEMPLATE
443
+ expected = <<-END_EXPECTED
444
+ <div>
445
+ <p></p>
446
+ </div>
447
+ END_EXPECTED
448
+ assert_template_result(expected, text)
449
+ end
450
+
451
+ def test_complex_trim_output
452
+ text = <<-END_TEMPLATE
453
+ <div>
454
+ <p>
455
+ {{- 'John' -}}
456
+ {{- '30' -}}
457
+ </p>
458
+ <b>
459
+ {{ 'John' -}}
460
+ {{- '30' }}
461
+ </b>
462
+ <i>
463
+ {{- 'John' }}
464
+ {{ '30' -}}
465
+ </i>
466
+ </div>
467
+ END_TEMPLATE
468
+ expected = <<-END_EXPECTED
469
+ <div>
470
+ <p>John30</p>
471
+ <b>
472
+ John30
473
+ </b>
474
+ <i>John
475
+ 30</i>
476
+ </div>
477
+ END_EXPECTED
478
+ assert_template_result(expected, text)
479
+ end
480
+
481
+ def test_complex_trim
482
+ text = <<-END_TEMPLATE
483
+ <div>
484
+ {%- if true -%}
485
+ {%- if true -%}
486
+ <p>
487
+ {{- 'John' -}}
488
+ </p>
489
+ {%- endif -%}
490
+ {%- endif -%}
491
+ </div>
492
+ END_TEMPLATE
493
+ expected = <<-END_EXPECTED
494
+ <div><p>John</p></div>
495
+ END_EXPECTED
496
+ assert_template_result(expected, text)
497
+ end
498
+
499
+ def test_right_trim_followed_by_tag
500
+ assert_template_result('ab c', '{{ "a" -}}{{ "b" }} c')
501
+ end
502
+
503
+ def test_raw_output
504
+ whitespace = ' '
505
+ text = <<-END_TEMPLATE
506
+ <div>
507
+ {% raw %}
508
+ {%- if true -%}
509
+ <p>
510
+ {{- 'John' -}}
511
+ </p>
512
+ {%- endif -%}
513
+ {% endraw %}
514
+ </div>
515
+ END_TEMPLATE
516
+ expected = <<-END_EXPECTED
517
+ <div>
518
+ #{whitespace}
519
+ {%- if true -%}
520
+ <p>
521
+ {{- 'John' -}}
522
+ </p>
523
+ {%- endif -%}
524
+ #{whitespace}
525
+ </div>
526
+ END_EXPECTED
527
+ assert_template_result(expected, text)
528
+ end
529
+ end # TrimModeTest
@@ -4,7 +4,7 @@ class VariableTest < Minitest::Test
4
4
  include Liquid
5
5
 
6
6
  def test_simple_variable
7
- template = Template.parse(%|{{test}}|)
7
+ template = Template.parse(%({{test}}))
8
8
  assert_equal 'worked', template.render!('test' => 'worked')
9
9
  assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully')
10
10
  end
@@ -14,19 +14,29 @@ class VariableTest < Minitest::Test
14
14
  end
15
15
 
16
16
  def test_simple_with_whitespaces
17
- template = Template.parse(%| {{ test }} |)
17
+ template = Template.parse(%( {{ test }} ))
18
18
  assert_equal ' worked ', template.render!('test' => 'worked')
19
19
  assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully')
20
20
  end
21
21
 
22
22
  def test_ignore_unknown
23
- template = Template.parse(%|{{ test }}|)
23
+ template = Template.parse(%({{ test }}))
24
+ assert_equal '', template.render!
25
+ end
26
+
27
+ def test_using_blank_as_variable_name
28
+ template = Template.parse("{% assign foo = blank %}{{ foo }}")
29
+ assert_equal '', template.render!
30
+ end
31
+
32
+ def test_using_empty_as_variable_name
33
+ template = Template.parse("{% assign foo = empty %}{{ foo }}")
24
34
  assert_equal '', template.render!
25
35
  end
26
36
 
27
37
  def test_hash_scoping
28
- template = Template.parse(%|{{ test.test }}|)
29
- assert_equal 'worked', template.render!('test' => {'test' => 'worked'})
38
+ template = Template.parse(%({{ test.test }}))
39
+ assert_equal 'worked', template.render!('test' => { 'test' => 'worked' })
30
40
  end
31
41
 
32
42
  def test_false_renders_as_false
@@ -40,23 +50,23 @@ class VariableTest < Minitest::Test
40
50
  end
41
51
 
42
52
  def test_preset_assigns
43
- template = Template.parse(%|{{ test }}|)
53
+ template = Template.parse(%({{ test }}))
44
54
  template.assigns['test'] = 'worked'
45
55
  assert_equal 'worked', template.render!
46
56
  end
47
57
 
48
58
  def test_reuse_parsed_template
49
- template = Template.parse(%|{{ greeting }} {{ name }}|)
59
+ template = Template.parse(%({{ greeting }} {{ name }}))
50
60
  template.assigns['greeting'] = 'Goodbye'
51
61
  assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi')
52
62
  assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi')
53
63
  assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian')
54
64
  assert_equal 'Goodbye Brian', template.render!('name' => 'Brian')
55
- assert_equal({'greeting'=>'Goodbye'}, template.assigns)
65
+ assert_equal({ 'greeting' => 'Goodbye' }, template.assigns)
56
66
  end
57
67
 
58
68
  def test_assigns_not_polluted_from_template
59
- template = Template.parse(%|{{ test }}{% assign test = 'bar' %}{{ test }}|)
69
+ template = Template.parse(%({{ test }}{% assign test = 'bar' %}{{ test }}))
60
70
  template.assigns['test'] = 'baz'
61
71
  assert_equal 'bazbar', template.render!
62
72
  assert_equal 'bazbar', template.render!
@@ -65,18 +75,22 @@ class VariableTest < Minitest::Test
65
75
  end
66
76
 
67
77
  def test_hash_with_default_proc
68
- template = Template.parse(%|Hello {{ test }}|)
69
- assigns = Hash.new { |h,k| raise "Unknown variable '#{k}'" }
78
+ template = Template.parse(%(Hello {{ test }}))
79
+ assigns = Hash.new { |h, k| raise "Unknown variable '#{k}'" }
70
80
  assigns['test'] = 'Tobi'
71
81
  assert_equal 'Hello Tobi', template.render!(assigns)
72
82
  assigns.delete('test')
73
- e = assert_raises(RuntimeError) {
83
+ e = assert_raises(RuntimeError) do
74
84
  template.render!(assigns)
75
- }
85
+ end
76
86
  assert_equal "Unknown variable 'test'", e.message
77
87
  end
78
88
 
79
89
  def test_multiline_variable
80
90
  assert_equal 'worked', Template.parse("{{\ntest\n}}").render!('test' => 'worked')
81
91
  end
92
+
93
+ def test_render_symbol
94
+ assert_template_result 'bar', '{{ foo }}', 'foo' => :bar
95
+ end
82
96
  end
data/test/test_helper.rb CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  ENV["MT_NO_EXPECTATIONS"] = "1"
4
4
  require 'minitest/autorun'
5
- require 'spy/integration'
6
5
 
7
- $:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.join(File.expand_path(__dir__), '..', 'lib'))
8
7
  require 'liquid.rb'
8
+ require 'liquid/profiler'
9
9
 
10
10
  mode = :strict
11
11
  if env_mode = ENV['LIQUID_PARSER_MODE']
@@ -14,6 +14,11 @@ if env_mode = ENV['LIQUID_PARSER_MODE']
14
14
  end
15
15
  Liquid::Template.error_mode = mode
16
16
 
17
+ if ENV['LIQUID-C'] == '1'
18
+ puts "-- LIQUID C"
19
+ require 'liquid/c'
20
+ end
21
+
17
22
  if Minitest.const_defined?('Test')
18
23
  # We're on Minitest 5+. Nothing to do here.
19
24
  else
@@ -24,7 +29,7 @@ end
24
29
  module Minitest
25
30
  class Test
26
31
  def fixture(name)
27
- File.join(File.expand_path(File.dirname(__FILE__)), "fixtures", name)
32
+ File.join(File.expand_path(__dir__), "fixtures", name)
28
33
  end
29
34
  end
30
35
 
@@ -41,10 +46,10 @@ module Minitest
41
46
  assert_match expected, Template.parse(template).render!(assigns), message
42
47
  end
43
48
 
44
- def assert_match_syntax_error(match, template, registers = {})
45
- exception = assert_raises(Liquid::SyntaxError) {
49
+ def assert_match_syntax_error(match, template, assigns = {})
50
+ exception = assert_raises(Liquid::SyntaxError) do
46
51
  Template.parse(template).render(assigns)
47
- }
52
+ end
48
53
  assert_match match, exception.message
49
54
  end
50
55
 
@@ -87,3 +92,25 @@ class ThingWithToLiquid
87
92
  'foobar'
88
93
  end
89
94
  end
95
+
96
+ class ErrorDrop < Liquid::Drop
97
+ def standard_error
98
+ raise Liquid::StandardError, 'standard error'
99
+ end
100
+
101
+ def argument_error
102
+ raise Liquid::ArgumentError, 'argument error'
103
+ end
104
+
105
+ def syntax_error
106
+ raise Liquid::SyntaxError, 'syntax error'
107
+ end
108
+
109
+ def runtime_error
110
+ raise 'runtime error'
111
+ end
112
+
113
+ def exception
114
+ raise Exception, 'exception'
115
+ end
116
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class TruffleTest < Minitest::Test
4
+ include Liquid
5
+
6
+ def test_truffle_works
7
+
8
+ end
9
+ end