liquid 1.9.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/Manifest.txt +0 -31
  2. data/Rakefile +1 -1
  3. data/lib/extras/liquid_view.rb +15 -2
  4. data/lib/liquid.rb +15 -15
  5. data/lib/liquid/block.rb +1 -2
  6. data/lib/liquid/context.rb +89 -99
  7. data/lib/liquid/drop.rb +6 -4
  8. data/lib/liquid/errors.rb +1 -0
  9. data/lib/liquid/standardfilters.rb +56 -11
  10. data/lib/liquid/strainer.rb +1 -1
  11. data/lib/liquid/tags/assign.rb +1 -1
  12. data/lib/liquid/tags/case.rb +2 -2
  13. data/lib/liquid/tags/cycle.rb +3 -4
  14. data/lib/liquid/tags/for.rb +53 -35
  15. data/lib/liquid/tags/if.rb +3 -3
  16. data/lib/liquid/template.rb +8 -7
  17. data/lib/liquid/variable.rb +10 -11
  18. metadata +5 -35
  19. data/example/server/example_servlet.rb +0 -37
  20. data/example/server/liquid_servlet.rb +0 -28
  21. data/example/server/server.rb +0 -12
  22. data/example/server/templates/index.liquid +0 -6
  23. data/example/server/templates/products.liquid +0 -45
  24. data/test/block_test.rb +0 -58
  25. data/test/condition_test.rb +0 -109
  26. data/test/context_test.rb +0 -418
  27. data/test/drop_test.rb +0 -141
  28. data/test/error_handling_test.rb +0 -78
  29. data/test/extra/breakpoint.rb +0 -547
  30. data/test/extra/caller.rb +0 -80
  31. data/test/file_system_test.rb +0 -30
  32. data/test/filter_test.rb +0 -98
  33. data/test/helper.rb +0 -20
  34. data/test/html_tag_test.rb +0 -31
  35. data/test/if_else_test.rb +0 -127
  36. data/test/include_tag_test.rb +0 -114
  37. data/test/module_ex_test.rb +0 -89
  38. data/test/output_test.rb +0 -121
  39. data/test/parsing_quirks_test.rb +0 -29
  40. data/test/regexp_test.rb +0 -40
  41. data/test/security_test.rb +0 -41
  42. data/test/standard_filter_test.rb +0 -126
  43. data/test/standard_tag_test.rb +0 -383
  44. data/test/statements_test.rb +0 -137
  45. data/test/strainer_test.rb +0 -16
  46. data/test/template_test.rb +0 -26
  47. data/test/unless_else_test.rb +0 -27
  48. data/test/variable_test.rb +0 -135
@@ -1,37 +0,0 @@
1
- module ProductsFilter
2
- def price(integer)
3
- sprintf("$%.2d USD", integer / 100.0)
4
- end
5
-
6
- def prettyprint(text)
7
- text.gsub( /\*(.*)\*/, '<b>\1</b>' )
8
- end
9
-
10
- def count(array)
11
- array.size
12
- end
13
-
14
- def paragraph(p)
15
- "<p>#{p}</p>"
16
- end
17
- end
18
-
19
- class Servlet < LiquidServlet
20
-
21
- def index
22
- { 'date' => Time.now }
23
- end
24
-
25
- def products
26
- { 'products' => products_list, 'section' => 'Snowboards', 'cool_products' => true}
27
- end
28
-
29
- private
30
-
31
- def products_list
32
- [{'name' => 'Arbor Draft', 'price' => 39900, 'description' => 'the *arbor draft* is a excellent product' },
33
- {'name' => 'Arbor Element', 'price' => 40000, 'description' => 'the *arbor element* rocks for freestyling'},
34
- {'name' => 'Arbor Diamond', 'price' => 59900, 'description' => 'the *arbor diamond* is a made up product because im obsessed with arbor and have no creativity'}]
35
- end
36
-
37
- end
@@ -1,28 +0,0 @@
1
- class LiquidServlet < WEBrick::HTTPServlet::AbstractServlet
2
-
3
- def do_GET(req, res)
4
- handle(:get, req, res)
5
- end
6
-
7
- def do_POST(req, res)
8
- handle(:post, req, res)
9
- end
10
-
11
- private
12
-
13
- def handle(type, req, res)
14
- @request, @response = req, res
15
-
16
- @request.path_info =~ /(\w+)$/
17
- @action = $1 || 'index'
18
- @assigns = send(@action) if respond_to?(@action)
19
-
20
- @response['Content-Type'] = "text/html"
21
- @response.status = 200
22
- @response.body = Liquid::Template.parse(read_template).render(@assigns, :filters => [ProductsFilter])
23
- end
24
-
25
- def read_template(filename = @action)
26
- File.read( File.dirname(__FILE__) + "/templates/#{filename}.liquid" )
27
- end
28
- end
@@ -1,12 +0,0 @@
1
- require 'webrick'
2
- require 'rexml/document'
3
-
4
- require File.dirname(__FILE__) + '/../../lib/liquid'
5
- require File.dirname(__FILE__) + '/liquid_servlet'
6
- require File.dirname(__FILE__) + '/example_servlet'
7
-
8
- # Setup webrick
9
- server = WEBrick::HTTPServer.new( :Port => ARGV[1] || 3000 )
10
- server.mount('/', Servlet)
11
- trap("INT"){ server.shutdown }
12
- server.start
@@ -1,6 +0,0 @@
1
- <p>Hello world!</p>
2
-
3
- <p>It is {{date}}</p>
4
-
5
-
6
- <p>Check out the <a href="http://localhost:3000/products">Products</a> screen </p>
@@ -1,45 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
- <head>
6
- <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
7
- <meta http-equiv="Content-Language" content="en-us" />
8
-
9
- <title>products</title>
10
-
11
- <meta name="ROBOTS" content="ALL" />
12
- <meta http-equiv="imagetoolbar" content="no" />
13
- <meta name="MSSmartTagsPreventParsing" content="true" />
14
- <meta name="Copyright" content="(c) 2005 Copyright content: Copyright design: Tobias Luetke" />
15
- <!-- (c) Copyright 2005 by Tobias Luetke All Rights Reserved. -->
16
- </head>
17
-
18
- <body>
19
-
20
- <h1>There are currently {{products | count}} products in the {{section}} catalog</h1>
21
-
22
- {% if cool_products %}
23
- Cool products :)
24
- {% else %}
25
- Uncool products :(
26
- {% endif %}
27
-
28
- <ul id="products">
29
-
30
- {% for product in products %}
31
- <li>
32
- <h2>{{product.name}}</h2>
33
- Only {{product.price | price }}
34
-
35
- {{product.description | prettyprint | paragraph }}
36
-
37
- {{ 'it rocks!' | paragraph }}
38
-
39
- </li>
40
- {% endfor %}
41
-
42
- </ul>
43
-
44
- </body>
45
- </html>
@@ -1,58 +0,0 @@
1
- require File.dirname(__FILE__) + '/helper'
2
-
3
- class VariableTest < Test::Unit::TestCase
4
- include Liquid
5
-
6
- def test_blankspace
7
- template = Liquid::Template.parse(" ")
8
- assert_equal [" "], template.root.nodelist
9
- end
10
-
11
- def test_variable_beginning
12
- template = Liquid::Template.parse("{{funk}} ")
13
- assert_equal 2, template.root.nodelist.size
14
- assert_equal Variable, template.root.nodelist[0].class
15
- assert_equal String, template.root.nodelist[1].class
16
- end
17
-
18
- def test_variable_end
19
- template = Liquid::Template.parse(" {{funk}}")
20
- assert_equal 2, template.root.nodelist.size
21
- assert_equal String, template.root.nodelist[0].class
22
- assert_equal Variable, template.root.nodelist[1].class
23
- end
24
-
25
- def test_variable_middle
26
- template = Liquid::Template.parse(" {{funk}} ")
27
- assert_equal 3, template.root.nodelist.size
28
- assert_equal String, template.root.nodelist[0].class
29
- assert_equal Variable, template.root.nodelist[1].class
30
- assert_equal String, template.root.nodelist[2].class
31
- end
32
-
33
- def test_variable_many_embedded_fragments
34
- template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ")
35
- assert_equal 7, template.root.nodelist.size
36
- assert_equal [String, Variable, String, Variable, String, Variable, String], block_types(template.root.nodelist)
37
- end
38
-
39
- def test_with_block
40
- template = Liquid::Template.parse(" {% comment %} {% endcomment %} ")
41
- assert_equal [String, Comment, String], block_types(template.root.nodelist)
42
- assert_equal 3, template.root.nodelist.size
43
- end
44
-
45
- def test_with_custom_tag
46
- Liquid::Template.register_tag("testtag", Block)
47
-
48
- assert_nothing_thrown do
49
- template = Liquid::Template.parse( "{% testtag %} {% endtesttag %}")
50
- end
51
- end
52
-
53
- private
54
-
55
- def block_types(nodelist)
56
- nodelist.collect { |node| node.class }
57
- end
58
- end
@@ -1,109 +0,0 @@
1
- require File.dirname(__FILE__) + '/helper'
2
-
3
- class ConditionTest < Test::Unit::TestCase
4
- include Liquid
5
-
6
- def test_basic_condition
7
- assert_equal false, Condition.new('1', '==', '2').evaluate
8
- assert_equal true, Condition.new('1', '==', '1').evaluate
9
- end
10
-
11
- def test_default_operators_evalute_true
12
- assert_evalutes_true '1', '==', '1'
13
- assert_evalutes_true '1', '!=', '2'
14
- assert_evalutes_true '1', '<>', '2'
15
- assert_evalutes_true '1', '<', '2'
16
- assert_evalutes_true '2', '>', '1'
17
- assert_evalutes_true '1', '>=', '1'
18
- assert_evalutes_true '2', '>=', '1'
19
- assert_evalutes_true '1', '<=', '2'
20
- assert_evalutes_true '1', '<=', '1'
21
- end
22
-
23
- def test_default_operators_evalute_false
24
- assert_evalutes_false '1', '==', '2'
25
- assert_evalutes_false '1', '!=', '1'
26
- assert_evalutes_false '1', '<>', '1'
27
- assert_evalutes_false '1', '<', '0'
28
- assert_evalutes_false '2', '>', '4'
29
- assert_evalutes_false '1', '>=', '3'
30
- assert_evalutes_false '2', '>=', '4'
31
- assert_evalutes_false '1', '<=', '0'
32
- assert_evalutes_false '1', '<=', '0'
33
- end
34
-
35
- def test_contains_works_on_strings
36
- assert_evalutes_true "'bob'", 'contains', "'o'"
37
- assert_evalutes_true "'bob'", 'contains', "'b'"
38
- assert_evalutes_true "'bob'", 'contains', "'bo'"
39
- assert_evalutes_true "'bob'", 'contains', "'ob'"
40
- assert_evalutes_true "'bob'", 'contains', "'bob'"
41
-
42
- assert_evalutes_false "'bob'", 'contains', "'bob2'"
43
- assert_evalutes_false "'bob'", 'contains', "'a'"
44
- assert_evalutes_false "'bob'", 'contains', "'---'"
45
- end
46
-
47
- def test_contains_works_on_arrays
48
- @context = Liquid::Context.new
49
- @context['array'] = [1,2,3,4,5]
50
-
51
- assert_evalutes_false "array", 'contains', '0'
52
- assert_evalutes_true "array", 'contains', '1'
53
- assert_evalutes_true "array", 'contains', '2'
54
- assert_evalutes_true "array", 'contains', '3'
55
- assert_evalutes_true "array", 'contains', '4'
56
- assert_evalutes_true "array", 'contains', '5'
57
- assert_evalutes_false "array", 'contains', '6'
58
-
59
- assert_evalutes_false "array", 'contains', '"1"'
60
-
61
- end
62
-
63
- def test_or_condition
64
- condition = Condition.new('1', '==', '2')
65
-
66
- assert_equal false, condition.evaluate
67
-
68
- condition.or Condition.new('2', '==', '1')
69
-
70
- assert_equal false, condition.evaluate
71
-
72
- condition.or Condition.new('1', '==', '1')
73
-
74
- assert_equal true, condition.evaluate
75
- end
76
-
77
- def test_and_condition
78
- condition = Condition.new('1', '==', '1')
79
-
80
- assert_equal true, condition.evaluate
81
-
82
- condition.and Condition.new('2', '==', '2')
83
-
84
- assert_equal true, condition.evaluate
85
-
86
- condition.and Condition.new('2', '==', '1')
87
-
88
- assert_equal false, condition.evaluate
89
- end
90
-
91
-
92
- def test_should_allow_custom_proc_operator
93
- Condition.operators['starts_with'] = Proc.new { |cond, left, right| left =~ %r{^#{right}}}
94
-
95
- assert_evalutes_true "'bob'", 'starts_with', "'b'"
96
- assert_evalutes_false "'bob'", 'starts_with', "'o'"
97
- ensure
98
- Condition.operators.delete 'starts_with'
99
- end
100
-
101
- private
102
- def assert_evalutes_true(left, op, right)
103
- assert Condition.new(left, op, right).evaluate(@context || Liquid::Context.new), "Evaluated false: #{left} #{op} #{right}"
104
- end
105
-
106
- def assert_evalutes_false(left, op, right)
107
- assert !Condition.new(left, op, right).evaluate(@context || Liquid::Context.new), "Evaluated true: #{left} #{op} #{right}"
108
- end
109
- end
@@ -1,418 +0,0 @@
1
- require File.dirname(__FILE__) + '/helper'
2
- class HundredCentes
3
- def to_liquid
4
- 100
5
- end
6
- end
7
-
8
- class CentsDrop < Liquid::Drop
9
- def amount
10
- HundredCentes.new
11
- end
12
-
13
- def non_zero?
14
- true
15
- end
16
- end
17
-
18
- class ContextSensitiveDrop < Liquid::Drop
19
- def test
20
- @context['test']
21
- end
22
- end
23
-
24
- class Category < Liquid::Drop
25
- attr_accessor :name
26
-
27
- def initialize(name)
28
- @name = name
29
- end
30
-
31
- def to_liquid
32
- CategoryDrop.new(self)
33
- end
34
- end
35
-
36
- class CategoryDrop
37
- attr_accessor :category, :context
38
- def initialize(category)
39
- @category = category
40
- end
41
- end
42
-
43
-
44
- class ContextTest < Test::Unit::TestCase
45
- include Liquid
46
-
47
- def setup
48
- @template = Liquid::Template.new
49
- @context = Liquid::Context.new(@template.assigns, @template.registers)
50
- end
51
-
52
- def test_variables
53
- @context['string'] = 'string'
54
- assert_equal 'string', @context['string']
55
-
56
- @context['num'] = 5
57
- assert_equal 5, @context['num']
58
-
59
- @context['time'] = Time.parse('2006-06-06 12:00:00')
60
- assert_equal Time.parse('2006-06-06 12:00:00'), @context['time']
61
-
62
- @context['date'] = Date.today
63
- assert_equal Date.today, @context['date']
64
-
65
- now = DateTime.now
66
- @context['datetime'] = now
67
- assert_equal now, @context['datetime']
68
-
69
- @context['bool'] = true
70
- assert_equal true, @context['bool']
71
-
72
- @context['bool'] = false
73
- assert_equal false, @context['bool']
74
-
75
- @context['nil'] = nil
76
- assert_equal nil, @context['nil']
77
- assert_equal nil, @context['nil']
78
- end
79
-
80
- def test_variables_not_existing
81
- assert_equal nil, @context['does_not_exist']
82
- end
83
-
84
- def test_scoping
85
- assert_nothing_raised do
86
- @context.push
87
- @context.pop
88
- end
89
-
90
- assert_raise(Liquid::ContextError) do
91
- @context.pop
92
- end
93
-
94
- assert_raise(Liquid::ContextError) do
95
- @context.push
96
- @context.pop
97
- @context.pop
98
- end
99
- end
100
-
101
- def test_length_query
102
-
103
- @context['numbers'] = [1,2,3,4]
104
-
105
- assert_equal 4, @context['numbers.size']
106
-
107
- @context['numbers'] = {1 => 1,2 => 2,3 => 3,4 => 4}
108
-
109
- assert_equal 4, @context['numbers.size']
110
-
111
- @context['numbers'] = {1 => 1,2 => 2,3 => 3,4 => 4, 'size' => 1000}
112
-
113
- assert_equal 1000, @context['numbers.size']
114
-
115
- end
116
-
117
- def test_hyphenated_variable
118
-
119
- @context['oh-my'] = 'godz'
120
- assert_equal 'godz', @context['oh-my']
121
-
122
- end
123
-
124
- def test_add_filter
125
-
126
- filter = Module.new do
127
- def hi(output)
128
- output + ' hi!'
129
- end
130
- end
131
-
132
- context = Context.new(@template)
133
- context.add_filters(filter)
134
- assert_equal 'hi? hi!', context.invoke(:hi, 'hi?')
135
-
136
- context = Context.new(@template)
137
- assert_equal 'hi?', context.invoke(:hi, 'hi?')
138
-
139
- context.add_filters(filter)
140
- assert_equal 'hi? hi!', context.invoke(:hi, 'hi?')
141
-
142
- end
143
-
144
- def test_override_global_filter
145
- global = Module.new do
146
- def notice(output)
147
- "Global #{output}"
148
- end
149
- end
150
-
151
- local = Module.new do
152
- def notice(output)
153
- "Local #{output}"
154
- end
155
- end
156
-
157
- Template.register_filter(global)
158
- assert_equal 'Global test', Template.parse("{{'test' | notice }}").render
159
- assert_equal 'Local test', Template.parse("{{'test' | notice }}").render({}, :filters => [local])
160
- end
161
-
162
- def test_only_intended_filters_make_it_there
163
-
164
- filter = Module.new do
165
- def hi(output)
166
- output + ' hi!'
167
- end
168
- end
169
-
170
- context = Context.new(@template)
171
- methods = context.strainer.methods
172
- context.add_filters(filter)
173
- assert_equal (methods + ['hi']).sort, context.strainer.methods.sort
174
- end
175
-
176
- def test_add_item_in_outer_scope
177
- @context['test'] = 'test'
178
- @context.push
179
- assert_equal 'test', @context['test']
180
- @context.pop
181
- assert_equal 'test', @context['test']
182
- end
183
-
184
- def test_add_item_in_inner_scope
185
- @context.push
186
- @context['test'] = 'test'
187
- assert_equal 'test', @context['test']
188
- @context.pop
189
- assert_equal nil, @context['test']
190
- end
191
-
192
- def test_hierachical_data
193
- @context['hash'] = {"name" => 'tobi'}
194
- assert_equal 'tobi', @context['hash.name']
195
- end
196
-
197
- def test_keywords
198
- assert_equal true, @context['true']
199
- assert_equal false, @context['false']
200
- end
201
-
202
- def test_digits
203
- assert_equal 100, @context['100']
204
- assert_equal 100.00, @context['100.00']
205
- end
206
-
207
- def test_strings
208
- assert_equal "hello!", @context['"hello!"']
209
- assert_equal "hello!", @context["'hello!'"]
210
- end
211
-
212
- def test_merge
213
- @context.merge({ "test" => "test" })
214
- assert_equal 'test', @context['test']
215
- @context.merge({ "test" => "newvalue", "foo" => "bar" })
216
- assert_equal 'newvalue', @context['test']
217
- assert_equal 'bar', @context['foo']
218
- end
219
-
220
- def test_array_notation
221
- @context['test'] = [1,2,3,4,5]
222
-
223
- assert_equal 1, @context['test[0]']
224
- assert_equal 2, @context['test[1]']
225
- assert_equal 3, @context['test[2]']
226
- assert_equal 4, @context['test[3]']
227
- assert_equal 5, @context['test[4]']
228
- end
229
-
230
- def test_recoursive_array_notation
231
- @context['test'] = {'test' => [1,2,3,4,5]}
232
-
233
- assert_equal 1, @context['test.test[0]']
234
-
235
- @context['test'] = [{'test' => 'worked'}]
236
-
237
- assert_equal 'worked', @context['test[0].test']
238
- end
239
-
240
- def test_hash_to_array_transition
241
- @context['colors'] = {
242
- 'Blue' => ['003366','336699', '6699CC', '99CCFF'],
243
- 'Green' => ['003300','336633', '669966', '99CC99'],
244
- 'Yellow' => ['CC9900','FFCC00', 'FFFF99', 'FFFFCC'],
245
- 'Red' => ['660000','993333', 'CC6666', 'FF9999']
246
- }
247
-
248
- assert_equal '003366', @context['colors.Blue[0]']
249
- assert_equal 'FF9999', @context['colors.Red[3]']
250
- end
251
-
252
- def test_try_first
253
- @context['test'] = [1,2,3,4,5]
254
-
255
- assert_equal 1, @context['test.first']
256
- assert_equal 5, @context['test.last']
257
-
258
- @context['test'] = {'test' => [1,2,3,4,5]}
259
-
260
- assert_equal 1, @context['test.test.first']
261
- assert_equal 5, @context['test.test.last']
262
-
263
- @context['test'] = [1]
264
- assert_equal 1, @context['test.first']
265
- assert_equal 1, @context['test.last']
266
- end
267
-
268
- def test_access_hashes_with_hash_notation
269
-
270
- @context['products'] = {'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
271
- @context['product'] = {'variants' => [ {'title' => 'draft151cm'}, {'title' => 'element151cm'} ]}
272
-
273
-
274
- assert_equal 5, @context['products["count"]']
275
- assert_equal 'deepsnow', @context['products["tags"][0]']
276
- assert_equal 'deepsnow', @context['products["tags"].first']
277
- assert_equal 'draft151cm', @context['product["variants"][0]["title"]']
278
- assert_equal 'element151cm', @context['product["variants"][1]["title"]']
279
- assert_equal 'draft151cm', @context['product["variants"][0]["title"]']
280
- assert_equal 'element151cm', @context['product["variants"].last["title"]']
281
- end
282
-
283
- def test_access_variable_with_hash_notation
284
- @context['foo'] = 'baz'
285
- @context['bar'] = 'foo'
286
-
287
- assert_equal 'baz', @context['["foo"]']
288
- assert_equal 'baz', @context['[bar]']
289
- end
290
-
291
- def test_access_hashes_with_hash_access_variables
292
-
293
- @context['var'] = 'tags'
294
- @context['nested'] = {'var' => 'tags'}
295
- @context['products'] = {'count' => 5, 'tags' => ['deepsnow', 'freestyle'] }
296
-
297
- assert_equal 'deepsnow', @context['products[var].first']
298
- assert_equal 'freestyle', @context['products[nested.var].last']
299
- end
300
-
301
-
302
- def test_first_can_appear_in_middle_of_callchain
303
-
304
- @context['product'] = {'variants' => [ {'title' => 'draft151cm'}, {'title' => 'element151cm'} ]}
305
-
306
- assert_equal 'draft151cm', @context['product.variants[0].title']
307
- assert_equal 'element151cm', @context['product.variants[1].title']
308
- assert_equal 'draft151cm', @context['product.variants.first.title']
309
- assert_equal 'element151cm', @context['product.variants.last.title']
310
-
311
- end
312
-
313
- def test_cents
314
- @context.merge( "cents" => HundredCentes.new )
315
- assert_equal 100, @context['cents']
316
- end
317
-
318
- def test_nested_cents
319
- @context.merge( "cents" => { 'amount' => HundredCentes.new} )
320
- assert_equal 100, @context['cents.amount']
321
-
322
- @context.merge( "cents" => { 'cents' => { 'amount' => HundredCentes.new} } )
323
- assert_equal 100, @context['cents.cents.amount']
324
- end
325
-
326
- def test_cents_through_drop
327
- @context.merge( "cents" => CentsDrop.new )
328
- assert_equal 100, @context['cents.amount']
329
- end
330
-
331
- def test_nested_cents_through_drop
332
- @context.merge( "vars" => {"cents" => CentsDrop.new} )
333
- assert_equal 100, @context['vars.cents.amount']
334
- end
335
-
336
- def test_drop_methods_with_question_marks
337
- @context.merge( "cents" => CentsDrop.new )
338
- assert @context['cents.non_zero?']
339
- end
340
-
341
- def test_context_from_within_drop
342
- @context.merge( "test" => '123', "vars" => ContextSensitiveDrop.new )
343
- assert_equal '123', @context['vars.test']
344
- end
345
-
346
- def test_nested_context_from_within_drop
347
- @context.merge( "test" => '123', "vars" => {"local" => ContextSensitiveDrop.new } )
348
- assert_equal '123', @context['vars.local.test']
349
- end
350
-
351
- def test_ranges
352
- @context.merge( "test" => '5' )
353
- assert_equal (1..5), @context['(1..5)']
354
- assert_equal (1..5), @context['(1..test)']
355
- assert_equal (5..5), @context['(test..test)']
356
- end
357
-
358
- def test_cents_through_drop_nestedly
359
- @context.merge( "cents" => {"cents" => CentsDrop.new} )
360
- assert_equal 100, @context['cents.cents.amount']
361
-
362
- @context.merge( "cents" => { "cents" => {"cents" => CentsDrop.new}} )
363
- assert_equal 100, @context['cents.cents.cents.amount']
364
- end
365
-
366
- def test_proc_as_variable
367
- @context['dynamic'] = Proc.new { 'Hello' }
368
-
369
- assert_equal 'Hello', @context['dynamic']
370
- end
371
-
372
- def test_lambda_as_variable
373
- @context['dynamic'] = lambda { 'Hello' }
374
-
375
- assert_equal 'Hello', @context['dynamic']
376
- end
377
-
378
- def test_nested_lambda_as_variable
379
- @context['dynamic'] = { "lambda" => lambda { 'Hello' } }
380
-
381
- assert_equal 'Hello', @context['dynamic.lambda']
382
- end
383
-
384
- def test_lambda_is_called_once
385
- @context['callcount'] = lambda { @global ||= 0; @global += 1; @global.to_s }
386
-
387
- assert_equal '1', @context['callcount']
388
- assert_equal '1', @context['callcount']
389
- assert_equal '1', @context['callcount']
390
-
391
- @global = nil
392
- end
393
-
394
- def test_nested_lambda_is_called_once
395
- @context['callcount'] = { "lambda" => lambda { @global ||= 0; @global += 1; @global.to_s } }
396
-
397
- assert_equal '1', @context['callcount.lambda']
398
- assert_equal '1', @context['callcount.lambda']
399
- assert_equal '1', @context['callcount.lambda']
400
-
401
- @global = nil
402
- end
403
-
404
- def test_access_to_context_from_proc
405
- @context.registers[:magic] = 345392
406
-
407
- @context['magic'] = lambda { @context.registers[:magic] }
408
-
409
- assert_equal 345392, @context['magic']
410
- end
411
-
412
- def test_to_liquid_and_context_at_first_level
413
- @context['category'] = Category.new("foobar")
414
- assert_kind_of CategoryDrop, @context['category']
415
- assert_equal @context, @context['category'].context
416
- end
417
-
418
- end