liquid 5.3.0 → 5.4.0

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +16 -1
  3. data/README.md +2 -2
  4. data/lib/liquid/block_body.rb +4 -4
  5. data/lib/liquid/context.rb +6 -2
  6. data/lib/liquid/forloop_drop.rb +44 -1
  7. data/lib/liquid/locales/en.yml +6 -5
  8. data/lib/liquid/partial_cache.rb +3 -3
  9. data/lib/liquid/{static_registers.rb → registers.rb} +13 -10
  10. data/lib/liquid/standardfilters.rb +406 -57
  11. data/lib/liquid/strainer_factory.rb +4 -0
  12. data/lib/liquid/strainer_template.rb +4 -0
  13. data/lib/liquid/tablerowloop_drop.rb +58 -1
  14. data/lib/liquid/tags/assign.rb +12 -8
  15. data/lib/liquid/tags/break.rb +8 -0
  16. data/lib/liquid/tags/capture.rb +13 -10
  17. data/lib/liquid/tags/case.rb +21 -0
  18. data/lib/liquid/tags/comment.rb +13 -0
  19. data/lib/liquid/tags/continue.rb +8 -9
  20. data/lib/liquid/tags/cycle.rb +12 -11
  21. data/lib/liquid/tags/decrement.rb +16 -17
  22. data/lib/liquid/tags/echo.rb +16 -9
  23. data/lib/liquid/tags/for.rb +22 -43
  24. data/lib/liquid/tags/if.rb +11 -9
  25. data/lib/liquid/tags/include.rb +15 -13
  26. data/lib/liquid/tags/increment.rb +16 -14
  27. data/lib/liquid/tags/inline_comment.rb +43 -0
  28. data/lib/liquid/tags/raw.rb +11 -0
  29. data/lib/liquid/tags/render.rb +29 -4
  30. data/lib/liquid/tags/table_row.rb +22 -0
  31. data/lib/liquid/tags/unless.rb +15 -4
  32. data/lib/liquid/template.rb +2 -3
  33. data/lib/liquid/variable.rb +4 -4
  34. data/lib/liquid/variable_lookup.rb +10 -7
  35. data/lib/liquid/version.rb +1 -1
  36. data/lib/liquid.rb +2 -2
  37. metadata +7 -123
  38. data/lib/liquid/register.rb +0 -6
  39. data/test/fixtures/en_locale.yml +0 -9
  40. data/test/integration/assign_test.rb +0 -117
  41. data/test/integration/blank_test.rb +0 -109
  42. data/test/integration/block_test.rb +0 -58
  43. data/test/integration/capture_test.rb +0 -58
  44. data/test/integration/context_test.rb +0 -634
  45. data/test/integration/document_test.rb +0 -21
  46. data/test/integration/drop_test.rb +0 -257
  47. data/test/integration/error_handling_test.rb +0 -272
  48. data/test/integration/expression_test.rb +0 -46
  49. data/test/integration/filter_kwarg_test.rb +0 -24
  50. data/test/integration/filter_test.rb +0 -189
  51. data/test/integration/hash_ordering_test.rb +0 -25
  52. data/test/integration/output_test.rb +0 -125
  53. data/test/integration/parsing_quirks_test.rb +0 -134
  54. data/test/integration/profiler_test.rb +0 -240
  55. data/test/integration/security_test.rb +0 -89
  56. data/test/integration/standard_filter_test.rb +0 -925
  57. data/test/integration/tag/disableable_test.rb +0 -59
  58. data/test/integration/tag_test.rb +0 -45
  59. data/test/integration/tags/break_tag_test.rb +0 -17
  60. data/test/integration/tags/continue_tag_test.rb +0 -17
  61. data/test/integration/tags/echo_test.rb +0 -13
  62. data/test/integration/tags/for_tag_test.rb +0 -466
  63. data/test/integration/tags/if_else_tag_test.rb +0 -190
  64. data/test/integration/tags/include_tag_test.rb +0 -269
  65. data/test/integration/tags/increment_tag_test.rb +0 -25
  66. data/test/integration/tags/liquid_tag_test.rb +0 -116
  67. data/test/integration/tags/raw_tag_test.rb +0 -34
  68. data/test/integration/tags/render_tag_test.rb +0 -213
  69. data/test/integration/tags/standard_tag_test.rb +0 -303
  70. data/test/integration/tags/statements_test.rb +0 -113
  71. data/test/integration/tags/table_row_test.rb +0 -66
  72. data/test/integration/tags/unless_else_tag_test.rb +0 -28
  73. data/test/integration/template_test.rb +0 -340
  74. data/test/integration/trim_mode_test.rb +0 -563
  75. data/test/integration/variable_test.rb +0 -138
  76. data/test/test_helper.rb +0 -207
  77. data/test/unit/block_unit_test.rb +0 -53
  78. data/test/unit/condition_unit_test.rb +0 -181
  79. data/test/unit/file_system_unit_test.rb +0 -37
  80. data/test/unit/i18n_unit_test.rb +0 -39
  81. data/test/unit/lexer_unit_test.rb +0 -53
  82. data/test/unit/parse_tree_visitor_test.rb +0 -261
  83. data/test/unit/parser_unit_test.rb +0 -84
  84. data/test/unit/partial_cache_unit_test.rb +0 -128
  85. data/test/unit/regexp_unit_test.rb +0 -46
  86. data/test/unit/static_registers_unit_test.rb +0 -156
  87. data/test/unit/strainer_factory_unit_test.rb +0 -101
  88. data/test/unit/strainer_template_unit_test.rb +0 -82
  89. data/test/unit/tag_unit_test.rb +0 -23
  90. data/test/unit/tags/case_tag_unit_test.rb +0 -12
  91. data/test/unit/tags/for_tag_unit_test.rb +0 -15
  92. data/test/unit/tags/if_tag_unit_test.rb +0 -10
  93. data/test/unit/template_factory_unit_test.rb +0 -12
  94. data/test/unit/template_unit_test.rb +0 -87
  95. data/test/unit/tokenizer_unit_test.rb +0 -62
  96. data/test/unit/variable_unit_test.rb +0 -164
@@ -1,213 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class RenderTagTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_render_with_no_arguments
9
- Liquid::Template.file_system = StubFileSystem.new('source' => 'rendered content')
10
- assert_template_result('rendered content', '{% render "source" %}')
11
- end
12
-
13
- def test_render_tag_looks_for_file_system_in_registers_first
14
- file_system = StubFileSystem.new('pick_a_source' => 'from register file system')
15
- assert_equal('from register file system',
16
- Template.parse('{% render "pick_a_source" %}').render!({}, registers: { file_system: file_system }))
17
- end
18
-
19
- def test_render_passes_named_arguments_into_inner_scope
20
- Liquid::Template.file_system = StubFileSystem.new('product' => '{{ inner_product.title }}')
21
- assert_template_result('My Product', '{% render "product", inner_product: outer_product %}',
22
- 'outer_product' => { 'title' => 'My Product' })
23
- end
24
-
25
- def test_render_accepts_literals_as_arguments
26
- Liquid::Template.file_system = StubFileSystem.new('snippet' => '{{ price }}')
27
- assert_template_result('123', '{% render "snippet", price: 123 %}')
28
- end
29
-
30
- def test_render_accepts_multiple_named_arguments
31
- Liquid::Template.file_system = StubFileSystem.new('snippet' => '{{ one }} {{ two }}')
32
- assert_template_result('1 2', '{% render "snippet", one: 1, two: 2 %}')
33
- end
34
-
35
- def test_render_does_not_inherit_parent_scope_variables
36
- Liquid::Template.file_system = StubFileSystem.new('snippet' => '{{ outer_variable }}')
37
- assert_template_result('', '{% assign outer_variable = "should not be visible" %}{% render "snippet" %}')
38
- end
39
-
40
- def test_render_does_not_inherit_variable_with_same_name_as_snippet
41
- Liquid::Template.file_system = StubFileSystem.new('snippet' => '{{ snippet }}')
42
- assert_template_result('', "{% assign snippet = 'should not be visible' %}{% render 'snippet' %}")
43
- end
44
-
45
- def test_render_does_not_mutate_parent_scope
46
- Liquid::Template.file_system = StubFileSystem.new('snippet' => '{% assign inner = 1 %}')
47
- assert_template_result('', "{% render 'snippet' %}{{ inner }}")
48
- end
49
-
50
- def test_nested_render_tag
51
- Liquid::Template.file_system = StubFileSystem.new(
52
- 'one' => "one {% render 'two' %}",
53
- 'two' => 'two'
54
- )
55
- assert_template_result('one two', "{% render 'one' %}")
56
- end
57
-
58
- def test_recursively_rendered_template_does_not_produce_endless_loop
59
- Liquid::Template.file_system = StubFileSystem.new('loop' => '{% render "loop" %}')
60
-
61
- assert_raises(Liquid::StackLevelError) do
62
- Template.parse('{% render "loop" %}').render!
63
- end
64
- end
65
-
66
- def test_sub_contexts_count_towards_the_same_recursion_limit
67
- Liquid::Template.file_system = StubFileSystem.new(
68
- 'loop_render' => '{% render "loop_render" %}',
69
- )
70
- assert_raises(Liquid::StackLevelError) do
71
- Template.parse('{% render "loop_render" %}').render!
72
- end
73
- end
74
-
75
- def test_dynamically_choosen_templates_are_not_allowed
76
- Liquid::Template.file_system = StubFileSystem.new('snippet' => 'should not be rendered')
77
-
78
- assert_raises(Liquid::SyntaxError) do
79
- Liquid::Template.parse("{% assign name = 'snippet' %}{% render name %}")
80
- end
81
- end
82
-
83
- def test_include_tag_caches_second_read_of_same_partial
84
- file_system = StubFileSystem.new('snippet' => 'echo')
85
- assert_equal('echoecho',
86
- Template.parse('{% render "snippet" %}{% render "snippet" %}')
87
- .render!({}, registers: { file_system: file_system }))
88
- assert_equal(1, file_system.file_read_count)
89
- end
90
-
91
- def test_render_tag_doesnt_cache_partials_across_renders
92
- file_system = StubFileSystem.new('snippet' => 'my message')
93
-
94
- assert_equal('my message',
95
- Template.parse('{% include "snippet" %}').render!({}, registers: { file_system: file_system }))
96
- assert_equal(1, file_system.file_read_count)
97
-
98
- assert_equal('my message',
99
- Template.parse('{% include "snippet" %}').render!({}, registers: { file_system: file_system }))
100
- assert_equal(2, file_system.file_read_count)
101
- end
102
-
103
- def test_render_tag_within_if_statement
104
- Liquid::Template.file_system = StubFileSystem.new('snippet' => 'my message')
105
- assert_template_result('my message', '{% if true %}{% render "snippet" %}{% endif %}')
106
- end
107
-
108
- def test_break_through_render
109
- Liquid::Template.file_system = StubFileSystem.new('break' => '{% break %}')
110
- assert_template_result('1', '{% for i in (1..3) %}{{ i }}{% break %}{{ i }}{% endfor %}')
111
- assert_template_result('112233', '{% for i in (1..3) %}{{ i }}{% render "break" %}{{ i }}{% endfor %}')
112
- end
113
-
114
- def test_increment_is_isolated_between_renders
115
- Liquid::Template.file_system = StubFileSystem.new('incr' => '{% increment %}')
116
- assert_template_result('010', '{% increment %}{% increment %}{% render "incr" %}')
117
- end
118
-
119
- def test_decrement_is_isolated_between_renders
120
- Liquid::Template.file_system = StubFileSystem.new('decr' => '{% decrement %}')
121
- assert_template_result('-1-2-1', '{% decrement %}{% decrement %}{% render "decr" %}')
122
- end
123
-
124
- def test_includes_will_not_render_inside_render_tag
125
- Liquid::Template.file_system = StubFileSystem.new(
126
- 'foo' => 'bar',
127
- 'test_include' => '{% include "foo" %}'
128
- )
129
-
130
- exc = assert_raises(Liquid::DisabledError) do
131
- Liquid::Template.parse('{% render "test_include" %}').render!
132
- end
133
- assert_equal('Liquid error: include usage is not allowed in this context', exc.message)
134
- end
135
-
136
- def test_includes_will_not_render_inside_nested_sibling_tags
137
- Liquid::Template.file_system = StubFileSystem.new(
138
- 'foo' => 'bar',
139
- 'nested_render_with_sibling_include' => '{% render "test_include" %}{% include "foo" %}',
140
- 'test_include' => '{% include "foo" %}'
141
- )
142
-
143
- output = Liquid::Template.parse('{% render "nested_render_with_sibling_include" %}').render
144
- assert_equal('Liquid error: include usage is not allowed in this contextLiquid error: include usage is not allowed in this context', output)
145
- end
146
-
147
- def test_render_tag_with
148
- Liquid::Template.file_system = StubFileSystem.new(
149
- 'product' => "Product: {{ product.title }} ",
150
- 'product_alias' => "Product: {{ product.title }} ",
151
- )
152
-
153
- assert_template_result("Product: Draft 151cm ",
154
- "{% render 'product' with products[0] %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
155
- end
156
-
157
- def test_render_tag_with_alias
158
- Liquid::Template.file_system = StubFileSystem.new(
159
- 'product' => "Product: {{ product.title }} ",
160
- 'product_alias' => "Product: {{ product.title }} ",
161
- )
162
-
163
- assert_template_result("Product: Draft 151cm ",
164
- "{% render 'product_alias' with products[0] as product %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
165
- end
166
-
167
- def test_render_tag_for_alias
168
- Liquid::Template.file_system = StubFileSystem.new(
169
- 'product' => "Product: {{ product.title }} ",
170
- 'product_alias' => "Product: {{ product.title }} ",
171
- )
172
-
173
- assert_template_result("Product: Draft 151cm Product: Element 155cm ",
174
- "{% render 'product_alias' for products as product %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
175
- end
176
-
177
- def test_render_tag_for
178
- Liquid::Template.file_system = StubFileSystem.new(
179
- 'product' => "Product: {{ product.title }} ",
180
- 'product_alias' => "Product: {{ product.title }} ",
181
- )
182
-
183
- assert_template_result("Product: Draft 151cm Product: Element 155cm ",
184
- "{% render 'product' for products %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
185
- end
186
-
187
- def test_render_tag_forloop
188
- Liquid::Template.file_system = StubFileSystem.new(
189
- 'product' => "Product: {{ product.title }} {% if forloop.first %}first{% endif %} {% if forloop.last %}last{% endif %} index:{{ forloop.index }} ",
190
- )
191
-
192
- assert_template_result("Product: Draft 151cm first index:1 Product: Element 155cm last index:2 ",
193
- "{% render 'product' for products %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
194
- end
195
-
196
- def test_render_tag_for_drop
197
- Liquid::Template.file_system = StubFileSystem.new(
198
- 'loop' => "{{ value.foo }}",
199
- )
200
-
201
- assert_template_result("123",
202
- "{% render 'loop' for loop as value %}", "loop" => TestEnumerable.new)
203
- end
204
-
205
- def test_render_tag_with_drop
206
- Liquid::Template.file_system = StubFileSystem.new(
207
- 'loop' => "{{ value }}",
208
- )
209
-
210
- assert_template_result("TestEnumerable",
211
- "{% render 'loop' with loop as value %}", "loop" => TestEnumerable.new)
212
- end
213
- end
@@ -1,303 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class StandardTagTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_no_transform
9
- assert_template_result('this text should come out of the template without change...',
10
- 'this text should come out of the template without change...')
11
-
12
- assert_template_result('blah', 'blah')
13
- assert_template_result('<blah>', '<blah>')
14
- assert_template_result('|,.:', '|,.:')
15
- assert_template_result('', '')
16
-
17
- text = %(this shouldnt see any transformation either but has multiple lines
18
- as you can clearly see here ...)
19
- assert_template_result(text, text)
20
- end
21
-
22
- def test_has_a_block_which_does_nothing
23
- assert_template_result(%(the comment block should be removed .. right?),
24
- %(the comment block should be removed {%comment%} be gone.. {%endcomment%} .. right?))
25
-
26
- assert_template_result('', '{%comment%}{%endcomment%}')
27
- assert_template_result('', '{%comment%}{% endcomment %}')
28
- assert_template_result('', '{% comment %}{%endcomment%}')
29
- assert_template_result('', '{% comment %}{% endcomment %}')
30
- assert_template_result('', '{%comment%}comment{%endcomment%}')
31
- assert_template_result('', '{% comment %}comment{% endcomment %}')
32
- assert_template_result('', '{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
33
-
34
- assert_template_result('', '{%comment%}{%blabla%}{%endcomment%}')
35
- assert_template_result('', '{% comment %}{% blabla %}{% endcomment %}')
36
- assert_template_result('', '{%comment%}{% endif %}{%endcomment%}')
37
- assert_template_result('', '{% comment %}{% endwhatever %}{% endcomment %}')
38
- assert_template_result('', '{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
39
-
40
- assert_template_result('foobar', 'foo{%comment%}comment{%endcomment%}bar')
41
- assert_template_result('foobar', 'foo{% comment %}comment{% endcomment %}bar')
42
- assert_template_result('foobar', 'foo{%comment%} comment {%endcomment%}bar')
43
- assert_template_result('foobar', 'foo{% comment %} comment {% endcomment %}bar')
44
-
45
- assert_template_result('foo bar', 'foo {%comment%} {%endcomment%} bar')
46
- assert_template_result('foo bar', 'foo {%comment%}comment{%endcomment%} bar')
47
- assert_template_result('foo bar', 'foo {%comment%} comment {%endcomment%} bar')
48
-
49
- assert_template_result('foobar', 'foo{%comment%}
50
- {%endcomment%}bar')
51
- end
52
-
53
- def test_hyphenated_assign
54
- assigns = { 'a-b' => '1' }
55
- assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
56
- end
57
-
58
- def test_assign_with_colon_and_spaces
59
- assigns = { 'var' => { 'a:b c' => { 'paged' => '1' } } }
60
- assert_template_result('var2: 1', '{%assign var2 = var["a:b c"].paged %}var2: {{var2}}', assigns)
61
- end
62
-
63
- def test_capture
64
- assigns = { 'var' => 'content' }
65
- assert_template_result('content foo content foo ',
66
- '{{ var2 }}{% capture var2 %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
67
- assigns)
68
- end
69
-
70
- def test_capture_detects_bad_syntax
71
- assert_raises(SyntaxError) do
72
- assert_template_result('content foo content foo ',
73
- '{{ var2 }}{% capture %}{{ var }} foo {% endcapture %}{{ var2 }}{{ var2 }}',
74
- 'var' => 'content')
75
- end
76
- end
77
-
78
- def test_case
79
- assigns = { 'condition' => 2 }
80
- assert_template_result(' its 2 ',
81
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
82
- assigns)
83
-
84
- assigns = { 'condition' => 1 }
85
- assert_template_result(' its 1 ',
86
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
87
- assigns)
88
-
89
- assigns = { 'condition' => 3 }
90
- assert_template_result('',
91
- '{% case condition %}{% when 1 %} its 1 {% when 2 %} its 2 {% endcase %}',
92
- assigns)
93
-
94
- assigns = { 'condition' => "string here" }
95
- assert_template_result(' hit ',
96
- '{% case condition %}{% when "string here" %} hit {% endcase %}',
97
- assigns)
98
-
99
- assigns = { 'condition' => "bad string here" }
100
- assert_template_result('',
101
- '{% case condition %}{% when "string here" %} hit {% endcase %}',\
102
- assigns)
103
- end
104
-
105
- def test_case_with_else
106
- assigns = { 'condition' => 5 }
107
- assert_template_result(' hit ',
108
- '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
109
- assigns)
110
-
111
- assigns = { 'condition' => 6 }
112
- assert_template_result(' else ',
113
- '{% case condition %}{% when 5 %} hit {% else %} else {% endcase %}',
114
- assigns)
115
-
116
- assigns = { 'condition' => 6 }
117
- assert_template_result(' else ',
118
- '{% case condition %} {% when 5 %} hit {% else %} else {% endcase %}',
119
- assigns)
120
- end
121
-
122
- def test_case_on_size
123
- assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [])
124
- assert_template_result('1', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1])
125
- assert_template_result('2', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1])
126
- assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1])
127
- assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1])
128
- assert_template_result('', '{% case a.size %}{% when 1 %}1{% when 2 %}2{% endcase %}', 'a' => [1, 1, 1, 1, 1])
129
- end
130
-
131
- def test_case_on_size_with_else
132
- assert_template_result('else',
133
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
134
- 'a' => [])
135
-
136
- assert_template_result('1',
137
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
138
- 'a' => [1])
139
-
140
- assert_template_result('2',
141
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
142
- 'a' => [1, 1])
143
-
144
- assert_template_result('else',
145
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
146
- 'a' => [1, 1, 1])
147
-
148
- assert_template_result('else',
149
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
150
- 'a' => [1, 1, 1, 1])
151
-
152
- assert_template_result('else',
153
- '{% case a.size %}{% when 1 %}1{% when 2 %}2{% else %}else{% endcase %}',
154
- 'a' => [1, 1, 1, 1, 1])
155
- end
156
-
157
- def test_case_on_length_with_else
158
- assert_template_result('else',
159
- '{% case a.empty? %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
160
- {})
161
-
162
- assert_template_result('false',
163
- '{% case false %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
164
- {})
165
-
166
- assert_template_result('true',
167
- '{% case true %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
168
- {})
169
-
170
- assert_template_result('else',
171
- '{% case NULL %}{% when true %}true{% when false %}false{% else %}else{% endcase %}',
172
- {})
173
- end
174
-
175
- def test_assign_from_case
176
- # Example from the shopify forums
177
- code = "{% case collection.handle %}{% when 'menswear-jackets' %}{% assign ptitle = 'menswear' %}{% when 'menswear-t-shirts' %}{% assign ptitle = 'menswear' %}{% else %}{% assign ptitle = 'womenswear' %}{% endcase %}{{ ptitle }}"
178
- template = Liquid::Template.parse(code)
179
- assert_equal("menswear", template.render!("collection" => { 'handle' => 'menswear-jackets' }))
180
- assert_equal("menswear", template.render!("collection" => { 'handle' => 'menswear-t-shirts' }))
181
- assert_equal("womenswear", template.render!("collection" => { 'handle' => 'x' }))
182
- assert_equal("womenswear", template.render!("collection" => { 'handle' => 'y' }))
183
- assert_equal("womenswear", template.render!("collection" => { 'handle' => 'z' }))
184
- end
185
-
186
- def test_case_when_or
187
- code = '{% case condition %}{% when 1 or 2 or 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
188
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 1)
189
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 2)
190
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 3)
191
- assert_template_result(' its 4 ', code, 'condition' => 4)
192
- assert_template_result('', code, 'condition' => 5)
193
-
194
- code = '{% case condition %}{% when 1 or "string" or null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
195
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 1)
196
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 'string')
197
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => nil)
198
- assert_template_result('', code, 'condition' => 'something else')
199
- end
200
-
201
- def test_case_when_comma
202
- code = '{% case condition %}{% when 1, 2, 3 %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
203
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 1)
204
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 2)
205
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 3)
206
- assert_template_result(' its 4 ', code, 'condition' => 4)
207
- assert_template_result('', code, 'condition' => 5)
208
-
209
- code = '{% case condition %}{% when 1, "string", null %} its 1 or 2 or 3 {% when 4 %} its 4 {% endcase %}'
210
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 1)
211
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => 'string')
212
- assert_template_result(' its 1 or 2 or 3 ', code, 'condition' => nil)
213
- assert_template_result('', code, 'condition' => 'something else')
214
- end
215
-
216
- def test_case_when_comma_and_blank_body
217
- code = '{% case condition %}{% when 1, 2 %} {% assign r = "result" %} {% endcase %}{{ r }}'
218
- assert_template_result('result', code, 'condition' => 2)
219
- end
220
-
221
- def test_assign
222
- assert_template_result('variable', '{% assign a = "variable"%}{{a}}')
223
- end
224
-
225
- def test_assign_unassigned
226
- assigns = { 'var' => 'content' }
227
- assert_template_result('var2: var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns)
228
- end
229
-
230
- def test_assign_an_empty_string
231
- assert_template_result('', '{% assign a = ""%}{{a}}')
232
- end
233
-
234
- def test_assign_is_global
235
- assert_template_result('variable', '{%for i in (1..2) %}{% assign a = "variable"%}{% endfor %}{{a}}')
236
- end
237
-
238
- def test_case_detects_bad_syntax
239
- assert_raises(SyntaxError) do
240
- assert_template_result('', '{% case false %}{% when %}true{% endcase %}', {})
241
- end
242
-
243
- assert_raises(SyntaxError) do
244
- assert_template_result('', '{% case false %}{% huh %}true{% endcase %}', {})
245
- end
246
- end
247
-
248
- def test_cycle
249
- assert_template_result('one', '{%cycle "one", "two"%}')
250
- assert_template_result('one two', '{%cycle "one", "two"%} {%cycle "one", "two"%}')
251
- assert_template_result(' two', '{%cycle "", "two"%} {%cycle "", "two"%}')
252
-
253
- assert_template_result('one two one', '{%cycle "one", "two"%} {%cycle "one", "two"%} {%cycle "one", "two"%}')
254
-
255
- assert_template_result('text-align: left text-align: right',
256
- '{%cycle "text-align: left", "text-align: right" %} {%cycle "text-align: left", "text-align: right"%}')
257
- end
258
-
259
- def test_multiple_cycles
260
- assert_template_result('1 2 1 1 2 3 1',
261
- '{%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%} {%cycle 1,2,3%}')
262
- end
263
-
264
- def test_multiple_named_cycles
265
- assert_template_result('one one two two one one',
266
- '{%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %} {%cycle 1: "one", "two" %} {%cycle 2: "one", "two" %}')
267
- end
268
-
269
- def test_multiple_named_cycles_with_names_from_context
270
- assigns = { "var1" => 1, "var2" => 2 }
271
- assert_template_result('one one two two one one',
272
- '{%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)
273
- end
274
-
275
- def test_size_of_array
276
- assigns = { "array" => [1, 2, 3, 4] }
277
- assert_template_result('array has 4 elements', "array has {{ array.size }} elements", assigns)
278
- end
279
-
280
- def test_size_of_hash
281
- assigns = { "hash" => { a: 1, b: 2, c: 3, d: 4 } }
282
- assert_template_result('hash has 4 elements', "hash has {{ hash.size }} elements", assigns)
283
- end
284
-
285
- def test_illegal_symbols
286
- assert_template_result('', '{% if true == empty %}?{% endif %}', {})
287
- assert_template_result('', '{% if true == null %}?{% endif %}', {})
288
- assert_template_result('', '{% if empty == true %}?{% endif %}', {})
289
- assert_template_result('', '{% if null == true %}?{% endif %}', {})
290
- end
291
-
292
- def test_ifchanged
293
- assigns = { 'array' => [1, 1, 2, 2, 3, 3] }
294
- assert_template_result('123', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
295
-
296
- assigns = { 'array' => [1, 1, 1, 1] }
297
- assert_template_result('1', '{%for item in array%}{%ifchanged%}{{item}}{% endifchanged %}{%endfor%}', assigns)
298
- end
299
-
300
- def test_multiline_tag
301
- assert_template_result('0 1 2 3', "0{%\nfor i in (1..3)\n%} {{\ni\n}}{%\nendfor\n%}")
302
- end
303
- end # StandardTagTest
@@ -1,113 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class StatementsTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_true_eql_true
9
- text = ' {% if true == true %} true {% else %} false {% endif %} '
10
- assert_template_result(' true ', text)
11
- end
12
-
13
- def test_true_not_eql_true
14
- text = ' {% if true != true %} true {% else %} false {% endif %} '
15
- assert_template_result(' false ', text)
16
- end
17
-
18
- def test_true_lq_true
19
- text = ' {% if 0 > 0 %} true {% else %} false {% endif %} '
20
- assert_template_result(' false ', text)
21
- end
22
-
23
- def test_one_lq_zero
24
- text = ' {% if 1 > 0 %} true {% else %} false {% endif %} '
25
- assert_template_result(' true ', text)
26
- end
27
-
28
- def test_zero_lq_one
29
- text = ' {% if 0 < 1 %} true {% else %} false {% endif %} '
30
- assert_template_result(' true ', text)
31
- end
32
-
33
- def test_zero_lq_or_equal_one
34
- text = ' {% if 0 <= 0 %} true {% else %} false {% endif %} '
35
- assert_template_result(' true ', text)
36
- end
37
-
38
- def test_zero_lq_or_equal_one_involving_nil
39
- text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
40
- assert_template_result(' false ', text)
41
-
42
- text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
43
- assert_template_result(' false ', text)
44
- end
45
-
46
- def test_zero_lqq_or_equal_one
47
- text = ' {% if 0 >= 0 %} true {% else %} false {% endif %} '
48
- assert_template_result(' true ', text)
49
- end
50
-
51
- def test_strings
52
- text = " {% if 'test' == 'test' %} true {% else %} false {% endif %} "
53
- assert_template_result(' true ', text)
54
- end
55
-
56
- def test_strings_not_equal
57
- text = " {% if 'test' != 'test' %} true {% else %} false {% endif %} "
58
- assert_template_result(' false ', text)
59
- end
60
-
61
- def test_var_strings_equal
62
- text = ' {% if var == "hello there!" %} true {% else %} false {% endif %} '
63
- assert_template_result(' true ', text, 'var' => 'hello there!')
64
- end
65
-
66
- def test_var_strings_are_not_equal
67
- text = ' {% if "hello there!" == var %} true {% else %} false {% endif %} '
68
- assert_template_result(' true ', text, 'var' => 'hello there!')
69
- end
70
-
71
- def test_var_and_long_string_are_equal
72
- text = " {% if var == 'hello there!' %} true {% else %} false {% endif %} "
73
- assert_template_result(' true ', text, 'var' => 'hello there!')
74
- end
75
-
76
- def test_var_and_long_string_are_equal_backwards
77
- text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
78
- assert_template_result(' true ', text, 'var' => 'hello there!')
79
- end
80
-
81
- # def test_is_nil
82
- # text = %| {% if var != nil %} true {% else %} false {% end %} |
83
- # @template.assigns = { 'var' => 'hello there!'}
84
- # expected = %| true |
85
- # assert_equal expected, @template.parse(text)
86
- # end
87
-
88
- def test_is_collection_empty
89
- text = ' {% if array == empty %} true {% else %} false {% endif %} '
90
- assert_template_result(' true ', text, 'array' => [])
91
- end
92
-
93
- def test_is_not_collection_empty
94
- text = ' {% if array == empty %} true {% else %} false {% endif %} '
95
- assert_template_result(' false ', text, 'array' => [1, 2, 3])
96
- end
97
-
98
- def test_nil
99
- text = ' {% if var == nil %} true {% else %} false {% endif %} '
100
- assert_template_result(' true ', text, 'var' => nil)
101
-
102
- text = ' {% if var == null %} true {% else %} false {% endif %} '
103
- assert_template_result(' true ', text, 'var' => nil)
104
- end
105
-
106
- def test_not_nil
107
- text = ' {% if var != nil %} true {% else %} false {% endif %} '
108
- assert_template_result(' true ', text, 'var' => 1)
109
-
110
- text = ' {% if var != null %} true {% else %} false {% endif %} '
111
- assert_template_result(' true ', text, 'var' => 1)
112
- end
113
- end # StatementsTest