liquid 2.6.3 → 3.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +42 -13
- data/README.md +27 -2
- data/lib/liquid.rb +11 -11
- data/lib/liquid/block.rb +75 -45
- data/lib/liquid/condition.rb +15 -11
- data/lib/liquid/context.rb +68 -29
- data/lib/liquid/document.rb +3 -3
- data/lib/liquid/drop.rb +17 -1
- data/lib/liquid/file_system.rb +17 -6
- data/lib/liquid/i18n.rb +39 -0
- data/lib/liquid/interrupts.rb +1 -1
- data/lib/liquid/lexer.rb +51 -0
- data/lib/liquid/locales/en.yml +22 -0
- data/lib/liquid/parser.rb +90 -0
- data/lib/liquid/standardfilters.rb +115 -52
- data/lib/liquid/strainer.rb +14 -4
- data/lib/liquid/tag.rb +42 -7
- data/lib/liquid/tags/assign.rb +10 -8
- data/lib/liquid/tags/break.rb +1 -1
- data/lib/liquid/tags/capture.rb +10 -8
- data/lib/liquid/tags/case.rb +13 -13
- data/lib/liquid/tags/comment.rb +9 -2
- data/lib/liquid/tags/continue.rb +1 -4
- data/lib/liquid/tags/cycle.rb +5 -7
- data/lib/liquid/tags/decrement.rb +3 -4
- data/lib/liquid/tags/for.rb +69 -36
- data/lib/liquid/tags/if.rb +52 -25
- data/lib/liquid/tags/ifchanged.rb +2 -2
- data/lib/liquid/tags/include.rb +8 -7
- data/lib/liquid/tags/increment.rb +4 -8
- data/lib/liquid/tags/raw.rb +3 -3
- data/lib/liquid/tags/table_row.rb +73 -0
- data/lib/liquid/tags/unless.rb +2 -4
- data/lib/liquid/template.rb +69 -10
- data/lib/liquid/utils.rb +13 -4
- data/lib/liquid/variable.rb +59 -8
- data/lib/liquid/version.rb +1 -1
- data/test/fixtures/en_locale.yml +9 -0
- data/test/{liquid → integration}/assign_test.rb +6 -0
- data/test/integration/blank_test.rb +106 -0
- data/test/{liquid → integration}/capture_test.rb +2 -2
- data/test/integration/context_test.rb +33 -0
- data/test/integration/drop_test.rb +245 -0
- data/test/{liquid → integration}/error_handling_test.rb +31 -2
- data/test/{liquid → integration}/filter_test.rb +7 -7
- data/test/{liquid → integration}/hash_ordering_test.rb +0 -0
- data/test/{liquid → integration}/output_test.rb +12 -12
- data/test/integration/parsing_quirks_test.rb +94 -0
- data/test/{liquid → integration}/security_test.rb +9 -9
- data/test/{liquid → integration}/standard_filter_test.rb +103 -33
- data/test/{liquid → integration}/tags/break_tag_test.rb +0 -0
- data/test/{liquid → integration}/tags/continue_tag_test.rb +0 -0
- data/test/{liquid → integration}/tags/for_tag_test.rb +78 -0
- data/test/{liquid → integration}/tags/if_else_tag_test.rb +1 -1
- data/test/integration/tags/include_tag_test.rb +212 -0
- data/test/{liquid → integration}/tags/increment_tag_test.rb +0 -0
- data/test/{liquid → integration}/tags/raw_tag_test.rb +1 -0
- data/test/{liquid → integration}/tags/standard_tag_test.rb +24 -22
- data/test/integration/tags/statements_test.rb +113 -0
- data/test/{liquid/tags/html_tag_test.rb → integration/tags/table_row_test.rb} +5 -5
- data/test/{liquid → integration}/tags/unless_else_tag_test.rb +0 -0
- data/test/{liquid → integration}/template_test.rb +66 -42
- data/test/integration/variable_test.rb +72 -0
- data/test/test_helper.rb +32 -7
- data/test/{liquid/block_test.rb → unit/block_unit_test.rb} +1 -1
- data/test/{liquid/condition_test.rb → unit/condition_unit_test.rb} +19 -1
- data/test/{liquid/context_test.rb → unit/context_unit_test.rb} +27 -19
- data/test/{liquid/file_system_test.rb → unit/file_system_unit_test.rb} +7 -1
- data/test/unit/i18n_unit_test.rb +37 -0
- data/test/unit/lexer_unit_test.rb +48 -0
- data/test/{liquid/module_ex_test.rb → unit/module_ex_unit_test.rb} +7 -7
- data/test/unit/parser_unit_test.rb +82 -0
- data/test/{liquid/regexp_test.rb → unit/regexp_unit_test.rb} +3 -3
- data/test/{liquid/strainer_test.rb → unit/strainer_unit_test.rb} +19 -1
- data/test/unit/tag_unit_test.rb +11 -0
- data/test/unit/tags/case_tag_unit_test.rb +10 -0
- data/test/unit/tags/for_tag_unit_test.rb +13 -0
- data/test/unit/tags/if_tag_unit_test.rb +8 -0
- data/test/unit/template_unit_test.rb +69 -0
- data/test/unit/tokenizer_unit_test.rb +29 -0
- data/test/{liquid/variable_test.rb → unit/variable_unit_test.rb} +17 -67
- metadata +117 -73
- data/lib/extras/liquid_view.rb +0 -51
- data/lib/liquid/htmltags.rb +0 -73
- data/test/liquid/drop_test.rb +0 -180
- data/test/liquid/parsing_quirks_test.rb +0 -52
- data/test/liquid/tags/include_tag_test.rb +0 -166
- data/test/liquid/tags/statements_test.rb +0 -134
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class FileSystemUnitTest < Test::Unit::TestCase
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
def test_default
|
@@ -26,4 +26,10 @@ class FileSystemTest < Test::Unit::TestCase
|
|
26
26
|
file_system.full_path("/etc/passwd")
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
def test_custom_template_filename_patterns
|
31
|
+
file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
|
32
|
+
assert_equal "/some/path/mypartial.html" , file_system.full_path("mypartial")
|
33
|
+
assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial")
|
34
|
+
end
|
29
35
|
end # FileSystemTest
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class I18nUnitTest < Test::Unit::TestCase
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@i18n = I18n.new(fixture("en_locale.yml"))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_simple_translate_string
|
11
|
+
assert_equal "less is more", @i18n.translate("simple")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_nested_translate_string
|
15
|
+
assert_equal "something wasn't right", @i18n.translate("errors.syntax.oops")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_single_string_interpolation
|
19
|
+
assert_equal "something different", @i18n.translate("whatever", :something => "different")
|
20
|
+
end
|
21
|
+
|
22
|
+
# def test_raises_translation_error_on_undefined_interpolation_key
|
23
|
+
# assert_raise I18n::TranslationError do
|
24
|
+
# @i18n.translate("whatever", :oopstypos => "yes")
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
def test_raises_unknown_translation
|
29
|
+
assert_raise I18n::TranslationError do
|
30
|
+
@i18n.translate("doesnt_exist")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_sets_default_path_to_en
|
35
|
+
assert_equal I18n::DEFAULT_LOCALE, I18n.new.path
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LexerUnitTest < Test::Unit::TestCase
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_strings
|
7
|
+
tokens = Lexer.new(%! 'this is a test""' "wat 'lol'"!).tokenize
|
8
|
+
assert_equal [[:string,%!'this is a test""'!], [:string, %!"wat 'lol'"!], [:end_of_string]], tokens
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_integer
|
12
|
+
tokens = Lexer.new('hi 50').tokenize
|
13
|
+
assert_equal [[:id,'hi'], [:number, '50'], [:end_of_string]], tokens
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_float
|
17
|
+
tokens = Lexer.new('hi 5.0').tokenize
|
18
|
+
assert_equal [[:id,'hi'], [:number, '5.0'], [:end_of_string]], tokens
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_comparison
|
22
|
+
tokens = Lexer.new('== <> contains').tokenize
|
23
|
+
assert_equal [[:comparison,'=='], [:comparison, '<>'], [:comparison, 'contains'], [:end_of_string]], tokens
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_specials
|
27
|
+
tokens = Lexer.new('| .:').tokenize
|
28
|
+
assert_equal [[:pipe, '|'], [:dot, '.'], [:colon, ':'], [:end_of_string]], tokens
|
29
|
+
tokens = Lexer.new('[,]').tokenize
|
30
|
+
assert_equal [[:open_square, '['], [:comma, ','], [:close_square, ']'], [:end_of_string]], tokens
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_fancy_identifiers
|
34
|
+
tokens = Lexer.new('hi! five?').tokenize
|
35
|
+
assert_equal [[:id,'hi!'], [:id, 'five?'], [:end_of_string]], tokens
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_whitespace
|
39
|
+
tokens = Lexer.new("five|\n\t ==").tokenize
|
40
|
+
assert_equal [[:id,'five'], [:pipe, '|'], [:comparison, '=='], [:end_of_string]], tokens
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_unexpected_character
|
44
|
+
assert_raises(SyntaxError) do
|
45
|
+
Lexer.new("%").tokenize
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -36,7 +36,7 @@ class TestClassC::LiquidDropClass
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
class
|
39
|
+
class ModuleExUnitTest < Test::Unit::TestCase
|
40
40
|
include Liquid
|
41
41
|
|
42
42
|
def setup
|
@@ -77,11 +77,11 @@ class ModuleExTest < Test::Unit::TestCase
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def test_should_use_regular_objects_as_drops
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
80
|
+
assert_template_result 'allowedA', "{{ a.allowedA }}", 'a'=>@a
|
81
|
+
assert_template_result 'allowedB', "{{ a.chainedB.allowedB }}", 'a'=>@a
|
82
|
+
assert_template_result 'allowedC', "{{ a.chainedB.chainedC.allowedC }}", 'a'=>@a
|
83
|
+
assert_template_result 'another_allowedC', "{{ a.chainedB.chainedC.another_allowedC }}", 'a'=>@a
|
84
|
+
assert_template_result '', "{{ a.restricted }}", 'a'=>@a
|
85
|
+
assert_template_result '', "{{ a.unknown }}", 'a'=>@a
|
86
86
|
end
|
87
87
|
end # ModuleExTest
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ParserUnitTest < Test::Unit::TestCase
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_consume
|
7
|
+
p = Parser.new("wat: 7")
|
8
|
+
assert_equal 'wat', p.consume(:id)
|
9
|
+
assert_equal ':', p.consume(:colon)
|
10
|
+
assert_equal '7', p.consume(:number)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_jump
|
14
|
+
p = Parser.new("wat: 7")
|
15
|
+
p.jump(2)
|
16
|
+
assert_equal '7', p.consume(:number)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_consume?
|
20
|
+
p = Parser.new("wat: 7")
|
21
|
+
assert_equal 'wat', p.consume?(:id)
|
22
|
+
assert_equal false, p.consume?(:dot)
|
23
|
+
assert_equal ':', p.consume(:colon)
|
24
|
+
assert_equal '7', p.consume?(:number)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_id?
|
28
|
+
p = Parser.new("wat 6 Peter Hegemon")
|
29
|
+
assert_equal 'wat', p.id?('wat')
|
30
|
+
assert_equal false, p.id?('endgame')
|
31
|
+
assert_equal '6', p.consume(:number)
|
32
|
+
assert_equal 'Peter', p.id?('Peter')
|
33
|
+
assert_equal false, p.id?('Achilles')
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_look
|
37
|
+
p = Parser.new("wat 6 Peter Hegemon")
|
38
|
+
assert_equal true, p.look(:id)
|
39
|
+
assert_equal 'wat', p.consume(:id)
|
40
|
+
assert_equal false, p.look(:comparison)
|
41
|
+
assert_equal true, p.look(:number)
|
42
|
+
assert_equal true, p.look(:id, 1)
|
43
|
+
assert_equal false, p.look(:number, 1)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_expressions
|
47
|
+
p = Parser.new("hi.there hi[5].! hi.there.bob")
|
48
|
+
assert_equal 'hi.there', p.expression
|
49
|
+
assert_equal 'hi[5].!', p.expression
|
50
|
+
assert_equal 'hi.there.bob', p.expression
|
51
|
+
|
52
|
+
p = Parser.new("567 6.0 'lol' \"wut\"")
|
53
|
+
assert_equal '567', p.expression
|
54
|
+
assert_equal '6.0', p.expression
|
55
|
+
assert_equal "'lol'", p.expression
|
56
|
+
assert_equal '"wut"', p.expression
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_ranges
|
60
|
+
p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
|
61
|
+
assert_equal '(5..7)', p.expression
|
62
|
+
assert_equal '(1.5..9.6)', p.expression
|
63
|
+
assert_equal '(young..old)', p.expression
|
64
|
+
assert_equal '(hi[5].wat..old)', p.expression
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_arguments
|
68
|
+
p = Parser.new("filter: hi.there[5], keyarg: 7")
|
69
|
+
assert_equal 'filter', p.consume(:id)
|
70
|
+
assert_equal ':', p.consume(:colon)
|
71
|
+
assert_equal 'hi.there[5]', p.argument
|
72
|
+
assert_equal ',', p.consume(:comma)
|
73
|
+
assert_equal 'keyarg: 7', p.argument
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_invalid_expression
|
77
|
+
assert_raises(SyntaxError) do
|
78
|
+
p = Parser.new("==")
|
79
|
+
p.expression
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class RegexpUnitTest < Test::Unit::TestCase
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
def test_empty
|
@@ -21,11 +21,11 @@ class RegexpTest < Test::Unit::TestCase
|
|
21
21
|
assert_equal ['<style', 'class="hello">', '</style>'], %|<style class="hello">' </style>|.scan(QuotedFragment)
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def test_double_quoted_words
|
25
25
|
assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment)
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def test_single_quoted_words
|
29
29
|
assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment)
|
30
30
|
end
|
31
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class StrainerUnitTest < Test::Unit::TestCase
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
module AccessScopeFilters
|
@@ -22,6 +22,13 @@ class StrainerTest < Test::Unit::TestCase
|
|
22
22
|
assert_equal "public", strainer.invoke("public_filter")
|
23
23
|
end
|
24
24
|
|
25
|
+
def test_stainer_raises_argument_error
|
26
|
+
strainer = Strainer.create(nil)
|
27
|
+
assert_raises(Liquid::ArgumentError) do
|
28
|
+
strainer.invoke("public_filter", 1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
25
32
|
def test_strainer_only_invokes_public_filter_methods
|
26
33
|
strainer = Strainer.create(nil)
|
27
34
|
assert_equal false, strainer.invokable?('__test__')
|
@@ -49,4 +56,15 @@ class StrainerTest < Test::Unit::TestCase
|
|
49
56
|
assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke")
|
50
57
|
end
|
51
58
|
|
59
|
+
def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
|
60
|
+
a, b = Module.new, Module.new
|
61
|
+
strainer = Strainer.create(nil, [a,b])
|
62
|
+
assert_kind_of Strainer, strainer
|
63
|
+
assert_kind_of a, strainer
|
64
|
+
assert_kind_of b, strainer
|
65
|
+
Strainer.class_variable_get(:@@filters).each do |m|
|
66
|
+
assert_kind_of m, strainer
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
52
70
|
end # StrainerTest
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CaseTagUnitTest < Test::Unit::TestCase
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_case_nodelist
|
7
|
+
template = Liquid::Template.parse('{% case var %}{% when true %}WHEN{% else %}ELSE{% endcase %}')
|
8
|
+
assert_equal ['WHEN', 'ELSE'], template.root.nodelist[0].nodelist
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ForTagUnitTest < Test::Unit::TestCase
|
4
|
+
def test_for_nodelist
|
5
|
+
template = Liquid::Template.parse('{% for item in items %}FOR{% endfor %}')
|
6
|
+
assert_equal ['FOR'], template.root.nodelist[0].nodelist
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_for_else_nodelist
|
10
|
+
template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}')
|
11
|
+
assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TemplateUnitTest < Test::Unit::TestCase
|
4
|
+
include Liquid
|
5
|
+
|
6
|
+
def test_sets_default_localization_in_document
|
7
|
+
t = Template.new
|
8
|
+
t.parse('')
|
9
|
+
assert_instance_of I18n, t.root.options[:locale]
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_sets_default_localization_in_context_with_quick_initialization
|
13
|
+
t = Template.new
|
14
|
+
t.parse('{{foo}}', :locale => I18n.new(fixture("en_locale.yml")))
|
15
|
+
|
16
|
+
assert_instance_of I18n, t.root.options[:locale]
|
17
|
+
assert_equal fixture("en_locale.yml"), t.root.options[:locale].path
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_with_cache_classes_tags_returns_the_same_class
|
21
|
+
original_cache_setting = Liquid.cache_classes
|
22
|
+
Liquid.cache_classes = true
|
23
|
+
|
24
|
+
original_klass = Class.new
|
25
|
+
Object.send(:const_set, :CustomTag, original_klass)
|
26
|
+
Template.register_tag('custom', CustomTag)
|
27
|
+
|
28
|
+
Object.send(:remove_const, :CustomTag)
|
29
|
+
|
30
|
+
new_klass = Class.new
|
31
|
+
Object.send(:const_set, :CustomTag, new_klass)
|
32
|
+
|
33
|
+
assert Template.tags['custom'].equal?(original_klass)
|
34
|
+
ensure
|
35
|
+
Object.send(:remove_const, :CustomTag)
|
36
|
+
Template.tags.delete('custom')
|
37
|
+
Liquid.cache_classes = original_cache_setting
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_without_cache_classes_tags_reloads_the_class
|
41
|
+
original_cache_setting = Liquid.cache_classes
|
42
|
+
Liquid.cache_classes = false
|
43
|
+
|
44
|
+
original_klass = Class.new
|
45
|
+
Object.send(:const_set, :CustomTag, original_klass)
|
46
|
+
Template.register_tag('custom', CustomTag)
|
47
|
+
|
48
|
+
Object.send(:remove_const, :CustomTag)
|
49
|
+
|
50
|
+
new_klass = Class.new
|
51
|
+
Object.send(:const_set, :CustomTag, new_klass)
|
52
|
+
|
53
|
+
assert Template.tags['custom'].equal?(new_klass)
|
54
|
+
ensure
|
55
|
+
Object.send(:remove_const, :CustomTag)
|
56
|
+
Template.tags.delete('custom')
|
57
|
+
Liquid.cache_classes = original_cache_setting
|
58
|
+
end
|
59
|
+
|
60
|
+
class FakeTag; end
|
61
|
+
|
62
|
+
def test_tags_delete
|
63
|
+
Template.register_tag('fake', FakeTag)
|
64
|
+
assert_equal FakeTag, Template.tags['fake']
|
65
|
+
|
66
|
+
Template.tags.delete('fake')
|
67
|
+
assert_nil Template.tags['fake']
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TokenizerTest < Test::Unit::TestCase
|
4
|
+
def test_tokenize_strings
|
5
|
+
assert_equal [' '], tokenize(' ')
|
6
|
+
assert_equal ['hello world'], tokenize('hello world')
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_tokenize_variables
|
10
|
+
assert_equal ['{{funk}}'], tokenize('{{funk}}')
|
11
|
+
assert_equal [' ', '{{funk}}', ' '], tokenize(' {{funk}} ')
|
12
|
+
assert_equal [' ', '{{funk}}', ' ', '{{so}}', ' ', '{{brother}}', ' '], tokenize(' {{funk}} {{so}} {{brother}} ')
|
13
|
+
assert_equal [' ', '{{ funk }}', ' '], tokenize(' {{ funk }} ')
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_tokenize_blocks
|
17
|
+
assert_equal ['{%comment%}'], tokenize('{%comment%}')
|
18
|
+
assert_equal [' ', '{%comment%}', ' '], tokenize(' {%comment%} ')
|
19
|
+
|
20
|
+
assert_equal [' ', '{%comment%}', ' ', '{%endcomment%}', ' '], tokenize(' {%comment%} {%endcomment%} ')
|
21
|
+
assert_equal [' ', '{% comment %}', ' ', '{% endcomment %}', ' '], tokenize(" {% comment %} {% endcomment %} ")
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def tokenize(source)
|
27
|
+
Liquid::Template.new.send(:tokenize, source)
|
28
|
+
end
|
29
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
3
|
+
class VariableUnitTest < Test::Unit::TestCase
|
4
4
|
include Liquid
|
5
5
|
|
6
6
|
def test_variable
|
@@ -73,8 +73,14 @@ class VariableTest < Test::Unit::TestCase
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_symbol
|
76
|
-
var = Variable.new("http://disney.com/logo.gif | image: 'med' ")
|
77
|
-
assert_equal
|
76
|
+
var = Variable.new("http://disney.com/logo.gif | image: 'med' ", :error_mode => :lax)
|
77
|
+
assert_equal "http://disney.com/logo.gif", var.name
|
78
|
+
assert_equal [["image",["'med'"]]], var.filters
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_string_to_filter
|
82
|
+
var = Variable.new("'http://disney.com/logo.gif' | image: 'med' ")
|
83
|
+
assert_equal "'http://disney.com/logo.gif'", var.name
|
78
84
|
assert_equal [["image",["'med'"]]], var.filters
|
79
85
|
end
|
80
86
|
|
@@ -115,72 +121,16 @@ class VariableTest < Test::Unit::TestCase
|
|
115
121
|
end
|
116
122
|
|
117
123
|
def test_lax_filter_argument_parsing
|
118
|
-
var = Variable.new(%! number_of_comments | pluralize: 'comment': 'comments'
|
124
|
+
var = Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !, :error_mode => :lax)
|
119
125
|
assert_equal 'number_of_comments', var.name
|
120
126
|
assert_equal [['pluralize',["'comment'","'comments'"]]], var.filters
|
121
127
|
end
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
class VariableResolutionTest < Test::Unit::TestCase
|
126
|
-
include Liquid
|
127
|
-
|
128
|
-
def test_simple_variable
|
129
|
-
template = Template.parse(%|{{test}}|)
|
130
|
-
assert_equal 'worked', template.render('test' => 'worked')
|
131
|
-
assert_equal 'worked wonderfully', template.render('test' => 'worked wonderfully')
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_simple_with_whitespaces
|
135
|
-
template = Template.parse(%| {{ test }} |)
|
136
|
-
assert_equal ' worked ', template.render('test' => 'worked')
|
137
|
-
assert_equal ' worked wonderfully ', template.render('test' => 'worked wonderfully')
|
138
|
-
end
|
139
128
|
|
140
|
-
def
|
141
|
-
|
142
|
-
|
129
|
+
def test_strict_filter_argument_parsing
|
130
|
+
with_error_mode(:strict) do
|
131
|
+
assert_raises(SyntaxError) do
|
132
|
+
Variable.new(%! number_of_comments | pluralize: 'comment': 'comments' !)
|
133
|
+
end
|
134
|
+
end
|
143
135
|
end
|
144
|
-
|
145
|
-
def test_hash_scoping
|
146
|
-
template = Template.parse(%|{{ test.test }}|)
|
147
|
-
assert_equal 'worked', template.render('test' => {'test' => 'worked'})
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_preset_assigns
|
151
|
-
template = Template.parse(%|{{ test }}|)
|
152
|
-
template.assigns['test'] = 'worked'
|
153
|
-
assert_equal 'worked', template.render
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_reuse_parsed_template
|
157
|
-
template = Template.parse(%|{{ greeting }} {{ name }}|)
|
158
|
-
template.assigns['greeting'] = 'Goodbye'
|
159
|
-
assert_equal 'Hello Tobi', template.render('greeting' => 'Hello', 'name' => 'Tobi')
|
160
|
-
assert_equal 'Hello ', template.render('greeting' => 'Hello', 'unknown' => 'Tobi')
|
161
|
-
assert_equal 'Hello Brian', template.render('greeting' => 'Hello', 'name' => 'Brian')
|
162
|
-
assert_equal 'Goodbye Brian', template.render('name' => 'Brian')
|
163
|
-
assert_equal({'greeting'=>'Goodbye'}, template.assigns)
|
164
|
-
end
|
165
|
-
|
166
|
-
def test_assigns_not_polluted_from_template
|
167
|
-
template = Template.parse(%|{{ test }}{% assign test = 'bar' %}{{ test }}|)
|
168
|
-
template.assigns['test'] = 'baz'
|
169
|
-
assert_equal 'bazbar', template.render
|
170
|
-
assert_equal 'bazbar', template.render
|
171
|
-
assert_equal 'foobar', template.render('test' => 'foo')
|
172
|
-
assert_equal 'bazbar', template.render
|
173
|
-
end
|
174
|
-
|
175
|
-
def test_hash_with_default_proc
|
176
|
-
template = Template.parse(%|Hello {{ test }}|)
|
177
|
-
assigns = Hash.new { |h,k| raise "Unknown variable '#{k}'" }
|
178
|
-
assigns['test'] = 'Tobi'
|
179
|
-
assert_equal 'Hello Tobi', template.render!(assigns)
|
180
|
-
assigns.delete('test')
|
181
|
-
e = assert_raises(RuntimeError) {
|
182
|
-
template.render!(assigns)
|
183
|
-
}
|
184
|
-
assert_equal "Unknown variable 'test'", e.message
|
185
|
-
end
|
186
|
-
end # VariableTest
|
136
|
+
end
|