liquid 3.0.6 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -5,116 +5,116 @@ class StandardTagTest < Minitest::Test
5
5
 
6
6
  def test_no_transform
7
7
  assert_template_result('this text should come out of the template without change...',
8
- 'this text should come out of the template without change...')
8
+ 'this text should come out of the template without change...')
9
9
 
10
- assert_template_result('blah','blah')
11
- assert_template_result('<blah>','<blah>')
12
- assert_template_result('|,.:','|,.:')
13
- assert_template_result('','')
10
+ assert_template_result('blah', 'blah')
11
+ assert_template_result('<blah>', '<blah>')
12
+ assert_template_result('|,.:', '|,.:')
13
+ assert_template_result('', '')
14
14
 
15
- text = %|this shouldnt see any transformation either but has multiple lines
16
- as you can clearly see here ...|
17
- assert_template_result(text,text)
15
+ text = %(this shouldnt see any transformation either but has multiple lines
16
+ as you can clearly see here ...)
17
+ assert_template_result(text, text)
18
18
  end
19
19
 
20
20
  def test_has_a_block_which_does_nothing
21
- assert_template_result(%|the comment block should be removed .. right?|,
22
- %|the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?|)
23
-
24
- assert_template_result('','{%comment%}{%endcomment%}')
25
- assert_template_result('','{%comment%}{% endcomment %}')
26
- assert_template_result('','{% comment %}{%endcomment%}')
27
- assert_template_result('','{% comment %}{% endcomment %}')
28
- assert_template_result('','{%comment%}comment{%endcomment%}')
29
- assert_template_result('','{% comment %}comment{% endcomment %}')
30
- assert_template_result('','{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
31
-
32
- assert_template_result('','{%comment%}{%blabla%}{%endcomment%}')
33
- assert_template_result('','{% comment %}{% blabla %}{% endcomment %}')
34
- assert_template_result('','{%comment%}{% endif %}{%endcomment%}')
35
- assert_template_result('','{% comment %}{% endwhatever %}{% endcomment %}')
36
- assert_template_result('','{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
37
-
38
- assert_template_result('foobar','foo{%comment%}comment{%endcomment%}bar')
39
- assert_template_result('foobar','foo{% comment %}comment{% endcomment %}bar')
40
- assert_template_result('foobar','foo{%comment%} comment {%endcomment%}bar')
41
- assert_template_result('foobar','foo{% comment %} comment {% endcomment %}bar')
42
-
43
- assert_template_result('foo bar','foo {%comment%} {%endcomment%} bar')
44
- assert_template_result('foo bar','foo {%comment%}comment{%endcomment%} bar')
45
- assert_template_result('foo bar','foo {%comment%} comment {%endcomment%} bar')
46
-
47
- assert_template_result('foobar','foo{%comment%}
21
+ assert_template_result(%(the comment block should be removed .. right?),
22
+ %(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?))
23
+
24
+ assert_template_result('', '{%comment%}{%endcomment%}')
25
+ assert_template_result('', '{%comment%}{% endcomment %}')
26
+ assert_template_result('', '{% comment %}{%endcomment%}')
27
+ assert_template_result('', '{% comment %}{% endcomment %}')
28
+ assert_template_result('', '{%comment%}comment{%endcomment%}')
29
+ assert_template_result('', '{% comment %}comment{% endcomment %}')
30
+ assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
31
+
32
+ assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}')
33
+ assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}')
34
+ assert_template_result('', '{%comment%}{% endif %}{%endcomment%}')
35
+ assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}')
36
+ assert_template_result('', '{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
37
+
38
+ assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar')
39
+ assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar')
40
+ assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar')
41
+ assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar')
42
+
43
+ assert_template_result('foo bar', 'foo {%comment%} {%endcomment%} bar')
44
+ assert_template_result('foo bar', 'foo {%comment%}comment{%endcomment%} bar')
45
+ assert_template_result('foo bar', 'foo {%comment%} comment {%endcomment%} bar')
46
+
47
+ assert_template_result('foobar', 'foo{%comment%}
48
48
  {%endcomment%}bar')
49
49
  end
50
50
 
51
51
  def test_hyphenated_assign
52
- assigns = {'a-b' => '1' }
52
+ assigns = { 'a-b' => '1' }
53
53
  assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
54
54
  end
55
55
 
56
56
  def test_assign_with_colon_and_spaces
57
- assigns = {'var' => {'a:b c' => {'paged' => '1' }}}
57
+ assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } }
58
58
  assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns)
59
59
  end
60
60
 
61
61
  def test_capture
62
- assigns = {'var' => 'content' }
62
+ assigns = { 'var' => 'content' }
63
63
  assert_template_result('content foo content foo ',
64
- '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
65
- assigns)
64
+ '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
65
+ assigns)
66
66
  end
67
67
 
68
68
  def test_capture_detects_bad_syntax
69
69
  assert_raises(SyntaxError) do
70
70
  assert_template_result('content foo content foo ',
71
- '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
72
- {'var' => 'content' })
71
+ '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
72
+ { 'var' => 'content' })
73
73
  end
74
74
  end
75
75
 
76
76
  def test_case
77
- assigns = {'condition' => 2 }
77
+ assigns = { 'condition' => 2 }
78
78
  assert_template_result(' its 2 ',
79
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
80
- assigns)
79
+ '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
80
+ assigns)
81
81
 
82
- assigns = {'condition' => 1 }
82
+ assigns = { 'condition' => 1 }
83
83
  assert_template_result(' its 1 ',
84
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
85
- assigns)
84
+ '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
85
+ assigns)
86
86
 
87
- assigns = {'condition' => 3 }
87
+ assigns = { 'condition' => 3 }
88
88
  assert_template_result('',
89
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
90
- assigns)
89
+ '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
90
+ assigns)
91
91
 
92
- assigns = {'condition' => "string here" }
92
+ assigns = { 'condition' => "string here" }
93
93
  assert_template_result(' hit ',
94
- '{% case condition %}{% when "string here" %} hit {% endcase %}',
95
- assigns)
94
+ '{% case condition %}{% when "string here" %} hit {% endcase %}',
95
+ assigns)
96
96
 
97
- assigns = {'condition' => "bad string here" }
97
+ assigns = { 'condition' => "bad string here" }
98
98
  assert_template_result('',
99
- '{% case condition %}{% when "string here" %} hit {% endcase %}',\
100
- assigns)
99
+ '{% case condition %}{% when "string here" %} hit {% endcase %}',\
100
+ assigns)
101
101
  end
102
102
 
103
103
  def test_case_with_else
104
- assigns = {'condition' => 5 }
104
+ assigns = { 'condition' => 5 }
105
105
  assert_template_result(' hit ',
106
- '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
107
- assigns)
106
+ '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
107
+ assigns)
108
108
 
109
- assigns = {'condition' => 6 }
109
+ assigns = { 'condition' => 6 }
110
110
  assert_template_result(' else ',
111
- '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
112
- assigns)
111
+ '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
112
+ assigns)
113
113
 
114
- assigns = {'condition' => 6 }
114
+ assigns = { 'condition' => 6 }
115
115
  assert_template_result(' else ',
116
- '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
117
- assigns)
116
+ '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
117
+ assigns)
118
118
  end
119
119
 
120
120
  def test_case_on_size
@@ -128,87 +128,87 @@ class StandardTagTest < Minitest::Test
128
128
 
129
129
  def test_case_on_size_with_else
130
130
  assert_template_result('else',
131
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
132
- 'a' => [])
131
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
132
+ 'a' => [])
133
133
 
134
134
  assert_template_result('1',
135
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
136
- 'a' => [1])
135
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
136
+ 'a' => [1])
137
137
 
138
138
  assert_template_result('2',
139
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
140
- 'a' => [1, 1])
139
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
140
+ 'a' => [1, 1])
141
141
 
142
142
  assert_template_result('else',
143
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
144
- 'a' => [1, 1, 1])
143
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
144
+ 'a' => [1, 1, 1])
145
145
 
146
146
  assert_template_result('else',
147
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
148
- 'a' => [1, 1, 1, 1])
147
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
148
+ 'a' => [1, 1, 1, 1])
149
149
 
150
150
  assert_template_result('else',
151
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
152
- 'a' => [1, 1, 1, 1, 1])
151
+ '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
152
+ 'a' => [1, 1, 1, 1, 1])
153
153
  end
154
154
 
155
155
  def test_case_on_length_with_else
156
156
  assert_template_result('else',
157
- '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
158
- {})
157
+ '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
158
+ {})
159
159
 
160
160
  assert_template_result('false',
161
- '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
162
- {})
161
+ '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
162
+ {})
163
163
 
164
164
  assert_template_result('true',
165
- '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
166
- {})
165
+ '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
166
+ {})
167
167
 
168
168
  assert_template_result('else',
169
- '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
170
- {})
169
+ '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
170
+ {})
171
171
  end
172
172
 
173
173
  def test_assign_from_case
174
174
  # Example from the shopify forums
175
- code = %q({% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }})
175
+ code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}"
176
176
  template = Liquid::Template.parse(code)
177
- assert_equal "menswear", template.render!("collection" => {'handle' => 'menswear-jackets'})
178
- assert_equal "menswear", template.render!("collection" => {'handle' => 'menswear-t-shirts'})
179
- assert_equal "womenswear", template.render!("collection" => {'handle' => 'x'})
180
- assert_equal "womenswear", template.render!("collection" => {'handle' => 'y'})
181
- assert_equal "womenswear", template.render!("collection" => {'handle' => 'z'})
177
+ assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' })
178
+ assert_equal "menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' })
179
+ assert_equal "womenswear", template.render!("collection" => { 'handle' => 'x' })
180
+ assert_equal "womenswear", template.render!("collection" => { 'handle' => 'y' })
181
+ assert_equal "womenswear", template.render!("collection" => { 'handle' => 'z' })
182
182
  end
183
183
 
184
184
  def test_case_when_or
185
185
  code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
186
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
187
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 2 })
188
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 })
189
- assert_template_result(' its 4 ', code, {'condition' => 4 })
190
- assert_template_result('', code, {'condition' => 5 })
186
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
187
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
188
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
189
+ assert_template_result(' its 4 ', code, { 'condition' => 4 })
190
+ assert_template_result('', code, { 'condition' => 5 })
191
191
 
192
192
  code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
193
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
194
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 'string' })
195
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil })
196
- assert_template_result('', code, {'condition' => 'something else' })
193
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
194
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
195
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
196
+ assert_template_result('', code, { 'condition' => 'something else' })
197
197
  end
198
198
 
199
199
  def test_case_when_comma
200
200
  code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
201
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
202
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 2 })
203
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 3 })
204
- assert_template_result(' its 4 ', code, {'condition' => 4 })
205
- assert_template_result('', code, {'condition' => 5 })
201
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
202
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 2 })
203
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 3 })
204
+ assert_template_result(' its 4 ', code, { 'condition' => 4 })
205
+ assert_template_result('', code, { 'condition' => 5 })
206
206
 
207
207
  code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
208
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 1 })
209
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => 'string' })
210
- assert_template_result(' its 1 or 2 or 3 ', code, {'condition' => nil })
211
- assert_template_result('', code, {'condition' => 'something else' })
208
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 1 })
209
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => 'string' })
210
+ assert_template_result(' its 1 or 2 or 3 ', code, { 'condition' => nil })
211
+ assert_template_result('', code, { 'condition' => 'something else' })
212
212
  end
213
213
 
214
214
  def test_assign
@@ -236,15 +236,14 @@ class StandardTagTest < Minitest::Test
236
236
  assert_raises(SyntaxError) do
237
237
  assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {})
238
238
  end
239
-
240
239
  end
241
240
 
242
241
  def test_cycle
243
- assert_template_result('one','{%cycle "one", "two"%}')
244
- assert_template_result('one two','{%cycle "one", "two"%} {%cycle "one", "two"%}')
245
- assert_template_result(' two','{%cycle "", "two"%} {%cycle "", "two"%}')
242
+ assert_template_result('one', '{%cycle "one", "two"%}')
243
+ assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}')
244
+ assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}')
246
245
 
247
- assert_template_result('one two one','{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
246
+ assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
248
247
 
249
248
  assert_template_result('text-align: left text-align: right',
250
249
  '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}')
@@ -261,18 +260,18 @@ class StandardTagTest < Minitest::Test
261
260
  end
262
261
 
263
262
  def test_multiple_named_cycles_with_names_from_context
264
- assigns = {"var1" => 1, "var2" => 2 }
263
+ assigns = { "var1" => 1, "var2" => 2 }
265
264
  assert_template_result('one one two two one one',
266
265
  '{%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %} {%cycle var1: "one", "two" %} {%cycle var2: "one", "two" %}', assigns)
267
266
  end
268
267
 
269
268
  def test_size_of_array
270
- assigns = {"array" => [1,2,3,4]}
269
+ assigns = { "array" => [1, 2, 3, 4] }
271
270
  assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns)
272
271
  end
273
272
 
274
273
  def test_size_of_hash
275
- assigns = {"hash" => {:a => 1, :b => 2, :c=> 3, :d => 4}}
274
+ assigns = { "hash" => { a: 1, b: 2, c: 3, d: 4 } }
276
275
  assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns)
277
276
  end
278
277
 
@@ -284,11 +283,11 @@ class StandardTagTest < Minitest::Test
284
283
  end
285
284
 
286
285
  def test_ifchanged
287
- assigns = {'array' => [ 1, 1, 2, 2, 3, 3] }
288
- assert_template_result('123','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns)
286
+ assigns = { 'array' => [ 1, 1, 2, 2, 3, 3] }
287
+ assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
289
288
 
290
- assigns = {'array' => [ 1, 1, 1, 1] }
291
- assert_template_result('1','{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}',assigns)
289
+ assigns = { 'array' => [ 1, 1, 1, 1] }
290
+ assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
292
291
  end
293
292
 
294
293
  def test_multiline_tag
@@ -37,7 +37,6 @@ class StatementsTest < Minitest::Test
37
37
  text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
38
38
  assert_template_result ' false ', text
39
39
 
40
-
41
40
  text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
42
41
  assert_template_result ' false ', text
43
42
  end
@@ -72,18 +71,17 @@ class StatementsTest < Minitest::Test
72
71
  assert_template_result ' true ', text, 'var' => 'hello there!'
73
72
  end
74
73
 
75
-
76
74
  def test_var_and_long_string_are_equal_backwards
77
75
  text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
78
76
  assert_template_result ' true ', text, 'var' => 'hello there!'
79
77
  end
80
78
 
81
- #def test_is_nil
79
+ # def test_is_nil
82
80
  # text = %| {% if var != nil %} true {% else %} false {% end %} |
83
81
  # @template.assigns = { 'var' => 'hello there!'}
84
82
  # expected = %| true |
85
83
  # assert_equal expected, @template.parse(text)
86
- #end
84
+ # end
87
85
 
88
86
  def test_is_collection_empty
89
87
  text = ' {% if array == empty %} true {% else %} false {% endif %} '
@@ -92,7 +90,7 @@ class StatementsTest < Minitest::Test
92
90
 
93
91
  def test_is_not_collection_empty
94
92
  text = ' {% if array == empty %} true {% else %} false {% endif %} '
95
- assert_template_result ' false ', text, 'array' => [1,2,3]
93
+ assert_template_result ' false ', text, 'array' => [1, 2, 3]
96
94
  end
97
95
 
98
96
  def test_nil
@@ -16,48 +16,49 @@ class TableRowTest < Minitest::Test
16
16
  end
17
17
 
18
18
  def test_table_row
19
-
20
19
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
21
- '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
22
- 'numbers' => [1,2,3,4,5,6])
20
+ '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
21
+ 'numbers' => [1, 2, 3, 4, 5, 6])
23
22
 
24
23
  assert_template_result("<tr class=\"row1\">\n</tr>\n",
25
- '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
26
- 'numbers' => [])
24
+ '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
25
+ 'numbers' => [])
27
26
  end
28
27
 
29
28
  def test_table_row_with_different_cols
30
29
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n",
31
- '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
32
- 'numbers' => [1,2,3,4,5,6])
33
-
30
+ '{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
31
+ 'numbers' => [1, 2, 3, 4, 5, 6])
34
32
  end
35
33
 
36
34
  def test_table_col_counter
37
35
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n",
38
- '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
39
- 'numbers' => [1,2,3,4,5,6])
36
+ '{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
37
+ 'numbers' => [1, 2, 3, 4, 5, 6])
40
38
  end
41
39
 
42
40
  def test_quoted_fragment
43
41
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
44
- "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}",
45
- 'collections' => {'frontpage' => [1,2,3,4,5,6]})
42
+ "{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}",
43
+ 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
46
44
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
47
- "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
48
- 'collections' => {'frontpage' => [1,2,3,4,5,6]})
49
-
45
+ "{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
46
+ 'collections' => { 'frontpage' => [1, 2, 3, 4, 5, 6] })
50
47
  end
51
48
 
52
49
  def test_enumerable_drop
53
50
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
54
- '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
55
- 'numbers' => ArrayDrop.new([1,2,3,4,5,6]))
51
+ '{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
52
+ 'numbers' => ArrayDrop.new([1, 2, 3, 4, 5, 6]))
56
53
  end
57
54
 
58
55
  def test_offset_and_limit
59
56
  assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
60
- '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
61
- 'numbers' => [0,1,2,3,4,5,6,7])
57
+ '{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
58
+ 'numbers' => [0, 1, 2, 3, 4, 5, 6, 7])
59
+ end
60
+
61
+ def test_blank_string_not_iterable
62
+ assert_template_result("<tr class=\"row1\">\n</tr>\n", "{% tablerow char in characters cols:3 %}I WILL NOT BE OUTPUT{% endtablerow %}", 'characters' => '')
62
63
  end
63
64
  end
@@ -4,16 +4,16 @@ class UnlessElseTagTest < Minitest::Test
4
4
  include Liquid
5
5
 
6
6
  def test_unless
7
- assert_template_result(' ',' {% unless true %} this text should not go into the output {% endunless %} ')
7
+ assert_template_result(' ', ' {% unless true %} this text should not go into the output {% endunless %} ')
8
8
  assert_template_result(' this text should go into the output ',
9
- ' {% unless false %} this text should go into the output {% endunless %} ')
10
- assert_template_result(' you rock ?','{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
9
+ ' {% unless false %} this text should go into the output {% endunless %} ')
10
+ assert_template_result(' you rock ?', '{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
11
11
  end
12
12
 
13
13
  def test_unless_else
14
- assert_template_result(' YES ','{% unless true %} NO {% else %} YES {% endunless %}')
15
- assert_template_result(' YES ','{% unless false %} YES {% else %} NO {% endunless %}')
16
- assert_template_result(' YES ','{% unless "foo" %} NO {% else %} YES {% endunless %}')
14
+ assert_template_result(' YES ', '{% unless true %} NO {% else %} YES {% endunless %}')
15
+ assert_template_result(' YES ', '{% unless false %} YES {% else %} NO {% endunless %}')
16
+ assert_template_result(' YES ', '{% unless "foo" %} NO {% else %} YES {% endunless %}')
17
17
  end
18
18
 
19
19
  def test_unless_in_loop