slidefield 0.1

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +674 -0
  5. data/README.md +254 -0
  6. data/Rakefile +7 -0
  7. data/bin/slidefield +89 -0
  8. data/examples/complete/assets/K2.jpg +0 -0
  9. data/examples/complete/assets/gobi.jpg +0 -0
  10. data/examples/complete/assets/mount_everest.jpg +0 -0
  11. data/examples/complete/assets/sahara.jpg +0 -0
  12. data/examples/complete/main.sfp +7 -0
  13. data/examples/complete/slides/deserts.sfi +19 -0
  14. data/examples/complete/slides/mountains.sfi +25 -0
  15. data/examples/complete/templates.sfi +95 -0
  16. data/examples/complete/variables.sfi +6 -0
  17. data/examples/minimal/main.sfp +43 -0
  18. data/examples/minimal/ruby-logo.png +0 -0
  19. data/lib/slidefield/animator.rb +104 -0
  20. data/lib/slidefield/errors.rb +6 -0
  21. data/lib/slidefield/interpreter.rb +414 -0
  22. data/lib/slidefield/object_data.rb +78 -0
  23. data/lib/slidefield/object_manager.rb +29 -0
  24. data/lib/slidefield/object_rules.rb +79 -0
  25. data/lib/slidefield/objects/_base.rb +29 -0
  26. data/lib/slidefield/objects/_root.rb +10 -0
  27. data/lib/slidefield/objects/animation.rb +10 -0
  28. data/lib/slidefield/objects/debug.rb +18 -0
  29. data/lib/slidefield/objects/image.rb +47 -0
  30. data/lib/slidefield/objects/include.rb +9 -0
  31. data/lib/slidefield/objects/layout.rb +10 -0
  32. data/lib/slidefield/objects/rect.rb +44 -0
  33. data/lib/slidefield/objects/slide.rb +43 -0
  34. data/lib/slidefield/objects/song.rb +31 -0
  35. data/lib/slidefield/objects/text.rb +57 -0
  36. data/lib/slidefield/parser.rb +99 -0
  37. data/lib/slidefield/version.rb +3 -0
  38. data/lib/slidefield/viewer.rb +89 -0
  39. data/lib/slidefield.rb +27 -0
  40. data/slidefield.gemspec +27 -0
  41. data/test/helper.rb +11 -0
  42. data/test/resources/include_sub.sfp +1 -0
  43. data/test/resources/parse_error.sfp +1 -0
  44. data/test/resources/recursive_include.sfp +1 -0
  45. data/test/resources/sub/include_parent.sfp +1 -0
  46. data/test/resources/unclosed_object.sfp +2 -0
  47. data/test/resources/unknown_object.sfp +1 -0
  48. data/test/resources/wrong_template.sfp +4 -0
  49. data/test/test_animator.rb +244 -0
  50. data/test/test_examples.rb +29 -0
  51. data/test/test_interpreter.rb +1766 -0
  52. data/test/test_object_data.rb +108 -0
  53. data/test/test_object_manager.rb +48 -0
  54. data/test/test_object_rules.rb +87 -0
  55. data/test/test_parser.rb +408 -0
  56. metadata +199 -0
@@ -0,0 +1,108 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ class TestObjectData < MiniTest::Test
4
+ def test_initialize
5
+ o = SlideField::ObjectData.new :test, 'location'
6
+ assert_equal :test, o.type
7
+ assert_equal 'location', o.loc
8
+ end
9
+
10
+ def test_variables
11
+ o = SlideField::ObjectData.new :test, 'loc'
12
+ refute o.has? :test
13
+ assert_nil o.get(:test)
14
+ assert_nil o.var_type(:test)
15
+ assert_nil o.var_loc(:test)
16
+
17
+ o.set :test, 'hello world', 'line 42 char 24', :string
18
+ assert o.has? :test
19
+ assert_equal 'hello world', o.get(:test)
20
+ assert_equal :string, o.var_type(:test)
21
+ assert_equal 'line 42 char 24', o.var_loc(:test)
22
+
23
+ o.set :test, 'hello tester'
24
+ assert_equal 'hello tester', o.get(:test)
25
+ assert_equal :string, o.var_type(:test)
26
+ assert_equal 'line 42 char 24', o.var_loc(:test)
27
+ end
28
+
29
+ def test_children
30
+ parent = SlideField::ObjectData.new :parent, 'loc'
31
+ assert_equal [], parent.children
32
+
33
+ child1 = SlideField::ObjectData.new :child, 'loc'
34
+ child2 = SlideField::ObjectData.new :child, 'loc'
35
+ child3 = SlideField::ObjectData.new :uniqueOfHisKind, 'loc'
36
+
37
+ parent << child1
38
+ parent << child2
39
+ parent << child3
40
+
41
+ assert_equal [child1, child2, child3], parent.children
42
+ assert_equal [child1, child2], parent[:child]
43
+ assert_equal [child3], parent[:uniqueOfHisKind]
44
+
45
+ assert_equal parent, child1.parent
46
+ assert_equal parent, child2.parent
47
+ assert_equal parent, child3.parent
48
+ end
49
+
50
+ def test_inheritance
51
+ parent = SlideField::ObjectData.new :parent, 'loc'
52
+ parent.set 'variable', 'value', 'loc', :type
53
+
54
+ child = SlideField::ObjectData.new :child, 'loc'
55
+ parent << child
56
+
57
+ assert parent.has?('variable')
58
+ refute child.has?('variable')
59
+ assert_equal 'value', child.get('variable')
60
+ assert_equal :type, child.var_type('variable')
61
+ assert_equal 'loc', child.var_loc('variable')
62
+ end
63
+
64
+ def test_context_string
65
+ o1 = SlideField::ObjectData.new :test, 'loc'
66
+ o1.context = 'context1'
67
+
68
+ o2 = SlideField::ObjectData.new :test, 'loc'
69
+ o2.context = 'context2'
70
+ o1 << o2
71
+
72
+ o3 = SlideField::ObjectData.new :test, 'loc'
73
+ o3.context = 'context2'
74
+ o2 << o3
75
+
76
+ o4 = SlideField::ObjectData.new :test, 'loc'
77
+ o4.context = 'context1'
78
+ o3 << o4
79
+
80
+ assert_equal "[context1]", o1.context_string
81
+ assert_equal "[context1] [context2]", o2.context_string
82
+ assert_equal "[context1] [context2]", o3.context_string
83
+ assert_equal "[context1] [context2] [context1]", o4.context_string
84
+ end
85
+
86
+ def test_rules
87
+ o = SlideField::ObjectData.new :slide, 'loc'
88
+ assert_instance_of SlideField::ObjectRules::Slide, o.rules
89
+ end
90
+
91
+ def test_ancestor
92
+ parent = SlideField::ObjectData.new :parent, 'loc'
93
+ assert_equal [], parent.children
94
+
95
+ child1 = SlideField::ObjectData.new :child1, 'loc'
96
+ child2 = SlideField::ObjectData.new :child2, 'loc'
97
+ child3 = SlideField::ObjectData.new :child3, 'loc'
98
+
99
+ parent << child1
100
+ child1 << child2
101
+ child2 << child3
102
+
103
+ assert_equal parent, child1.ancestor(:parent)
104
+ assert_equal parent, child2.ancestor(:parent)
105
+ assert_equal child1, child3.ancestor(:child1)
106
+ assert_nil parent.ancestor(:parent)
107
+ end
108
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ module SlideField::ObjectManager
4
+ class CatchTest < Base
5
+ def load(what)
6
+ raise what
7
+ end
8
+ end
9
+ end
10
+
11
+ class TestObjectManager < MiniTest::Test
12
+ def test_new
13
+ window = nil
14
+
15
+ obj1 = SlideField::ObjectData.new :slide, 'loc'
16
+ obj2 = SlideField::ObjectData.new :text, 'loc'
17
+ obj3 = SlideField::ObjectData.new :unknown, 'loc'
18
+
19
+ klass1 = SlideField::ObjectManager::Slide
20
+ klass2 = SlideField::ObjectManager::Text
21
+
22
+ assert_instance_of klass1, man1 = SlideField::ObjectManager.new(obj1, window)
23
+ assert_instance_of klass2, SlideField::ObjectManager.new(obj2, window)
24
+ assert_nil SlideField::ObjectManager.new(obj3, window)
25
+ end
26
+
27
+ def test_slide_non_graphic_children
28
+ obj1 = SlideField::ObjectData.new :slide, 'loc'
29
+ obj2 = SlideField::ObjectData.new :unknown, 'loc'
30
+
31
+ obj1 << obj2
32
+
33
+ manager = SlideField::ObjectManager.new obj1, nil
34
+ manager.load
35
+ end
36
+
37
+ def test_catch
38
+ obj = SlideField::ObjectData.new :catchTest, 'loc'
39
+ obj.context = 'context'
40
+
41
+ manager = SlideField::ObjectManager.new obj, nil
42
+ error = assert_raises SlideField::RuntimeError do
43
+ manager.execute :load, 'error message'
44
+ end
45
+
46
+ assert_equal "[context] An error occured while executing the 'load' event on the object 'catchTest' at loc:\n\t(RuntimeError) error message", error.message
47
+ end
48
+ end
@@ -0,0 +1,87 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ module SlideField::ObjectRules
4
+ class RulesTest < Base
5
+ def rules
6
+ property :var1, :string, "default"
7
+ property :var2, :integer, nil
8
+ property :var3, :string, "value"
9
+
10
+ child :obj1
11
+ child :obj2, 1
12
+ child :obj3, 1, 2
13
+ super
14
+ end
15
+ end
16
+ end
17
+
18
+ class TestObjectRules < MiniTest::Test
19
+ def test_accessor
20
+ klass = SlideField::ObjectRules::RulesTest
21
+ assert_instance_of klass, SlideField::ObjectRules[:rulesTest]
22
+ end
23
+
24
+ def test_unknown
25
+ assert_nil SlideField::ObjectRules[:thisDoesNotExist]
26
+ end
27
+
28
+ def test_cache
29
+ klass = SlideField::ObjectRules::RulesTest
30
+ first = klass.get
31
+ second = klass.get
32
+
33
+ assert_same first, second
34
+ end
35
+
36
+ def test_properties_names
37
+ rules = SlideField::ObjectRules::RulesTest.get
38
+ assert_equal [:var1, :var2, :var3], rules.properties_names
39
+ end
40
+
41
+ def test_properties_types
42
+ rules = SlideField::ObjectRules::RulesTest.get
43
+ assert_equal [:string, :integer], rules.properties_types
44
+ end
45
+
46
+
47
+ def test_required_properties
48
+ rules = SlideField::ObjectRules::RulesTest.get
49
+ assert_equal [:var2], rules.required_properties
50
+ end
51
+
52
+ def test_optional_properties
53
+ rules = SlideField::ObjectRules::RulesTest.get
54
+ assert_equal [:var1, :var3], rules.optional_properties
55
+ end
56
+
57
+
58
+ def test_type_of_property
59
+ rules = SlideField::ObjectRules::RulesTest.get
60
+ assert_equal :string, rules.type_of_property(:var1)
61
+ assert_equal nil, rules.type_of_property(:unknown)
62
+ end
63
+
64
+ def test_matching_properties
65
+ rules = SlideField::ObjectRules::RulesTest.get
66
+ assert_equal [:var1, :var3], rules.matching_properties(:string)
67
+ end
68
+
69
+ def test_default_value
70
+ rules = SlideField::ObjectRules::RulesTest.get
71
+ assert_equal "default", rules.default_value(:var1)
72
+ assert_equal nil, rules.default_value(:unknown)
73
+ end
74
+
75
+ def test_accepted_children
76
+ rules = SlideField::ObjectRules::RulesTest.get
77
+ assert_equal [:obj1, :obj2, :obj3, :include, :debug], rules.accepted_children
78
+ end
79
+
80
+ def test_requirements_of_child
81
+ rules = SlideField::ObjectRules::RulesTest.get
82
+ assert_equal [0, 0], rules.requirements_of_child(:obj1)
83
+ assert_equal [1, 0], rules.requirements_of_child(:obj2)
84
+ assert_equal [1, 2], rules.requirements_of_child(:obj3)
85
+ assert_equal nil, rules.requirements_of_child(:obj4)
86
+ end
87
+ end
@@ -0,0 +1,408 @@
1
+ require File.expand_path '../helper', __FILE__
2
+
3
+ class TestParser < MiniTest::Test
4
+ def expect(input, tokens)
5
+ assert_equal tokens, parse(input)
6
+ end
7
+
8
+ def parse(input)
9
+ clean_tokens SlideField::Parser.new.parse(input)
10
+ end
11
+
12
+ def clean_tokens(tokens)
13
+ case tokens
14
+ when Array
15
+ tokens.collect {|e|
16
+ clean_tokens e
17
+ }
18
+ when Hash
19
+ tokens.merge(tokens) {|k,e|
20
+ clean_tokens e
21
+ }
22
+ when Parslet::Slice
23
+ tokens.to_s
24
+ end
25
+ end
26
+
27
+ def test_var_identifier
28
+ tokens = [
29
+ :assignment=>{
30
+ :variable=>'var',
31
+ :operator=>'=',
32
+ :value=>{:filters=>[], :identifier=>'val'}
33
+ }
34
+ ]
35
+
36
+ expect 'var=val', tokens
37
+ expect 'var = val', tokens
38
+ expect 'var = val ', tokens
39
+ expect "var\t=\tval", tokens
40
+ expect "var\t=\tval % comment", tokens
41
+ expect "var\t%{%}=%{%}val", tokens
42
+ expect " var=val", tokens
43
+ expect "\t\tvar=val", tokens
44
+ expect "var=val;", tokens
45
+ expect "var=val;%comment", tokens
46
+
47
+ expect 'var+=val', [
48
+ :assignment=>{
49
+ :variable=>'var',
50
+ :operator=>'+=',
51
+ :value=>{:filters=>[], :identifier=>'val'}
52
+ }
53
+ ]
54
+ expect 'var-=val', [
55
+ :assignment=>{
56
+ :variable=>'var',
57
+ :operator=>'-=',
58
+ :value=>{:filters=>[], :identifier=>'val'}
59
+ }
60
+ ]
61
+ expect 'var*=val', [
62
+ :assignment=>{
63
+ :variable=>'var',
64
+ :operator=>'*=',
65
+ :value=>{:filters=>[], :identifier=>'val'}
66
+ }
67
+ ]
68
+ expect 'var/=val', [
69
+ :assignment=>{
70
+ :variable=>'var',
71
+ :operator=>'/=',
72
+ :value=>{:filters=>[], :identifier=>'val'}
73
+ }
74
+ ]
75
+ end
76
+
77
+ def test_var_integer
78
+ expect 'var=42', [
79
+ :assignment=>{
80
+ :variable=>'var',
81
+ :operator=>'=',
82
+ :value=>{:filters=>[], :integer=>'42'}
83
+ }
84
+ ]
85
+
86
+ expect 'var=-42', [
87
+ :assignment=>{
88
+ :variable=>'var',
89
+ :operator=>'=',
90
+ :value=>{:filters=>[], :integer=>'-42'}
91
+ }
92
+ ]
93
+ end
94
+
95
+ def test_var_string
96
+ expect 'var="value"', [
97
+ :assignment=>{
98
+ :variable=>'var',
99
+ :operator=>'=',
100
+ :value=>{:filters=>[], :string=>'"value"'}
101
+ }
102
+ ]
103
+
104
+ expect 'var="say \"hello\""', [
105
+ :assignment=>{
106
+ :variable=>'var',
107
+ :operator=>'=',
108
+ :value=>{:filters=>[], :string=>'"say \\"hello\\""'}
109
+ }
110
+ ]
111
+ end
112
+
113
+ def test_var_point
114
+ expect 'var=42x24', [
115
+ :assignment=>{
116
+ :variable=>'var',
117
+ :operator=>'=',
118
+ :value=>{:filters=>[], :point=>'42x24'}
119
+ }
120
+ ]
121
+
122
+ expect 'var=-42x24', [
123
+ :assignment=>{
124
+ :variable=>'var',
125
+ :operator=>'=',
126
+ :value=>{:filters=>[], :point=>'-42x24'}
127
+ }
128
+ ]
129
+
130
+ expect 'var=42x-24', [
131
+ :assignment=>{
132
+ :variable=>'var',
133
+ :operator=>'=',
134
+ :value=>{:filters=>[], :point=>'42x-24'}
135
+ }
136
+ ]
137
+ end
138
+
139
+ def test_var_color
140
+ expect 'var=#C0FF33FF', [
141
+ :assignment=>{
142
+ :variable=>'var',
143
+ :operator=>'=',
144
+ :value=>{:filters=>[], :color=>'#C0FF33FF'}
145
+ }
146
+ ]
147
+
148
+ expect 'var=#c0ff33ff', [
149
+ :assignment=>{
150
+ :variable=>'var',
151
+ :operator=>'=',
152
+ :value=>{:filters=>[], :color=>'#c0ff33ff'}
153
+ }
154
+ ]
155
+ end
156
+
157
+ def test_var_boolean
158
+ expect 'var=:true', [
159
+ :assignment=>{
160
+ :variable=>'var',
161
+ :operator=>'=',
162
+ :value=>{:filters=>[], :boolean=>':true'}
163
+ }
164
+ ]
165
+
166
+ expect 'var=:false', [
167
+ :assignment=>{
168
+ :variable=>'var',
169
+ :operator=>'=',
170
+ :value=>{:filters=>[], :boolean=>':false'}
171
+ }
172
+ ]
173
+ end
174
+
175
+ def test_var_object
176
+ expect 'var=\\test', [
177
+ :assignment=>{
178
+ :variable=>'var',
179
+ :operator=>'=',
180
+ :value=>{:filters=>[], :object=>{:type=>'test'}}
181
+ }
182
+ ]
183
+
184
+ expect 'var=\\test {}', [
185
+ :assignment=>{
186
+ :variable=>'var',
187
+ :operator=>'=',
188
+ :value=>{:filters=>[], :object=>{:type=>'test', :body=>[]}}
189
+ }
190
+ ]
191
+
192
+ expect "var=\\test {\n\tvar=val\n}", [
193
+ :assignment=>{
194
+ :variable=>'var',
195
+ :operator=>'=',
196
+ :value=>{
197
+ :filters=>[],
198
+ :object=>{:type=>'test', :body=>[
199
+ {:assignment=>{
200
+ :variable=>'var',
201
+ :operator=>'=',
202
+ :value=>{:filters=>[], :identifier=>'val'}}
203
+ }
204
+ ]}
205
+ }
206
+ }
207
+ ]
208
+ end
209
+
210
+ def test_filter
211
+ tokens = [
212
+ :assignment=>{
213
+ :variable=>'var',
214
+ :operator=>'=',
215
+ :value=>{
216
+ :filters=>[{:name=>'filter_name'}],
217
+ :identifier=>'val'
218
+ }
219
+ }
220
+ ]
221
+
222
+ expect 'var=(filter_name)val', tokens
223
+ expect 'var=(filter_name) val', tokens
224
+ expect 'var= (filter_name) val', tokens
225
+ expect "var= (filter_name)\t\tval", tokens
226
+ expect "var= (filter_name)%{%}val", tokens
227
+ expect "var= ( filter_name )val", tokens
228
+
229
+ tokens = [
230
+ :assignment=>{
231
+ :variable=>'var',
232
+ :operator=>'=',
233
+ :value=>{
234
+ :filters=>[{:name=>'first'}, {:name=>'second'}],
235
+ :identifier=>'val'
236
+ }
237
+ }
238
+ ]
239
+
240
+ expect "var=(first)(second)val", tokens
241
+ expect "var=(first) (second)val", tokens
242
+ end
243
+
244
+ def test_object
245
+ expect '\\test', [
246
+ {:object=>{:type=>'test'}}
247
+ ]
248
+
249
+ expect '\\test % comment', [
250
+ {:object=>{:type=>'test'}}
251
+ ]
252
+
253
+ expect '\\TEST', [
254
+ {:object=>{:type=>'TEST'}}
255
+ ]
256
+
257
+ expect '\\te_st', [
258
+ {:object=>{:type=>'te_st'}}
259
+ ]
260
+
261
+ expect '\\t3s7', [
262
+ {:object=>{:type=>'t3s7'}}
263
+ ]
264
+
265
+ tokens = [
266
+ {:object=>{:type=>'test', :body=>[]}}
267
+ ]
268
+
269
+ expect '\\test{}', tokens
270
+ expect '\\test { } ', tokens
271
+ expect "\\test\t{\t}\t", tokens
272
+ expect "\\test\n{\n}", tokens
273
+ expect '\\test%{%}{%{%}}', tokens
274
+ end
275
+
276
+ def test_object_value
277
+ tokens = [
278
+ {:object=>{
279
+ :type=>'test',
280
+ :value=>{:filters=>[], :identifier=>'val'}
281
+ }}
282
+ ]
283
+
284
+ expect '\\test val', tokens
285
+ expect "\\test\tval", tokens
286
+ expect "\\test%{%}val", tokens
287
+ assert_raises Parslet::ParseFailed do
288
+ parse "\\test\nval"
289
+ end
290
+
291
+ expect '\\test 42', [
292
+ {:object=>{
293
+ :type=>'test',
294
+ :value=>{:filters=>[], :integer=>'42'}
295
+ }}
296
+ ]
297
+
298
+ expect '\\test4-2', [
299
+ {:object=>{
300
+ :type=>'test4',
301
+ :value=>{:filters=>[], :integer=>'-2'}
302
+ }}
303
+ ]
304
+
305
+ expect '\\test "string"', [
306
+ {:object=>{
307
+ :type=>'test',
308
+ :value=>{:filters=>[], :string=>'"string"'}
309
+ }}
310
+ ]
311
+
312
+ expect '\\test 24x42', [
313
+ {:object=>{
314
+ :type=>'test',
315
+ :value=>{:filters=>[], :point=>'24x42'}
316
+ }}
317
+ ]
318
+
319
+ expect '\\test #FFFFFFFF', [
320
+ {:object=>{
321
+ :type=>'test',
322
+ :value=>{:filters=>[], :color=>'#FFFFFFFF'}
323
+ }}
324
+ ]
325
+
326
+ expect '\\test :true', [
327
+ {:object=>{
328
+ :type=>'test',
329
+ :value=>{:filters=>[], :boolean=>':true'}
330
+ }}
331
+ ]
332
+
333
+ expect '\\test (filter)val', [
334
+ {:object=>{
335
+ :type=>'test',
336
+ :value=>{:filters=>[{:name=>'filter'}], :identifier=>'val'}
337
+ }}
338
+ ]
339
+ end
340
+
341
+ def test_object_body
342
+ expect '\\test{\\child;}', [
343
+ {:object=>{:type=>'test', :body=>[
344
+ {:object=>{:type=>'child'}}
345
+ ]}}
346
+ ]
347
+
348
+ assert_raises Parslet::ParseFailed do
349
+ parse '\\test{\\child}'
350
+ end
351
+
352
+ expect "\\test{\n\t\\child\n}", [
353
+ {:object=>{:type=>'test', :body=>[
354
+ {:object=>{:type=>'child'}}
355
+ ]}}
356
+ ]
357
+
358
+ expect "\\test{\n\t\\child { \\subchild; }\n}", [
359
+ {:object=>{:type=>'test', :body=>[
360
+ {:object=>{:type=>'child', :body=>[
361
+ {:object=>{:type=>'subchild'}}
362
+ ]}}
363
+ ]}}
364
+ ]
365
+
366
+ expect "\\test{var=val;}", [
367
+ {:object=>{:type=>'test', :body=>[
368
+ {:assignment=>{
369
+ :variable=>'var',
370
+ :operator=>'=',
371
+ :value=>{:filters=>[], :identifier=>'val'}}
372
+ }
373
+ ]}}
374
+ ]
375
+
376
+ assert_raises Parslet::ParseFailed do
377
+ parse '\\test{var=val}'
378
+ end
379
+ end
380
+
381
+ def test_template
382
+ expect '\\&test', [
383
+ {:object=>{:template=>'&', :type=>'test'}}
384
+ ]
385
+ end
386
+
387
+ def test_comments
388
+ assert_raises Parslet::ParseFailed do
389
+ parse "%{"
390
+ end
391
+
392
+ parse "% {"
393
+ end
394
+
395
+ def test_separator
396
+ assert_raises Parslet::ParseFailed do
397
+ parse "life = 42 life = 42"
398
+ end
399
+
400
+ expect "\\test; \\test", [
401
+ {:object=>{:type=>'test'}},
402
+ {:object=>{:type=>'test'}}
403
+ ]
404
+
405
+ parse "\\test; life = 42"
406
+ parse "life = 42; \\test"
407
+ end
408
+ end