PageRenderTime 732ms CodeModel.GetById 23ms RepoModel.GetById 2ms app.codeStats 0ms

/test/mri/erb/test_erb.rb

http://github.com/jruby/jruby
Ruby | 497 lines | 487 code | 8 blank | 2 comment | 0 complexity | 28aa77e426d3755bf4c7f4f821cf38fb MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, GPL-2.0, JSON, LGPL-2.1
  1. # -*- coding: us-ascii -*-
  2. # frozen_string_literal: false
  3. require 'test/unit'
  4. require 'erb'
  5. class TestERB < Test::Unit::TestCase
  6. class MyError < RuntimeError ; end
  7. def test_without_filename
  8. erb = ERB.new("<% raise ::TestERB::MyError %>")
  9. e = assert_raise(MyError) {
  10. erb.result
  11. }
  12. assert_match(/\A\(erb\):1\b/, e.backtrace[0])
  13. end
  14. def test_with_filename
  15. erb = ERB.new("<% raise ::TestERB::MyError %>")
  16. erb.filename = "test filename"
  17. e = assert_raise(MyError) {
  18. erb.result
  19. }
  20. assert_match(/\Atest filename:1\b/, e.backtrace[0])
  21. end
  22. def test_without_filename_with_safe_level
  23. erb = ERB.new("<% raise ::TestERB::MyError %>", 1)
  24. e = assert_raise(MyError) {
  25. erb.result
  26. }
  27. assert_match(/\A\(erb\):1\b/, e.backtrace[0])
  28. end
  29. def test_with_filename_and_safe_level
  30. erb = ERB.new("<% raise ::TestERB::MyError %>", 1)
  31. erb.filename = "test filename"
  32. e = assert_raise(MyError) {
  33. erb.result
  34. }
  35. assert_match(/\Atest filename:1\b/, e.backtrace[0])
  36. end
  37. def test_with_filename_lineno
  38. erb = ERB.new("<% raise ::TestERB::MyError %>")
  39. erb.filename = "test filename"
  40. erb.lineno = 100
  41. e = assert_raise(MyError) {
  42. erb.result
  43. }
  44. assert_match(/\Atest filename:101\b/, e.backtrace[0])
  45. end
  46. def test_with_location
  47. erb = ERB.new("<% raise ::TestERB::MyError %>")
  48. erb.location = ["test filename", 200]
  49. e = assert_raise(MyError) {
  50. erb.result
  51. }
  52. assert_match(/\Atest filename:201\b/, e.backtrace[0])
  53. end
  54. def test_html_escape
  55. assert_equal(" !&quot;\#$%&amp;&#39;()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
  56. ERB::Util.html_escape(" !\"\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"))
  57. assert_equal("", ERB::Util.html_escape(""))
  58. assert_equal("abc", ERB::Util.html_escape("abc"))
  59. assert_equal("&lt;&lt;", ERB::Util.html_escape("<\<"))
  60. assert_equal("", ERB::Util.html_escape(nil))
  61. assert_equal("123", ERB::Util.html_escape(123))
  62. end
  63. def test_concurrent_default_binding
  64. template1 = 'one <%= ERB.new(template2).result %>'
  65. eval 'template2 = "two"', TOPLEVEL_BINDING
  66. bug7046 = '[ruby-core:47638]'
  67. assert_equal("one two", ERB.new(template1).result, bug7046)
  68. end
  69. end
  70. class TestERBCore < Test::Unit::TestCase
  71. def setup
  72. @erb = ERB
  73. end
  74. def test_core
  75. _test_core(nil)
  76. _test_core(0)
  77. _test_core(1)
  78. end
  79. def _test_core(safe)
  80. erb = @erb.new("hello")
  81. assert_equal("hello", erb.result)
  82. erb = @erb.new("hello", safe, 0)
  83. assert_equal("hello", erb.result)
  84. erb = @erb.new("hello", safe, 1)
  85. assert_equal("hello", erb.result)
  86. erb = @erb.new("hello", safe, 2)
  87. assert_equal("hello", erb.result)
  88. src = <<EOS
  89. %% hi
  90. = hello
  91. <% 3.times do |n| %>
  92. % n=0
  93. * <%= n %>
  94. <% end %>
  95. EOS
  96. ans = <<EOS
  97. %% hi
  98. = hello
  99. % n=0
  100. * 0
  101. % n=0
  102. * 1
  103. % n=0
  104. * 2
  105. EOS
  106. erb = @erb.new(src)
  107. assert_equal(ans, erb.result)
  108. erb = @erb.new(src, safe, 0)
  109. assert_equal(ans, erb.result)
  110. erb = @erb.new(src, safe, '')
  111. assert_equal(ans, erb.result)
  112. ans = <<EOS
  113. %% hi
  114. = hello
  115. % n=0
  116. * 0% n=0
  117. * 1% n=0
  118. * 2
  119. EOS
  120. erb = @erb.new(src, safe, 1)
  121. assert_equal(ans.chomp, erb.result)
  122. erb = @erb.new(src, safe, '>')
  123. assert_equal(ans.chomp, erb.result)
  124. ans = <<EOS
  125. %% hi
  126. = hello
  127. % n=0
  128. * 0
  129. % n=0
  130. * 1
  131. % n=0
  132. * 2
  133. EOS
  134. erb = @erb.new(src, safe, 2)
  135. assert_equal(ans, erb.result)
  136. erb = @erb.new(src, safe, '<>')
  137. assert_equal(ans, erb.result)
  138. ans = <<EOS
  139. % hi
  140. = hello
  141. * 0
  142. * 0
  143. * 0
  144. EOS
  145. erb = @erb.new(src, safe, '%')
  146. assert_equal(ans, erb.result)
  147. ans = <<EOS
  148. % hi
  149. = hello
  150. * 0* 0* 0
  151. EOS
  152. erb = @erb.new(src, safe, '%>')
  153. assert_equal(ans.chomp, erb.result)
  154. ans = <<EOS
  155. % hi
  156. = hello
  157. * 0
  158. * 0
  159. * 0
  160. EOS
  161. erb = @erb.new(src, safe, '%<>')
  162. assert_equal(ans, erb.result)
  163. end
  164. class Foo; end
  165. def test_def_class
  166. erb = @erb.new('hello')
  167. cls = erb.def_class
  168. assert_equal(Object, cls.superclass)
  169. assert(cls.new.respond_to?('result'))
  170. cls = erb.def_class(Foo)
  171. assert_equal(Foo, cls.superclass)
  172. assert(cls.new.respond_to?('result'))
  173. cls = erb.def_class(Object, 'erb')
  174. assert_equal(Object, cls.superclass)
  175. assert(cls.new.respond_to?('erb'))
  176. end
  177. def test_percent
  178. src = <<EOS
  179. %n = 1
  180. <%= n%>
  181. EOS
  182. assert_equal("1\n", ERB.new(src, nil, '%').result(binding))
  183. src = <<EOS
  184. <%
  185. %>
  186. EOS
  187. ans = "\n"
  188. assert_equal(ans, ERB.new(src, nil, '%').result(binding))
  189. src = "<%\n%>"
  190. # ans = "\n"
  191. ans = ""
  192. assert_equal(ans, ERB.new(src, nil, '%').result(binding))
  193. src = <<EOS
  194. <%
  195. n = 1
  196. %><%= n%>
  197. EOS
  198. assert_equal("1\n", ERB.new(src, nil, '%').result(binding))
  199. src = <<EOS
  200. %n = 1
  201. %% <% n = 2
  202. n.times do |i|%>
  203. %% %%><%%<%= i%><%
  204. end%>
  205. %%%
  206. EOS
  207. ans = <<EOS
  208. %\s
  209. % %%><%0
  210. % %%><%1
  211. %%
  212. EOS
  213. assert_equal(ans, ERB.new(src, nil, '%').result(binding))
  214. end
  215. def test_def_erb_method
  216. klass = Class.new
  217. klass.module_eval do
  218. extend ERB::DefMethod
  219. fname = File.join(File.dirname(File.expand_path(__FILE__)), 'hello.erb')
  220. def_erb_method('hello', fname)
  221. end
  222. assert(klass.new.respond_to?('hello'))
  223. assert(! klass.new.respond_to?('hello_world'))
  224. erb = @erb.new('hello, world')
  225. klass.module_eval do
  226. def_erb_method('hello_world', erb)
  227. end
  228. assert(klass.new.respond_to?('hello_world'))
  229. end
  230. def test_def_method_without_filename
  231. klass = Class.new
  232. erb = ERB.new("<% raise ::TestERB::MyError %>")
  233. erb.filename = "test filename"
  234. assert(! klass.new.respond_to?('my_error'))
  235. erb.def_method(klass, 'my_error')
  236. e = assert_raise(::TestERB::MyError) {
  237. klass.new.my_error
  238. }
  239. assert_match(/\A\(ERB\):1\b/, e.backtrace[0])
  240. end
  241. def test_def_method_with_fname
  242. klass = Class.new
  243. erb = ERB.new("<% raise ::TestERB::MyError %>")
  244. erb.filename = "test filename"
  245. assert(! klass.new.respond_to?('my_error'))
  246. erb.def_method(klass, 'my_error', 'test fname')
  247. e = assert_raise(::TestERB::MyError) {
  248. klass.new.my_error
  249. }
  250. assert_match(/\Atest fname:1\b/, e.backtrace[0])
  251. end
  252. def test_escape
  253. src = <<EOS
  254. 1.<%% : <%="<%%"%>
  255. 2.%%> : <%="%%>"%>
  256. 3.
  257. % x = "foo"
  258. <%=x%>
  259. 4.
  260. %% print "foo"
  261. 5.
  262. %% <%="foo"%>
  263. 6.<%="
  264. % print 'foo'
  265. "%>
  266. 7.<%="
  267. %% print 'foo'
  268. "%>
  269. EOS
  270. ans = <<EOS
  271. 1.<% : <%%
  272. 2.%%> : %>
  273. 3.
  274. foo
  275. 4.
  276. % print "foo"
  277. 5.
  278. % foo
  279. 6.
  280. % print 'foo'
  281. 7.
  282. %% print 'foo'
  283. EOS
  284. assert_equal(ans, ERB.new(src, nil, '%').result)
  285. end
  286. def test_keep_lineno
  287. src = <<EOS
  288. Hello,\s
  289. % x = "World"
  290. <%= x%>
  291. % raise("lineno")
  292. EOS
  293. erb = ERB.new(src, nil, '%')
  294. begin
  295. erb.result
  296. assert(false)
  297. rescue
  298. assert_match(/\A\(erb\):4\b/, $@[0].to_s)
  299. end
  300. src = <<EOS
  301. %>
  302. Hello,\s
  303. <% x = "World%%>
  304. "%>
  305. <%= x%>
  306. EOS
  307. ans = <<EOS
  308. %>Hello,\s
  309. World%>
  310. EOS
  311. assert_equal(ans, ERB.new(src, nil, '>').result)
  312. ans = <<EOS
  313. %>
  314. Hello,\s
  315. World%>
  316. EOS
  317. assert_equal(ans, ERB.new(src, nil, '<>').result)
  318. ans = <<EOS
  319. %>
  320. Hello,\s
  321. World%>
  322. EOS
  323. assert_equal(ans, ERB.new(src).result)
  324. src = <<EOS
  325. Hello,\s
  326. <% x = "World%%>
  327. "%>
  328. <%= x%>
  329. <% raise("lineno") %>
  330. EOS
  331. erb = ERB.new(src)
  332. begin
  333. erb.result
  334. assert(false)
  335. rescue
  336. assert_match(/\A\(erb\):5\b/, $@[0].to_s)
  337. end
  338. erb = ERB.new(src, nil, '>')
  339. begin
  340. erb.result
  341. assert(false)
  342. rescue
  343. assert_match(/\A\(erb\):5\b/, $@[0].to_s)
  344. end
  345. erb = ERB.new(src, nil, '<>')
  346. begin
  347. erb.result
  348. assert(false)
  349. rescue
  350. assert_match(/\A\(erb\):5\b/, $@[0].to_s)
  351. end
  352. src = <<EOS
  353. % y = 'Hello'
  354. <%- x = "World%%>
  355. "-%>
  356. <%= x %><%- x = nil -%>\s
  357. <% raise("lineno") %>
  358. EOS
  359. erb = ERB.new(src, nil, '-')
  360. begin
  361. erb.result
  362. assert(false)
  363. rescue
  364. assert_match(/\A\(erb\):5\b/, $@[0].to_s)
  365. end
  366. erb = ERB.new(src, nil, '%-')
  367. begin
  368. erb.result
  369. assert(false)
  370. rescue
  371. assert_match(/\A\(erb\):5\b/, $@[0].to_s)
  372. end
  373. end
  374. def test_explicit
  375. src = <<EOS
  376. <% x = %w(hello world) -%>
  377. NotSkip <%- y = x -%> NotSkip
  378. <% x.each do |w| -%>
  379. <%- up = w.upcase -%>
  380. * <%= up %>
  381. <% end -%>
  382. <%- z = nil -%> NotSkip <%- z = x %>
  383. <%- z.each do |w| -%>
  384. <%- down = w.downcase -%>
  385. * <%= down %>
  386. <%- up = w.upcase -%>
  387. * <%= up %>
  388. <%- end -%>
  389. KeepNewLine <%- z = nil -%>\s
  390. EOS
  391. ans = <<EOS
  392. NotSkip NotSkip
  393. * HELLO
  394. * WORLD
  395. NotSkip\s
  396. * hello
  397. * HELLO
  398. * world
  399. * WORLD
  400. KeepNewLine \s
  401. EOS
  402. assert_equal(ans, ERB.new(src, nil, '-').result)
  403. assert_equal(ans, ERB.new(src, nil, '-%').result)
  404. end
  405. def test_url_encode
  406. assert_equal("Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide",
  407. ERB::Util.url_encode("Programming Ruby: The Pragmatic Programmer's Guide"))
  408. assert_equal("%A5%B5%A5%F3%A5%D7%A5%EB",
  409. ERB::Util.url_encode("\xA5\xB5\xA5\xF3\xA5\xD7\xA5\xEB".force_encoding("EUC-JP")))
  410. end
  411. def test_percent_after_etag
  412. assert_equal("1%", @erb.new("<%= 1 %>%", nil, "%").result)
  413. end
  414. end
  415. class TestERBCoreWOStrScan < TestERBCore
  416. def setup
  417. @save_map = ERB::Compiler::Scanner.instance_variable_get('@scanner_map')
  418. map = {[nil, false]=>ERB::Compiler::SimpleScanner}
  419. ERB::Compiler::Scanner.instance_variable_set('@scanner_map', map)
  420. super
  421. end
  422. def teardown
  423. ERB::Compiler::Scanner.instance_variable_set('@scanner_map', @save_map)
  424. end
  425. end