liquid 4.0.0.rc3 → 5.0.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.
- checksums.yaml +5 -5
- data/History.md +93 -2
- data/README.md +8 -0
- data/lib/liquid.rb +18 -5
- data/lib/liquid/block.rb +47 -20
- data/lib/liquid/block_body.rb +190 -76
- data/lib/liquid/condition.rb +69 -29
- data/lib/liquid/context.rb +122 -76
- data/lib/liquid/document.rb +47 -9
- data/lib/liquid/drop.rb +4 -2
- data/lib/liquid/errors.rb +20 -25
- data/lib/liquid/expression.rb +30 -31
- data/lib/liquid/extensions.rb +8 -0
- data/lib/liquid/file_system.rb +6 -4
- data/lib/liquid/forloop_drop.rb +11 -4
- data/lib/liquid/i18n.rb +5 -3
- data/lib/liquid/interrupts.rb +3 -1
- data/lib/liquid/lexer.rb +35 -26
- data/lib/liquid/locales/en.yml +4 -2
- data/lib/liquid/parse_context.rb +17 -4
- data/lib/liquid/parse_tree_visitor.rb +42 -0
- data/lib/liquid/parser.rb +30 -18
- data/lib/liquid/parser_switching.rb +17 -3
- data/lib/liquid/partial_cache.rb +24 -0
- data/lib/liquid/profiler.rb +67 -86
- data/lib/liquid/profiler/hooks.rb +26 -14
- data/lib/liquid/range_lookup.rb +5 -3
- data/lib/liquid/register.rb +6 -0
- data/lib/liquid/resource_limits.rb +47 -8
- data/lib/liquid/standardfilters.rb +171 -57
- data/lib/liquid/static_registers.rb +44 -0
- data/lib/liquid/strainer_factory.rb +36 -0
- data/lib/liquid/strainer_template.rb +53 -0
- data/lib/liquid/tablerowloop_drop.rb +6 -4
- data/lib/liquid/tag.rb +28 -6
- data/lib/liquid/tag/disableable.rb +22 -0
- data/lib/liquid/tag/disabler.rb +21 -0
- data/lib/liquid/tags/assign.rb +32 -10
- data/lib/liquid/tags/break.rb +8 -3
- data/lib/liquid/tags/capture.rb +11 -8
- data/lib/liquid/tags/case.rb +41 -27
- data/lib/liquid/tags/comment.rb +5 -3
- data/lib/liquid/tags/continue.rb +8 -3
- data/lib/liquid/tags/cycle.rb +35 -16
- data/lib/liquid/tags/decrement.rb +6 -3
- data/lib/liquid/tags/echo.rb +26 -0
- data/lib/liquid/tags/for.rb +79 -47
- data/lib/liquid/tags/if.rb +53 -30
- data/lib/liquid/tags/ifchanged.rb +11 -10
- data/lib/liquid/tags/include.rb +42 -44
- data/lib/liquid/tags/increment.rb +7 -3
- data/lib/liquid/tags/raw.rb +14 -11
- data/lib/liquid/tags/render.rb +84 -0
- data/lib/liquid/tags/table_row.rb +32 -20
- data/lib/liquid/tags/unless.rb +15 -15
- data/lib/liquid/template.rb +60 -71
- data/lib/liquid/template_factory.rb +9 -0
- data/lib/liquid/tokenizer.rb +17 -9
- data/lib/liquid/usage.rb +8 -0
- data/lib/liquid/utils.rb +6 -4
- data/lib/liquid/variable.rb +55 -38
- data/lib/liquid/variable_lookup.rb +14 -6
- data/lib/liquid/version.rb +3 -1
- data/test/integration/assign_test.rb +74 -5
- data/test/integration/blank_test.rb +11 -8
- data/test/integration/block_test.rb +58 -0
- data/test/integration/capture_test.rb +18 -10
- data/test/integration/context_test.rb +608 -5
- data/test/integration/document_test.rb +4 -2
- data/test/integration/drop_test.rb +67 -83
- data/test/integration/error_handling_test.rb +90 -60
- data/test/integration/expression_test.rb +46 -0
- data/test/integration/filter_test.rb +53 -42
- data/test/integration/hash_ordering_test.rb +5 -3
- data/test/integration/output_test.rb +26 -24
- data/test/integration/parsing_quirks_test.rb +24 -8
- data/test/integration/{render_profiling_test.rb → profiler_test.rb} +84 -25
- data/test/integration/security_test.rb +41 -18
- data/test/integration/standard_filter_test.rb +523 -205
- data/test/integration/tag/disableable_test.rb +59 -0
- data/test/integration/tag_test.rb +45 -0
- data/test/integration/tags/break_tag_test.rb +4 -2
- data/test/integration/tags/continue_tag_test.rb +4 -2
- data/test/integration/tags/echo_test.rb +13 -0
- data/test/integration/tags/for_tag_test.rb +109 -53
- data/test/integration/tags/if_else_tag_test.rb +5 -3
- data/test/integration/tags/include_tag_test.rb +83 -52
- data/test/integration/tags/increment_tag_test.rb +4 -2
- data/test/integration/tags/liquid_tag_test.rb +116 -0
- data/test/integration/tags/raw_tag_test.rb +14 -11
- data/test/integration/tags/render_tag_test.rb +213 -0
- data/test/integration/tags/standard_tag_test.rb +38 -31
- data/test/integration/tags/statements_test.rb +23 -21
- data/test/integration/tags/table_row_test.rb +2 -0
- data/test/integration/tags/unless_else_tag_test.rb +4 -2
- data/test/integration/template_test.rb +128 -121
- data/test/integration/trim_mode_test.rb +82 -44
- data/test/integration/variable_test.rb +46 -31
- data/test/test_helper.rb +75 -23
- data/test/unit/block_unit_test.rb +19 -24
- data/test/unit/condition_unit_test.rb +82 -72
- data/test/unit/file_system_unit_test.rb +6 -4
- data/test/unit/i18n_unit_test.rb +7 -5
- data/test/unit/lexer_unit_test.rb +12 -10
- data/test/unit/parse_tree_visitor_test.rb +247 -0
- data/test/unit/parser_unit_test.rb +37 -35
- data/test/unit/partial_cache_unit_test.rb +128 -0
- data/test/unit/regexp_unit_test.rb +17 -15
- data/test/unit/static_registers_unit_test.rb +156 -0
- data/test/unit/strainer_factory_unit_test.rb +100 -0
- data/test/unit/strainer_template_unit_test.rb +82 -0
- data/test/unit/tag_unit_test.rb +5 -3
- data/test/unit/tags/case_tag_unit_test.rb +3 -1
- data/test/unit/tags/for_tag_unit_test.rb +4 -2
- data/test/unit/tags/if_tag_unit_test.rb +3 -1
- data/test/unit/template_factory_unit_test.rb +12 -0
- data/test/unit/template_unit_test.rb +19 -10
- data/test/unit/tokenizer_unit_test.rb +19 -17
- data/test/unit/variable_unit_test.rb +51 -49
- metadata +83 -50
- data/lib/liquid/strainer.rb +0 -65
- data/test/unit/context_unit_test.rb +0 -483
- data/test/unit/strainer_unit_test.rb +0 -136
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class FileSystemUnitTest < Minitest::Test
|
@@ -11,8 +13,8 @@ class FileSystemUnitTest < Minitest::Test
|
|
11
13
|
|
12
14
|
def test_local
|
13
15
|
file_system = Liquid::LocalFileSystem.new("/some/path")
|
14
|
-
assert_equal
|
15
|
-
assert_equal
|
16
|
+
assert_equal("/some/path/_mypartial.liquid", file_system.full_path("mypartial"))
|
17
|
+
assert_equal("/some/path/dir/_mypartial.liquid", file_system.full_path("dir/mypartial"))
|
16
18
|
|
17
19
|
assert_raises(FileSystemError) do
|
18
20
|
file_system.full_path("../dir/mypartial")
|
@@ -29,7 +31,7 @@ class FileSystemUnitTest < Minitest::Test
|
|
29
31
|
|
30
32
|
def test_custom_template_filename_patterns
|
31
33
|
file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
|
32
|
-
assert_equal
|
33
|
-
assert_equal
|
34
|
+
assert_equal("/some/path/mypartial.html", file_system.full_path("mypartial"))
|
35
|
+
assert_equal("/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial"))
|
34
36
|
end
|
35
37
|
end # FileSystemTest
|
data/test/unit/i18n_unit_test.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class I18nUnitTest < Minitest::Test
|
@@ -8,15 +10,15 @@ class I18nUnitTest < Minitest::Test
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def test_simple_translate_string
|
11
|
-
assert_equal
|
13
|
+
assert_equal("less is more", @i18n.translate("simple"))
|
12
14
|
end
|
13
15
|
|
14
16
|
def test_nested_translate_string
|
15
|
-
assert_equal
|
17
|
+
assert_equal("something wasn't right", @i18n.translate("errors.syntax.oops"))
|
16
18
|
end
|
17
19
|
|
18
20
|
def test_single_string_interpolation
|
19
|
-
assert_equal
|
21
|
+
assert_equal("something different", @i18n.translate("whatever", something: "different"))
|
20
22
|
end
|
21
23
|
|
22
24
|
# def test_raises_translation_error_on_undefined_interpolation_key
|
@@ -26,12 +28,12 @@ class I18nUnitTest < Minitest::Test
|
|
26
28
|
# end
|
27
29
|
|
28
30
|
def test_raises_unknown_translation
|
29
|
-
assert_raises
|
31
|
+
assert_raises(I18n::TranslationError) do
|
30
32
|
@i18n.translate("doesnt_exist")
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
36
|
def test_sets_default_path_to_en
|
35
|
-
assert_equal
|
37
|
+
assert_equal(I18n::DEFAULT_LOCALE, I18n.new.path)
|
36
38
|
end
|
37
39
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class LexerUnitTest < Minitest::Test
|
@@ -5,42 +7,42 @@ class LexerUnitTest < Minitest::Test
|
|
5
7
|
|
6
8
|
def test_strings
|
7
9
|
tokens = Lexer.new(%( 'this is a test""' "wat 'lol'")).tokenize
|
8
|
-
assert_equal
|
10
|
+
assert_equal([[:string, %('this is a test""')], [:string, %("wat 'lol'")], [:end_of_string]], tokens)
|
9
11
|
end
|
10
12
|
|
11
13
|
def test_integer
|
12
14
|
tokens = Lexer.new('hi 50').tokenize
|
13
|
-
assert_equal
|
15
|
+
assert_equal([[:id, 'hi'], [:number, '50'], [:end_of_string]], tokens)
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_float
|
17
19
|
tokens = Lexer.new('hi 5.0').tokenize
|
18
|
-
assert_equal
|
20
|
+
assert_equal([[:id, 'hi'], [:number, '5.0'], [:end_of_string]], tokens)
|
19
21
|
end
|
20
22
|
|
21
23
|
def test_comparison
|
22
|
-
tokens = Lexer.new('== <> contains').tokenize
|
23
|
-
assert_equal
|
24
|
+
tokens = Lexer.new('== <> contains ').tokenize
|
25
|
+
assert_equal([[:comparison, '=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens)
|
24
26
|
end
|
25
27
|
|
26
28
|
def test_specials
|
27
29
|
tokens = Lexer.new('| .:').tokenize
|
28
|
-
assert_equal
|
30
|
+
assert_equal([[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens)
|
29
31
|
tokens = Lexer.new('[,]').tokenize
|
30
|
-
assert_equal
|
32
|
+
assert_equal([[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens)
|
31
33
|
end
|
32
34
|
|
33
35
|
def test_fancy_identifiers
|
34
36
|
tokens = Lexer.new('hi five?').tokenize
|
35
|
-
assert_equal
|
37
|
+
assert_equal([[:id, 'hi'], [:id, 'five?'], [:end_of_string]], tokens)
|
36
38
|
|
37
39
|
tokens = Lexer.new('2foo').tokenize
|
38
|
-
assert_equal
|
40
|
+
assert_equal([[:number, '2'], [:id, 'foo'], [:end_of_string]], tokens)
|
39
41
|
end
|
40
42
|
|
41
43
|
def test_whitespace
|
42
44
|
tokens = Lexer.new("five|\n\t ==").tokenize
|
43
|
-
assert_equal
|
45
|
+
assert_equal([[:id, 'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens)
|
44
46
|
end
|
45
47
|
|
46
48
|
def test_unexpected_character
|
@@ -0,0 +1,247 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class ParseTreeVisitorTest < Minitest::Test
|
6
|
+
include Liquid
|
7
|
+
|
8
|
+
def test_variable
|
9
|
+
assert_equal(
|
10
|
+
["test"],
|
11
|
+
visit(%({{ test }}))
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_varible_with_filter
|
16
|
+
assert_equal(
|
17
|
+
["test", "infilter"],
|
18
|
+
visit(%({{ test | split: infilter }}))
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_dynamic_variable
|
23
|
+
assert_equal(
|
24
|
+
["test", "inlookup"],
|
25
|
+
visit(%({{ test[inlookup] }}))
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_if_condition
|
30
|
+
assert_equal(
|
31
|
+
["test"],
|
32
|
+
visit(%({% if test %}{% endif %}))
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_complex_if_condition
|
37
|
+
assert_equal(
|
38
|
+
["test"],
|
39
|
+
visit(%({% if 1 == 1 and 2 == test %}{% endif %}))
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_if_body
|
44
|
+
assert_equal(
|
45
|
+
["test"],
|
46
|
+
visit(%({% if 1 == 1 %}{{ test }}{% endif %}))
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_unless_condition
|
51
|
+
assert_equal(
|
52
|
+
["test"],
|
53
|
+
visit(%({% unless test %}{% endunless %}))
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_complex_unless_condition
|
58
|
+
assert_equal(
|
59
|
+
["test"],
|
60
|
+
visit(%({% unless 1 == 1 and 2 == test %}{% endunless %}))
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_unless_body
|
65
|
+
assert_equal(
|
66
|
+
["test"],
|
67
|
+
visit(%({% unless 1 == 1 %}{{ test }}{% endunless %}))
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_elsif_condition
|
72
|
+
assert_equal(
|
73
|
+
["test"],
|
74
|
+
visit(%({% if 1 == 1 %}{% elsif test %}{% endif %}))
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_complex_elsif_condition
|
79
|
+
assert_equal(
|
80
|
+
["test"],
|
81
|
+
visit(%({% if 1 == 1 %}{% elsif 1 == 1 and 2 == test %}{% endif %}))
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_elsif_body
|
86
|
+
assert_equal(
|
87
|
+
["test"],
|
88
|
+
visit(%({% if 1 == 1 %}{% elsif 2 == 2 %}{{ test }}{% endif %}))
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_else_body
|
93
|
+
assert_equal(
|
94
|
+
["test"],
|
95
|
+
visit(%({% if 1 == 1 %}{% else %}{{ test }}{% endif %}))
|
96
|
+
)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_case_left
|
100
|
+
assert_equal(
|
101
|
+
["test"],
|
102
|
+
visit(%({% case test %}{% endcase %}))
|
103
|
+
)
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_case_condition
|
107
|
+
assert_equal(
|
108
|
+
["test"],
|
109
|
+
visit(%({% case 1 %}{% when test %}{% endcase %}))
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_case_when_body
|
114
|
+
assert_equal(
|
115
|
+
["test"],
|
116
|
+
visit(%({% case 1 %}{% when 2 %}{{ test }}{% endcase %}))
|
117
|
+
)
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_case_else_body
|
121
|
+
assert_equal(
|
122
|
+
["test"],
|
123
|
+
visit(%({% case 1 %}{% else %}{{ test }}{% endcase %}))
|
124
|
+
)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_for_in
|
128
|
+
assert_equal(
|
129
|
+
["test"],
|
130
|
+
visit(%({% for x in test %}{% endfor %}))
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_for_limit
|
135
|
+
assert_equal(
|
136
|
+
["test"],
|
137
|
+
visit(%({% for x in (1..5) limit: test %}{% endfor %}))
|
138
|
+
)
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_for_offset
|
142
|
+
assert_equal(
|
143
|
+
["test"],
|
144
|
+
visit(%({% for x in (1..5) offset: test %}{% endfor %}))
|
145
|
+
)
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_for_body
|
149
|
+
assert_equal(
|
150
|
+
["test"],
|
151
|
+
visit(%({% for x in (1..5) %}{{ test }}{% endfor %}))
|
152
|
+
)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_tablerow_in
|
156
|
+
assert_equal(
|
157
|
+
["test"],
|
158
|
+
visit(%({% tablerow x in test %}{% endtablerow %}))
|
159
|
+
)
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_tablerow_limit
|
163
|
+
assert_equal(
|
164
|
+
["test"],
|
165
|
+
visit(%({% tablerow x in (1..5) limit: test %}{% endtablerow %}))
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_tablerow_offset
|
170
|
+
assert_equal(
|
171
|
+
["test"],
|
172
|
+
visit(%({% tablerow x in (1..5) offset: test %}{% endtablerow %}))
|
173
|
+
)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_tablerow_body
|
177
|
+
assert_equal(
|
178
|
+
["test"],
|
179
|
+
visit(%({% tablerow x in (1..5) %}{{ test }}{% endtablerow %}))
|
180
|
+
)
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_cycle
|
184
|
+
assert_equal(
|
185
|
+
["test"],
|
186
|
+
visit(%({% cycle test %}))
|
187
|
+
)
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_assign
|
191
|
+
assert_equal(
|
192
|
+
["test"],
|
193
|
+
visit(%({% assign x = test %}))
|
194
|
+
)
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_capture
|
198
|
+
assert_equal(
|
199
|
+
["test"],
|
200
|
+
visit(%({% capture x %}{{ test }}{% endcapture %}))
|
201
|
+
)
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_include
|
205
|
+
assert_equal(
|
206
|
+
["test"],
|
207
|
+
visit(%({% include test %}))
|
208
|
+
)
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_include_with
|
212
|
+
assert_equal(
|
213
|
+
["test"],
|
214
|
+
visit(%({% include "hai" with test %}))
|
215
|
+
)
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_include_for
|
219
|
+
assert_equal(
|
220
|
+
["test"],
|
221
|
+
visit(%({% include "hai" for test %}))
|
222
|
+
)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_preserve_tree_structure
|
226
|
+
assert_equal(
|
227
|
+
[[nil, [
|
228
|
+
[nil, [[nil, [["other", []]]]]],
|
229
|
+
["test", []],
|
230
|
+
["xs", []],
|
231
|
+
]]],
|
232
|
+
traversal(%({% for x in xs offset: test %}{{ other }}{% endfor %})).visit
|
233
|
+
)
|
234
|
+
end
|
235
|
+
|
236
|
+
private
|
237
|
+
|
238
|
+
def traversal(template)
|
239
|
+
ParseTreeVisitor
|
240
|
+
.for(Template.parse(template).root)
|
241
|
+
.add_callback_for(VariableLookup) { |node| node.name } # rubocop:disable Style/SymbolProc
|
242
|
+
end
|
243
|
+
|
244
|
+
def visit(template)
|
245
|
+
traversal(template).visit.flatten.compact
|
246
|
+
end
|
247
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class ParserUnitTest < Minitest::Test
|
@@ -5,72 +7,72 @@ class ParserUnitTest < Minitest::Test
|
|
5
7
|
|
6
8
|
def test_consume
|
7
9
|
p = Parser.new("wat: 7")
|
8
|
-
assert_equal
|
9
|
-
assert_equal
|
10
|
-
assert_equal
|
10
|
+
assert_equal('wat', p.consume(:id))
|
11
|
+
assert_equal(':', p.consume(:colon))
|
12
|
+
assert_equal('7', p.consume(:number))
|
11
13
|
end
|
12
14
|
|
13
15
|
def test_jump
|
14
16
|
p = Parser.new("wat: 7")
|
15
17
|
p.jump(2)
|
16
|
-
assert_equal
|
18
|
+
assert_equal('7', p.consume(:number))
|
17
19
|
end
|
18
20
|
|
19
21
|
def test_consume?
|
20
22
|
p = Parser.new("wat: 7")
|
21
|
-
assert_equal
|
22
|
-
assert_equal
|
23
|
-
assert_equal
|
24
|
-
assert_equal
|
23
|
+
assert_equal('wat', p.consume?(:id))
|
24
|
+
assert_equal(false, p.consume?(:dot))
|
25
|
+
assert_equal(':', p.consume(:colon))
|
26
|
+
assert_equal('7', p.consume?(:number))
|
25
27
|
end
|
26
28
|
|
27
29
|
def test_id?
|
28
30
|
p = Parser.new("wat 6 Peter Hegemon")
|
29
|
-
assert_equal
|
30
|
-
assert_equal
|
31
|
-
assert_equal
|
32
|
-
assert_equal
|
33
|
-
assert_equal
|
31
|
+
assert_equal('wat', p.id?('wat'))
|
32
|
+
assert_equal(false, p.id?('endgame'))
|
33
|
+
assert_equal('6', p.consume(:number))
|
34
|
+
assert_equal('Peter', p.id?('Peter'))
|
35
|
+
assert_equal(false, p.id?('Achilles'))
|
34
36
|
end
|
35
37
|
|
36
38
|
def test_look
|
37
39
|
p = Parser.new("wat 6 Peter Hegemon")
|
38
|
-
assert_equal
|
39
|
-
assert_equal
|
40
|
-
assert_equal
|
41
|
-
assert_equal
|
42
|
-
assert_equal
|
43
|
-
assert_equal
|
40
|
+
assert_equal(true, p.look(:id))
|
41
|
+
assert_equal('wat', p.consume(:id))
|
42
|
+
assert_equal(false, p.look(:comparison))
|
43
|
+
assert_equal(true, p.look(:number))
|
44
|
+
assert_equal(true, p.look(:id, 1))
|
45
|
+
assert_equal(false, p.look(:number, 1))
|
44
46
|
end
|
45
47
|
|
46
48
|
def test_expressions
|
47
49
|
p = Parser.new("hi.there hi?[5].there? hi.there.bob")
|
48
|
-
assert_equal
|
49
|
-
assert_equal
|
50
|
-
assert_equal
|
50
|
+
assert_equal('hi.there', p.expression)
|
51
|
+
assert_equal('hi?[5].there?', p.expression)
|
52
|
+
assert_equal('hi.there.bob', p.expression)
|
51
53
|
|
52
54
|
p = Parser.new("567 6.0 'lol' \"wut\"")
|
53
|
-
assert_equal
|
54
|
-
assert_equal
|
55
|
-
assert_equal
|
56
|
-
assert_equal
|
55
|
+
assert_equal('567', p.expression)
|
56
|
+
assert_equal('6.0', p.expression)
|
57
|
+
assert_equal("'lol'", p.expression)
|
58
|
+
assert_equal('"wut"', p.expression)
|
57
59
|
end
|
58
60
|
|
59
61
|
def test_ranges
|
60
62
|
p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
|
61
|
-
assert_equal
|
62
|
-
assert_equal
|
63
|
-
assert_equal
|
64
|
-
assert_equal
|
63
|
+
assert_equal('(5..7)', p.expression)
|
64
|
+
assert_equal('(1.5..9.6)', p.expression)
|
65
|
+
assert_equal('(young..old)', p.expression)
|
66
|
+
assert_equal('(hi[5].wat..old)', p.expression)
|
65
67
|
end
|
66
68
|
|
67
69
|
def test_arguments
|
68
70
|
p = Parser.new("filter: hi.there[5], keyarg: 7")
|
69
|
-
assert_equal
|
70
|
-
assert_equal
|
71
|
-
assert_equal
|
72
|
-
assert_equal
|
73
|
-
assert_equal
|
71
|
+
assert_equal('filter', p.consume(:id))
|
72
|
+
assert_equal(':', p.consume(:colon))
|
73
|
+
assert_equal('hi.there[5]', p.argument)
|
74
|
+
assert_equal(',', p.consume(:comma))
|
75
|
+
assert_equal('keyarg: 7', p.argument)
|
74
76
|
end
|
75
77
|
|
76
78
|
def test_invalid_expression
|