diff --git a/test/erb/hello.erb b/test/erb/hello.erb new file mode 100644 index 0000000000..d5ebcb73b9 --- /dev/null +++ b/test/erb/hello.erb @@ -0,0 +1,4 @@ += hello +<% 3.times do |n| %> +* <%= n %> +<% end %> diff --git a/test/erb/test_erb.rb b/test/erb/test_erb.rb index 0572720635..b2099af6b8 100644 --- a/test/erb/test_erb.rb +++ b/test/erb/test_erb.rb @@ -9,7 +9,7 @@ class TestERB < Test::Unit::TestCase e = assert_raise(MyError) { erb.result } - assert_equal("(erb):1:in `raise'", e.backtrace[0]) + assert_match(/\A\(erb\):1\b/, e.backtrace[0]) end def test_with_filename @@ -18,7 +18,7 @@ class TestERB < Test::Unit::TestCase e = assert_raise(MyError) { erb.result } - assert_equal("test filename:1:in `raise'", e.backtrace[0]) + assert_match(/\Atest filename:1\b/, e.backtrace[0]) end def test_without_filename_with_safe_level @@ -26,7 +26,7 @@ class TestERB < Test::Unit::TestCase e = assert_raise(MyError) { erb.result } - assert_equal("(erb):1:in `raise'", e.backtrace[0]) + assert_match(/\A\(erb\):1\b/, e.backtrace[0]) end def test_with_filename_and_safe_level @@ -35,6 +35,379 @@ class TestERB < Test::Unit::TestCase e = assert_raise(MyError) { erb.result } - assert_equal("test filename:1:in `raise'", e.backtrace[0]) + assert_match(/\Atest filename:1\b/, e.backtrace[0]) + end +end + +class TestERBCore < Test::Unit::TestCase + def setup + @erb = ERB + end + + def test_01 + _test_01(nil) + _test_01(0) + _test_01(1) + _test_01(2) + _test_01(3) + end + + def _test_01(safe) + erb = @erb.new("hello") + assert_equal(erb.result, "hello") + + erb = @erb.new("hello", safe, 0) + assert_equal(erb.result, "hello") + + erb = @erb.new("hello", safe, 1) + assert_equal(erb.result, "hello") + + erb = @erb.new("hello", safe, 2) + assert_equal(erb.result, "hello") + + src = < +% n=0 +* <%= n %> +<% end %> +EOS + + ans = <') + assert_equal(ans.chomp, erb.result) + + ans = <') + assert_equal(ans, erb.result) + + ans = <') + assert_equal(ans.chomp, erb.result) + + ans = <') + assert_equal(ans, erb.result) + end + + def test_02_safe_04 + erb = @erb.new('<%=$SAFE%>', 4) + assert_equal(erb.result(TOPLEVEL_BINDING.taint), '4') + end + + class Foo; end + + def test_03_def_class + erb = @erb.new('hello') + cls = erb.def_class + assert_equal(Object, cls.superclass) + assert(cls.new.respond_to?('result')) + cls = erb.def_class(Foo) + assert_equal(Foo, cls.superclass) + assert(cls.new.respond_to?('result')) + cls = erb.def_class(Object, 'erb') + assert_equal(Object, cls.superclass) + assert(cls.new.respond_to?('erb')) + end + + def test_04_percent + src = < +EOS + assert_equal("1\n", ERB.new(src, nil, '%').result) + + src = < +EOS + ans = "\n" + assert_equal(ans, ERB.new(src, nil, '%').result) + + src = "<%\n%>" + # ans = "\n" + ans = "" + assert_equal(ans, ERB.new(src, nil, '%').result) + + src = <<%= n%> +EOS + assert_equal("1\n", ERB.new(src, nil, '%').result) + + src = < +%% %%><%%<%= i%><% +end%> +EOS + ans = <<%0 +% %%><%1 +EOS + assert_equal(ans, ERB.new(src, nil, '%').result) + end + + class Bar; end + + def test_05_def_method + assert(! Bar.new.respond_to?('hello')) + Bar.module_eval do + extend ERB::DefMethod + fname = File.join(File.dirname(File.expand_path(__FILE__)), 'hello.erb') + def_erb_method('hello', fname) + end + assert(Bar.new.respond_to?('hello')) + + assert(! Bar.new.respond_to?('hello_world')) + erb = @erb.new('hello, world') + Bar.module_eval do + def_erb_method('hello_world', erb) + end + assert(Bar.new.respond_to?('hello_world')) + end + + def test_06_escape + src = < +2.%%> : <%="%%>"%> +3. +% x = "foo" +<%=x%> +4. +%% print "foo" +5. +%% <%="foo"%> +6.<%=" +% print 'foo' +"%> +7.<%=" +%% print 'foo' +"%> +EOS + ans = < : %> +3. +foo +4. +% print "foo" +5. +% foo +6. +% print 'foo' + +7. +%% print 'foo' + +EOS + assert_equal(ans, ERB.new(src, nil, '%').result) + end + + def test_07_keep_lineno + src = < +% raise("lineno") +EOS + + erb = ERB.new(src, nil, '%') + begin + erb.result + assert(false) + rescue + assert_match(/\A\(erb\):4\b/, $@[0].to_s) + end + + src = < +Hello, +<% x = "World%%> +"%> +<%= x%> +EOS + + ans = <Hello, +World%> +EOS + assert_equal(ans, ERB.new(src, nil, '>').result) + + ans = < +Hello, + +World%> +EOS + assert_equal(ans, ERB.new(src, nil, '<>').result) + + ans = < +Hello, + +World%> + +EOS + assert_equal(ans, ERB.new(src).result) + + src = < +<%= x%> +<% raise("lineno") %> +EOS + + erb = ERB.new(src) + begin + erb.result + assert(false) + rescue + assert_match(/\A\(erb\):5\b/, $@[0].to_s) + end + + erb = ERB.new(src, nil, '>') + begin + erb.result + assert(false) + rescue + assert_match(/\A\(erb\):5\b/, $@[0].to_s) + end + + erb = ERB.new(src, nil, '<>') + begin + erb.result + assert(false) + rescue + assert_match(/\A\(erb\):5\b/, $@[0].to_s) + end + + src = < +<%= x %><%- x = nil -%> +<% raise("lineno") %> +EOS + + erb = ERB.new(src, nil, '-') + begin + erb.result + assert(false) + rescue + assert_match(/\A\(erb\):5\b/, $@[0].to_s) + end + + erb = ERB.new(src, nil, '%-') + begin + erb.result + assert(false) + rescue + assert_match(/\A\(erb\):5\b/, $@[0].to_s) + end + end + + def test_08_explicit + src = < +NotSkip <%- y = x -%> NotSkip +<% x.each do |w| -%> + <%- up = w.upcase -%> + * <%= up %> +<% end -%> + <%- z = nil -%> NotSkip <%- z = x %> + <%- z.each do |w| -%> + <%- down = w.downcase -%> + * <%= down %> + <%- up = w.upcase -%> + * <%= up %> + <%- end -%> +KeepNewLine <%- z = nil -%> +EOS + + ans = <