slim 0.9.4 → 1.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.
- data/CHANGES +8 -1
- data/README.md +9 -5
- data/lib/slim/compiler.rb +20 -23
- data/lib/slim/embedded_engine.rb +86 -25
- data/lib/slim/end_inserter.rb +2 -2
- data/lib/slim/engine.rb +1 -2
- data/lib/slim/grammar.rb +1 -2
- data/lib/slim/interpolation.rb +8 -6
- data/lib/slim/parser.rb +295 -258
- data/lib/slim/sections.rb +1 -1
- data/lib/slim/version.rb +1 -1
- data/test/helper.rb +4 -0
- data/test/slim/test_code_evaluation.rb +31 -6
- data/test/slim/test_code_output.rb +22 -3
- data/test/slim/test_embedded_engines.rb +7 -2
- data/test/slim/test_html_structure.rb +79 -10
- data/test/slim/test_parser_errors.rb +22 -13
- data/test/slim/test_ruby_errors.rb +11 -0
- data/test_ruby_errors.rb +191 -0
- metadata +107 -111
- data/lib/slim/rails.rb +0 -3
data/lib/slim/sections.rb
CHANGED
data/lib/slim/version.rb
CHANGED
data/test/helper.rb
CHANGED
@@ -214,28 +214,53 @@ p id="#{(false ? 'notshown' : 'shown')}" = output_number
|
|
214
214
|
assert_html '<div id="alpha-beta">Test it</div>', source, :attr_delimiter => {'class' => ' ', 'id' => '-' }
|
215
215
|
end
|
216
216
|
|
217
|
+
def test_boolean_attribute_false
|
218
|
+
source = %{
|
219
|
+
option selected=false Text
|
220
|
+
}
|
221
|
+
|
222
|
+
assert_html '<option>Text</option>', source
|
223
|
+
end
|
224
|
+
|
217
225
|
def test_boolean_attribute_true
|
218
226
|
source = %{
|
219
|
-
option selected=
|
227
|
+
option selected=true Text
|
220
228
|
}
|
221
229
|
|
222
230
|
assert_html '<option selected="selected">Text</option>', source
|
223
231
|
end
|
224
232
|
|
225
|
-
def
|
233
|
+
def test_boolean_attribute_dynamic
|
226
234
|
source = %{
|
227
|
-
option selected=
|
235
|
+
option selected=method_which_returns_true Text
|
236
|
+
}
|
237
|
+
|
238
|
+
assert_html '<option selected="selected">Text</option>', source
|
239
|
+
end
|
240
|
+
|
241
|
+
def test_boolean_attribute_nil
|
242
|
+
source = %{
|
243
|
+
option selected=nil Text
|
228
244
|
}
|
229
245
|
|
230
246
|
assert_html '<option>Text</option>', source
|
231
247
|
end
|
232
248
|
|
233
|
-
def
|
249
|
+
def test_boolean_attribute_string2
|
250
|
+
source = %{
|
251
|
+
option selected="selected" Text
|
252
|
+
}
|
253
|
+
|
254
|
+
assert_html '<option selected="selected">Text</option>', source
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_boolean_attribute_shortcut
|
234
258
|
source = %{
|
235
|
-
|
259
|
+
option(class="clazz" selected) Text
|
260
|
+
option(selected class="clazz") Text
|
236
261
|
}
|
237
262
|
|
238
|
-
assert_html '<
|
263
|
+
assert_html '<option class="clazz" selected="selected">Text</option><option class="clazz" selected="selected">Text</option>', source
|
239
264
|
end
|
240
265
|
|
241
266
|
def test_array_attribute
|
@@ -7,7 +7,25 @@ p
|
|
7
7
|
= hello_world
|
8
8
|
}
|
9
9
|
|
10
|
-
assert_html '<p>Hello World from @env</p>', source
|
10
|
+
assert_html '<p>Hello World from @env</p>', source
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_render_with_trailing_whitespace
|
14
|
+
source = %q{
|
15
|
+
p
|
16
|
+
=' hello_world
|
17
|
+
}
|
18
|
+
|
19
|
+
assert_html '<p>Hello World from @env </p>', source
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_no_escape_render_with_trailing_whitespace
|
23
|
+
source = %q{
|
24
|
+
p
|
25
|
+
==' hello_world
|
26
|
+
}
|
27
|
+
|
28
|
+
assert_html '<p>Hello World from @env </p>', source
|
11
29
|
end
|
12
30
|
|
13
31
|
def test_render_with_conditional_call
|
@@ -100,9 +118,10 @@ p(id="test")==hello_world
|
|
100
118
|
end
|
101
119
|
|
102
120
|
def test_render_with_backslash_end
|
121
|
+
# Keep trailing spaces!
|
103
122
|
source = %q{
|
104
|
-
p = \
|
105
|
-
"Hello" + \
|
123
|
+
p = \
|
124
|
+
"Hello" + \
|
106
125
|
" Ruby!"
|
107
126
|
- variable = 1 + \
|
108
127
|
2 + \
|
@@ -35,13 +35,18 @@ p
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_render_with_markdown
|
38
|
+
# Keep the trailing spaces.
|
38
39
|
source = %q{
|
39
40
|
markdown:
|
40
41
|
#Header
|
41
42
|
Hello from #{"Markdown!"}
|
42
|
-
|
43
|
+
|
44
|
+
#{1+2}
|
45
|
+
|
46
|
+
* one
|
47
|
+
* two
|
43
48
|
}
|
44
|
-
assert_html "<h1>Header</h1>\n\n<p>Hello from Markdown
|
49
|
+
assert_html "<h1>Header</h1>\n\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n<li>one</li>\n<li>two</li>\n</ul>\n\n", source
|
45
50
|
end
|
46
51
|
|
47
52
|
def test_render_with_creole
|
@@ -25,7 +25,7 @@ html:body
|
|
25
25
|
|
26
26
|
def test_doctype
|
27
27
|
source = %q{
|
28
|
-
|
28
|
+
doctype 1.1
|
29
29
|
html
|
30
30
|
}
|
31
31
|
|
@@ -50,15 +50,6 @@ html
|
|
50
50
|
assert_html '<!DOCTYPE html><html></html>', source, :format => :xhtml
|
51
51
|
end
|
52
52
|
|
53
|
-
def test_capitalized_doctype
|
54
|
-
source = %q{
|
55
|
-
! DOCTYPE 5
|
56
|
-
html
|
57
|
-
}
|
58
|
-
|
59
|
-
assert_html '<!DOCTYPE html><html></html>', source
|
60
|
-
end
|
61
|
-
|
62
53
|
def test_render_with_shortcut_attributes
|
63
54
|
source = %q{
|
64
55
|
h1#title This is my title
|
@@ -356,4 +347,82 @@ p World
|
|
356
347
|
|
357
348
|
assert_html "<!--[if IE]>hello<![endif]-->", source
|
358
349
|
end
|
350
|
+
|
351
|
+
def test_multiline_attributes_with_method
|
352
|
+
source = %q{
|
353
|
+
p<id="marvin"
|
354
|
+
class="martian"
|
355
|
+
data-info="Illudium Q-36"> = output_number
|
356
|
+
}
|
357
|
+
Slim::Parser::DELIMITERS.each do |k,v|
|
358
|
+
str = source.sub('<',k).sub('>',v)
|
359
|
+
assert_html '<p class="martian" data-info="Illudium Q-36" id="marvin">1337</p>', str
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_multiline_attributes_with_text_on_same_line
|
364
|
+
source = %q{
|
365
|
+
p<id="marvin"
|
366
|
+
class="martian"
|
367
|
+
data-info="Illudium Q-36"> THE space modulator
|
368
|
+
}
|
369
|
+
Slim::Parser::DELIMITERS.each do |k,v|
|
370
|
+
str = source.sub('<',k).sub('>',v)
|
371
|
+
assert_html '<p class="martian" data-info="Illudium Q-36" id="marvin">THE space modulator</p>', str
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
def test_multiline_attributes_with_nested_text
|
376
|
+
source = %q{
|
377
|
+
p<id="marvin"
|
378
|
+
class="martian"
|
379
|
+
data-info="Illudium Q-36">
|
380
|
+
| THE space modulator
|
381
|
+
}
|
382
|
+
Slim::Parser::DELIMITERS.each do |k,v|
|
383
|
+
str = source.sub('<',k).sub('>',v)
|
384
|
+
assert_html '<p class="martian" data-info="Illudium Q-36" id="marvin">THE space modulator</p>', str
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
def test_multiline_attributes_with_dynamic_attr
|
389
|
+
source = %q{
|
390
|
+
p<id=id_helper
|
391
|
+
class="martian"
|
392
|
+
data-info="Illudium Q-36">
|
393
|
+
| THE space modulator
|
394
|
+
}
|
395
|
+
Slim::Parser::DELIMITERS.each do |k,v|
|
396
|
+
str = source.sub('<',k).sub('>',v)
|
397
|
+
assert_html '<p class="martian" data-info="Illudium Q-36" id="notice">THE space modulator</p>', str
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
def test_multiline_attributes_with_nested_tag
|
402
|
+
source = %q{
|
403
|
+
p<id=id_helper
|
404
|
+
class="martian"
|
405
|
+
data-info="Illudium Q-36">
|
406
|
+
span.emphasis THE
|
407
|
+
| space modulator
|
408
|
+
}
|
409
|
+
Slim::Parser::DELIMITERS.each do |k,v|
|
410
|
+
str = source.sub('<',k).sub('>',v)
|
411
|
+
assert_html '<p class="martian" data-info="Illudium Q-36" id="notice"><span class="emphasis">THE</span> space modulator</p>', str
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_multiline_attributes_with_nested_text_and_extra_indentation
|
416
|
+
source = %q{
|
417
|
+
li< id="myid"
|
418
|
+
class="myclass"
|
419
|
+
data-info="myinfo">
|
420
|
+
a href="link" My Link
|
421
|
+
}
|
422
|
+
Slim::Parser::DELIMITERS.each do |k,v|
|
423
|
+
str = source.sub('<',k).sub('>',v)
|
424
|
+
assert_html '<li class="myclass" data-info="myinfo" id="myid"><a href="link">My Link</a></li>', str
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
359
428
|
end
|
@@ -3,20 +3,20 @@ require 'helper'
|
|
3
3
|
class TestParserErrors < TestSlim
|
4
4
|
def test_correct_filename
|
5
5
|
source = %q{
|
6
|
-
|
6
|
+
doctype 5
|
7
7
|
div Invalid
|
8
8
|
}
|
9
9
|
|
10
|
-
assert_syntax_error "Unexpected indentation\n test.slim, Line 3\n div Invalid\n ^\n
|
10
|
+
assert_syntax_error "Unexpected indentation\n test.slim, Line 3\n div Invalid\n ^\n", source, :file => 'test.slim'
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_unexpected_indentation
|
14
14
|
source = %q{
|
15
|
-
|
15
|
+
doctype 5
|
16
16
|
div Invalid
|
17
17
|
}
|
18
18
|
|
19
|
-
assert_syntax_error "Unexpected indentation\n (__TEMPLATE__), Line 3\n div Invalid\n ^\n
|
19
|
+
assert_syntax_error "Unexpected indentation\n (__TEMPLATE__), Line 3\n div Invalid\n ^\n", source
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_unexpected_text_indentation
|
@@ -26,7 +26,7 @@ p
|
|
26
26
|
text
|
27
27
|
}
|
28
28
|
|
29
|
-
assert_syntax_error "Unexpected text indentation\n (__TEMPLATE__), Line 4\n text\n ^\n
|
29
|
+
assert_syntax_error "Unexpected text indentation\n (__TEMPLATE__), Line 4\n text\n ^\n", source
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_malformed_indentation
|
@@ -36,7 +36,7 @@ p
|
|
36
36
|
div Invalid
|
37
37
|
}
|
38
38
|
|
39
|
-
assert_syntax_error "Malformed indentation\n (__TEMPLATE__), Line 4\n div Invalid\n ^\n
|
39
|
+
assert_syntax_error "Malformed indentation\n (__TEMPLATE__), Line 4\n div Invalid\n ^\n", source
|
40
40
|
end
|
41
41
|
|
42
42
|
def test_unknown_line_indicator
|
@@ -48,7 +48,7 @@ p
|
|
48
48
|
?invalid
|
49
49
|
}
|
50
50
|
|
51
|
-
assert_syntax_error "Unknown line indicator\n (__TEMPLATE__), Line 6\n ?invalid\n ^\n
|
51
|
+
assert_syntax_error "Unknown line indicator\n (__TEMPLATE__), Line 6\n ?invalid\n ^\n", source
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_expected_closing_delimiter
|
@@ -57,7 +57,7 @@ p
|
|
57
57
|
img(src="img.jpg" title={title}
|
58
58
|
}
|
59
59
|
|
60
|
-
assert_syntax_error "Expected closing delimiter )\n (__TEMPLATE__), Line 3\n img(src=\"img.jpg\" title={title}\n ^\n
|
60
|
+
assert_syntax_error "Expected closing delimiter )\n (__TEMPLATE__), Line 3\n img(src=\"img.jpg\" title={title}\n ^\n", source
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_expected_closing_attribute_delimiter
|
@@ -66,7 +66,16 @@ p
|
|
66
66
|
img src=[hash[1] + hash[2]
|
67
67
|
}
|
68
68
|
|
69
|
-
assert_syntax_error "Expected closing attribute delimiter ]\n (__TEMPLATE__), Line 3\n img src=[hash[1] + hash[2]\n
|
69
|
+
assert_syntax_error "Expected closing attribute delimiter ]\n (__TEMPLATE__), Line 3\n img src=[hash[1] + hash[2]\n ^\n", source
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_expected_attribute
|
73
|
+
source = %q{
|
74
|
+
p
|
75
|
+
img(src='img.png' whatsthis?!)
|
76
|
+
}
|
77
|
+
|
78
|
+
assert_syntax_error "Expected attribute\n (__TEMPLATE__), Line 3\n img(src='img.png' whatsthis?!)\n ^\n", source
|
70
79
|
end
|
71
80
|
|
72
81
|
def test_unexpected_closing
|
@@ -75,7 +84,7 @@ p
|
|
75
84
|
img src=(1+1)]
|
76
85
|
}
|
77
86
|
|
78
|
-
assert_syntax_error "Unexpected closing ]\n (__TEMPLATE__), Line 3\n img src=(1+1)]\n
|
87
|
+
assert_syntax_error "Unexpected closing ]\n (__TEMPLATE__), Line 3\n img src=(1+1)]\n ^\n", source
|
79
88
|
end
|
80
89
|
|
81
90
|
def test_invalid_empty_attribute
|
@@ -84,7 +93,7 @@ p
|
|
84
93
|
img{src= }
|
85
94
|
}
|
86
95
|
|
87
|
-
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img{src= }\n
|
96
|
+
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img{src= }\n ^\n", source
|
88
97
|
end
|
89
98
|
|
90
99
|
def test_invalid_empty_attribute2
|
@@ -93,7 +102,7 @@ p
|
|
93
102
|
img{src=}
|
94
103
|
}
|
95
104
|
|
96
|
-
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img{src=}\n
|
105
|
+
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img{src=}\n ^\n", source
|
97
106
|
end
|
98
107
|
|
99
108
|
def test_invalid_empty_attribute3
|
@@ -102,6 +111,6 @@ p
|
|
102
111
|
img src=
|
103
112
|
}
|
104
113
|
|
105
|
-
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img src=\n
|
114
|
+
assert_syntax_error "Invalid empty attribute\n (__TEMPLATE__), Line 3\n img src=\n ^\n", source
|
106
115
|
end
|
107
116
|
end
|
@@ -1,6 +1,17 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestSlimRubyErrors < TestSlim
|
4
|
+
def test_multline_attribute
|
5
|
+
source = %q{
|
6
|
+
p(data-1=1
|
7
|
+
data2-=1)
|
8
|
+
p
|
9
|
+
= unknown_ruby_method
|
10
|
+
}
|
11
|
+
|
12
|
+
assert_ruby_error NameError, "test.slim:5", source, :file => 'test.slim'
|
13
|
+
end
|
14
|
+
|
4
15
|
def test_broken_output_line
|
5
16
|
source = %q{
|
6
17
|
p = hello_world + \
|
data/test_ruby_errors.rb
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestSlimRubyErrors < TestSlim
|
4
|
+
def test_broken_output_line
|
5
|
+
source = %q{
|
6
|
+
p = hello_world + \
|
7
|
+
hello_world + \
|
8
|
+
unknown_ruby_method
|
9
|
+
}
|
10
|
+
|
11
|
+
assert_ruby_error NameError, "test.slim:4", source, :file => 'test.slim'
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_broken_output_line2
|
15
|
+
source = %q{
|
16
|
+
p = hello_world + \
|
17
|
+
hello_world
|
18
|
+
p Hello
|
19
|
+
= unknown_ruby_method
|
20
|
+
}
|
21
|
+
|
22
|
+
assert_ruby_error NameError,"(__TEMPLATE__):5", source
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_output_block
|
26
|
+
source = %q{
|
27
|
+
p = hello_world "Hello Ruby" do
|
28
|
+
= unknown_ruby_method
|
29
|
+
}
|
30
|
+
|
31
|
+
assert_ruby_error NameError,"(__TEMPLATE__):3", source
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_output_block2
|
35
|
+
source = %q{
|
36
|
+
p = hello_world "Hello Ruby" do
|
37
|
+
= "Hello from block"
|
38
|
+
p Hello
|
39
|
+
= unknown_ruby_method
|
40
|
+
}
|
41
|
+
|
42
|
+
assert_ruby_error NameError, "(__TEMPLATE__):5", source
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_text_block
|
46
|
+
source = %q{
|
47
|
+
p Text line 1 Text line 2
|
48
|
+
= unknown_ruby_method
|
49
|
+
}
|
50
|
+
|
51
|
+
assert_ruby_error NameError,"(__TEMPLATE__):4", source
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_text_block2
|
55
|
+
source = %q{
|
56
|
+
|
|
57
|
+
Text line 1
|
58
|
+
Text line 2
|
59
|
+
= unknown_ruby_method
|
60
|
+
}
|
61
|
+
|
62
|
+
assert_ruby_error NameError,"(__TEMPLATE__):5", source
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_comment
|
66
|
+
source = %q{
|
67
|
+
/ Comment line 1
|
68
|
+
Comment line 2
|
69
|
+
= unknown_ruby_method
|
70
|
+
}
|
71
|
+
|
72
|
+
assert_ruby_error NameError,"(__TEMPLATE__):4", source
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_embedded_ruby
|
76
|
+
source = %q{
|
77
|
+
ruby:
|
78
|
+
a = 1
|
79
|
+
b = 2
|
80
|
+
= a + b
|
81
|
+
= unknown_ruby_method
|
82
|
+
}
|
83
|
+
|
84
|
+
assert_ruby_error NameError,"(__TEMPLATE__):6", source
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_embedded_markdown
|
88
|
+
source = %q{
|
89
|
+
markdown:
|
90
|
+
#Header
|
91
|
+
Hello from #{"Markdown!"}
|
92
|
+
"Second Line!"
|
93
|
+
= unknown_ruby_method
|
94
|
+
}
|
95
|
+
|
96
|
+
assert_ruby_error NameError,"(__TEMPLATE__):6", source
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_embedded_liquid
|
100
|
+
source = %q{
|
101
|
+
- text = 'before liquid block'
|
102
|
+
liquid:
|
103
|
+
First
|
104
|
+
{{text}}
|
105
|
+
Third
|
106
|
+
= unknown_ruby_method
|
107
|
+
}
|
108
|
+
|
109
|
+
assert_ruby_error NameError,"(__TEMPLATE__):7", source
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_embedded_javascript
|
113
|
+
source = %q{
|
114
|
+
javascript:
|
115
|
+
alert();
|
116
|
+
alert();
|
117
|
+
= unknown_ruby_method
|
118
|
+
}
|
119
|
+
|
120
|
+
assert_ruby_error NameError,"(__TEMPLATE__):5", source
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_invalid_nested_code
|
124
|
+
source = %q{
|
125
|
+
p
|
126
|
+
- test = 123
|
127
|
+
= "Hello from within a block! "
|
128
|
+
}
|
129
|
+
assert_ruby_syntax_error "(__TEMPLATE__):5", source
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_invalid_nested_output
|
133
|
+
source = %q{
|
134
|
+
p
|
135
|
+
= "Hello Ruby!"
|
136
|
+
= "Hello from within a block! "
|
137
|
+
}
|
138
|
+
assert_ruby_syntax_error "(__TEMPLATE__):5", source
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_invalid_embedded_engine
|
142
|
+
source = %q{
|
143
|
+
p
|
144
|
+
embed_unknown:
|
145
|
+
1+1
|
146
|
+
}
|
147
|
+
|
148
|
+
assert_runtime_error 'Embedded engine embed_unknown not found', source
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_explicit_end
|
152
|
+
source = %q{
|
153
|
+
div
|
154
|
+
- if show_first?
|
155
|
+
p The first paragraph
|
156
|
+
- end
|
157
|
+
}
|
158
|
+
|
159
|
+
assert_runtime_error 'Explicit end statements are forbidden', source
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_id_attribute_merging2
|
163
|
+
source = %{
|
164
|
+
#alpha id="beta" Test it
|
165
|
+
}
|
166
|
+
assert_runtime_error 'Multiple id attributes specified', source
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_multiline_attributes
|
170
|
+
source = %q{
|
171
|
+
p(id="id"
|
172
|
+
foo=1+1
|
173
|
+
class=unknown_ruby_method)
|
174
|
+
p
|
175
|
+
}
|
176
|
+
|
177
|
+
assert_ruby_error NameError,"(__TEMPLATE__):3", source
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
def test_multiline_ruby_attribute
|
182
|
+
source = %q{
|
183
|
+
p id=(1+
|
184
|
+
+2
|
185
|
+
+unknown_ruby_method)
|
186
|
+
p
|
187
|
+
}
|
188
|
+
|
189
|
+
assert_ruby_error NameError,"(__TEMPLATE__):4", source
|
190
|
+
end
|
191
|
+
end
|