PageRenderTime 51ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/External.LCA_RESTRICTED/Languages/Ruby/ruby19/lib/ruby/gems/1.9.1/gems/erubis-2.6.6/test/test-erubis.rb

http://github.com/IronLanguages/main
Ruby | 883 lines | 820 code | 35 blank | 28 comment | 29 complexity | b9ca00f01849e6c4439892c98e384f48 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. ##
  2. ## $Release: 2.6.6 $
  3. ## copyright(c) 2006-2010 kuwata-lab.com all rights reserved.
  4. ##
  5. require "#{File.dirname(__FILE__)}/test.rb"
  6. require 'stringio'
  7. require 'erubis'
  8. require 'erubis/engine/enhanced'
  9. require 'erubis/engine/optimized'
  10. require 'erubis/tiny'
  11. class ErubisTest < Test::Unit::TestCase
  12. testdata_list = load_yaml_datafile(__FILE__)
  13. define_testmethods(testdata_list)
  14. def _test()
  15. @src.gsub!(/\^/, ' ')
  16. @output.gsub!(/\^/, ' ') if @output.is_a?(String)
  17. if @class
  18. k = Erubis
  19. @class.split('::').each do |name| k = k.const_get(name) end
  20. @klass = k
  21. else
  22. @klass = Erubis::Eruby
  23. end
  24. @options ||= {}
  25. @chomp.each do |target|
  26. case target
  27. when 'src' ; @src.chomp!
  28. when 'input' ; @input.chomp!
  29. when 'expected' ; @expected.chomp!
  30. else
  31. raise "#{@name}: invalid chomp value: #{@chomp.inspect}"
  32. end
  33. end if @chomp
  34. if @testopt == 'load_file'
  35. filename = "tmp.#{@name}.eruby"
  36. begin
  37. File.open(filename, 'w') { |f| f.write(@input) }
  38. eruby = @klass.load_file(filename, @options)
  39. ensure
  40. cachename = filename + '.cache'
  41. File.unlink(cachename) if test(?f, cachename)
  42. File.unlink(filename) if test(?f, filename)
  43. end
  44. else
  45. if @klass == Erubis::TinyEruby
  46. eruby = @klass.new(@input)
  47. else
  48. eruby = @klass.new(@input, @options)
  49. end
  50. end
  51. assert_text_equal(@src, eruby.src)
  52. return if @testopt == 'skip_output'
  53. list = ['<aaa>', 'b&b', '"ccc"']
  54. context = @testopt == 'context' ? Erubis::Context.new : {}
  55. context[:list] = list
  56. case @testopt
  57. when /\Aeval\(/
  58. eval eruby.src
  59. actual = eval @testopt
  60. assert_text_equal(@output, actual)
  61. when 'stdout', 'print'
  62. begin
  63. orig = $stdout
  64. $stdout = stringio = StringIO.new
  65. #actual = eruby.evaluate(context)
  66. actual = eruby.result(context)
  67. ensure
  68. $stdout = orig
  69. end
  70. if @testopt == 'stdout'
  71. assert_equal("", actual)
  72. else
  73. assert_nil(actual)
  74. end
  75. assert_text_equal(@output, stringio.string)
  76. when 'evaluate', 'context'
  77. actual = eruby.evaluate(context)
  78. assert_text_equal(@output, actual)
  79. when 'binding'
  80. actual = eruby.result(binding())
  81. assert_text_equal(@output, actual)
  82. else
  83. actual = eruby.result(context)
  84. assert_text_equal(@output, actual)
  85. end
  86. end
  87. def test_load_file_cache1
  88. @input = <<END
  89. <ul>
  90. <% for item in @list %>
  91. <li><%= item %></li>
  92. <% end %>
  93. </ul>
  94. END
  95. @src = <<END
  96. _buf = ''; _buf << '<ul>
  97. '; for item in @list
  98. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  99. '; end
  100. _buf << '</ul>
  101. ';
  102. _buf.to_s
  103. END
  104. @klass = Erubis::Eruby
  105. filename = 'tmp.load_file_timestamp1'
  106. cachename = filename + '.cache'
  107. begin
  108. File.open(filename, 'w') { |f| f.write(@input) }
  109. assert_block() { !test(?f, cachename) }
  110. engine = @klass.load_file(filename)
  111. assert_block() { test(?f, cachename) }
  112. assert_block() { File.mtime(filename) <= File.mtime(cachename) }
  113. assert_text_equal(@src, engine.src)
  114. #
  115. input2 = @input.gsub(/ul>/, 'ol>')
  116. src2 = @src.gsub(/ul>/, 'ol>')
  117. mtime = File.mtime(filename)
  118. File.open(filename, 'w') { |f| f.write(input2) }
  119. t1 = Time.now()
  120. sleep(1)
  121. t2 = Time.now()
  122. File.utime(t1, t1, filename)
  123. File.utime(t2, t2, cachename)
  124. assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
  125. engine = @klass.load_file(filename)
  126. assert_block('cache should be newer') { File.mtime(filename) < File.mtime(cachename) }
  127. assert_text_equal(@src, engine.src)
  128. #
  129. File.utime(t2, t2, filename)
  130. File.utime(t1, t1, cachename)
  131. assert_block('cache should be older') { File.mtime(filename) > File.mtime(cachename) }
  132. engine = @klass.load_file(filename)
  133. assert_block('cache should be newer') { File.mtime(filename) <= File.mtime(cachename) }
  134. assert_text_equal(src2, engine.src)
  135. ensure
  136. File.unlink(cachename) if File.file?(cachename)
  137. File.unlink(filename) if File.file?(filename)
  138. end
  139. end
  140. class Dummy
  141. end
  142. def _class_has_instance_method(klass, method)
  143. return klass.instance_methods.collect{|m| m.to_s}.include?(method.to_s)
  144. end
  145. def test_def_method1
  146. s = "<%for i in list%>i=<%=i%>\n<%end%>"
  147. eruby = Erubis::Eruby.new(s)
  148. assert(! _class_has_instance_method(Dummy, 'render'))
  149. eruby.def_method(Dummy, 'render(list)', 'foo.rhtml')
  150. assert(_class_has_instance_method(Dummy, 'render'))
  151. actual = Dummy.new().render(%w[1 2 3])
  152. assert_equal("i=1\ni=2\ni=3\n", actual)
  153. end
  154. def test_def_method2
  155. s = "<%for i in list%>i=<%=i%>\n<%end%>"
  156. eruby = Erubis::Eruby.new(s)
  157. assert(! (eruby.respond_to? :render))
  158. eruby.def_method(eruby, 'render(list)', 'foo.rhtml')
  159. assert eruby.respond_to?(:render)
  160. actual = eruby.render([1, 2, 3])
  161. assert_equal("i=1\ni=2\ni=3\n", actual)
  162. assert(! _class_has_instance_method(eruby.class, 'render'))
  163. end
  164. def test_evaluate_creates_proc
  165. s = "hello <%= @name %>"
  166. eruby = Erubis::Eruby.new(s)
  167. assert_nil(eruby.instance_variable_get('@_proc'))
  168. actual1 = eruby.evaluate(:name=>'world')
  169. assert_not_nil(eruby.instance_variable_get('@_proc'))
  170. assert_instance_of(Proc, eruby.instance_variable_get('@_proc'))
  171. actual2 = eruby.evaluate(:name=>'world')
  172. assert_equal(actual1, actual2)
  173. # convert() must clear @_proc
  174. eruby.convert(s)
  175. assert_nil(eruby.instance_variable_get('@_proc'))
  176. end
  177. #def test_toplevel_binding
  178. # s = "locals = <%= local_variables().inspect %>\n<% x = 50 %>\n"
  179. # eruby = Erubis::Eruby.new(s)
  180. # _x = eval 'x', TOPLEVEL_BINDING
  181. # _y = eval 'y', TOPLEVEL_BINDING
  182. # actual = eruby.evaluate(:x=>_x, :y=>_y)
  183. # _x = eval 'x', TOPLEVEL_BINDING
  184. # _y = eval 'y', TOPLEVEL_BINDING
  185. # puts "*** actual=#{actual.inspect}, x=#{_x.inspect}, y=#{_y.inspect}"
  186. #end
  187. self.post_definition()
  188. end
  189. x = 10
  190. y = 20
  191. __END__
  192. - name: basic1
  193. input: &basic1_input|
  194. <ul>
  195. <% for item in list %>
  196. <li><%= item %></li>
  197. <% end %>
  198. </ul>
  199. src: &basic1_src|
  200. _buf = ''; _buf << '<ul>
  201. '; for item in list
  202. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  203. '; end
  204. _buf << '</ul>
  205. ';
  206. _buf.to_s
  207. output: &basic1_output|
  208. <ul>
  209. <li><aaa></li>
  210. <li>b&b</li>
  211. <li>"ccc"</li>
  212. </ul>
  213. ##
  214. - name: basic2
  215. input: |
  216. <ul>
  217. <% i = 0
  218. for item in list
  219. i += 1
  220. %>
  221. <li><%= item %></li>
  222. <% end %>
  223. </ul>
  224. src: |
  225. _buf = ''; _buf << '<ul>
  226. '; i = 0
  227. for item in list
  228. i += 1
  229. ^^^
  230. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  231. '; end
  232. _buf << '</ul>
  233. ';
  234. _buf.to_s
  235. output: *basic1_output
  236. # <ul>
  237. # <li><aaa></li>
  238. # <li>b&b</li>
  239. # <li>"ccc"</li>
  240. # </ul>
  241. ##
  242. - name: basic3
  243. input: |
  244. <ul><% i = 0
  245. for item in list
  246. i += 1 %><li><%= item %></li><% end %>
  247. </ul>
  248. src: |
  249. _buf = ''; _buf << '<ul>'; i = 0
  250. for item in list
  251. i += 1 ; _buf << '<li>'; _buf << ( item ).to_s; _buf << '</li>'; end ; _buf << '
  252. '; _buf << '</ul>
  253. ';
  254. _buf.to_s
  255. output: |
  256. <ul><li><aaa></li><li>b&b</li><li>"ccc"</li>
  257. </ul>
  258. ##
  259. - name: context1
  260. testopt: context
  261. input: |
  262. <ul>
  263. <% for item in @list %>
  264. <li><%= item %></li>
  265. <% end %>
  266. </ul>
  267. src: |
  268. _buf = ''; _buf << '<ul>
  269. '; for item in @list
  270. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  271. '; end
  272. _buf << '</ul>
  273. ';
  274. _buf.to_s
  275. output: *basic1_output
  276. ##
  277. - name: ignore1
  278. input: |
  279. <ul>
  280. <%# i = 0 %>
  281. <% for item in list %>
  282. <%#
  283. i += 1
  284. color = i % 2 == 0 ? '#FFCCCC' : '#CCCCFF'
  285. %>
  286. <li> <%#= i %> : <%= item %> </li>
  287. <% end %>
  288. </ul>
  289. src: |
  290. _buf = ''; _buf << '<ul>
  291. ';
  292. for item in list
  293. _buf << ' <li> ';; _buf << ' : '; _buf << ( item ).to_s; _buf << ' </li>
  294. '; end
  295. _buf << '</ul>
  296. ';
  297. _buf.to_s
  298. output: |
  299. <ul>
  300. <li> : <aaa> </li>
  301. <li> : b&b </li>
  302. <li> : "ccc" </li>
  303. </ul>
  304. ##
  305. - name: quotation1
  306. desc: single quotation and backslash
  307. class: Eruby
  308. input: &quotation1_input|
  309. a = "'"
  310. b = "\""
  311. c = '\''
  312. src: |
  313. _buf = ''; _buf << 'a = "\'"
  314. b = "\\""
  315. c = \'\\\'\'
  316. ';
  317. _buf.to_s
  318. output: *quotation1_input
  319. ##
  320. - name: minus1
  321. desc: '<%- -%>'
  322. class: Eruby
  323. input: |
  324. <ul>
  325. <%- for item in list -%>
  326. <li><%= item -%></li>
  327. <% end -%>
  328. </ul>
  329. src: *basic1_src
  330. output: *basic1_output
  331. ##
  332. - name: pattern1
  333. options:
  334. :pattern : '\[@ @\]'
  335. input: |
  336. <ul>
  337. [@ for item in list @]
  338. <li>[@= item @]</li>
  339. [@ end @]
  340. </ul>
  341. src: |
  342. _buf = ''; _buf << '<ul>
  343. '; for item in list
  344. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  345. '; end
  346. _buf << '</ul>
  347. ';
  348. _buf.to_s
  349. output: *basic1_output
  350. # <ul>
  351. # <li><aaa></li>
  352. # <li>b&b</li>
  353. # <li>"ccc"</li>
  354. # </ul>
  355. ##
  356. - name: pattern2
  357. options:
  358. :pattern : '<(?:!--)?% %(?:--)?>'
  359. input: |
  360. <ul>
  361. <!--% for item in list %-->
  362. <li><%= item %></li>
  363. <!--% end %-->
  364. </ul>
  365. src: |
  366. _buf = ''; _buf << '<ul>
  367. '; for item in list
  368. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  369. '; end
  370. _buf << '</ul>
  371. ';
  372. _buf.to_s
  373. output: *basic1_output
  374. # <ul>
  375. # <li><aaa></li>
  376. # <li>b&b</li>
  377. # <li>"ccc"</li>
  378. # </ul>
  379. ##
  380. - name: trim1
  381. options:
  382. :trim : false
  383. input: *basic1_input
  384. # <ul>
  385. # <% for item in list %>
  386. # <li><%= item %></li>
  387. # <% end %>
  388. # </ul>
  389. src: |
  390. _buf = ''; _buf << '<ul>
  391. '; _buf << ' '; for item in list ; _buf << '
  392. '; _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  393. '; _buf << ' '; end ; _buf << '
  394. '; _buf << '</ul>
  395. ';
  396. _buf.to_s
  397. output: |
  398. <ul>
  399. ^
  400. <li><aaa></li>
  401. ^
  402. <li>b&b</li>
  403. ^
  404. <li>"ccc"</li>
  405. ^
  406. </ul>
  407. ##
  408. - name: bodyonly1
  409. testopt: skip_output
  410. options: { :preamble: no, :postamble: no }
  411. input: *basic1_input
  412. src: |4
  413. _buf << '<ul>
  414. '; for item in list
  415. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  416. '; end
  417. _buf << '</ul>
  418. ';
  419. chomp: [src]
  420. expected: null
  421. ##
  422. - name: loadfile1
  423. testopt: load_file
  424. #input: |
  425. # <ul>
  426. # <% for item in list %>
  427. # <li><%= item %></li>
  428. # <% end %>
  429. # </ul>
  430. input:
  431. "<ul>\r\n <% for item in list %>\r\n <li><%= item %></li>\r\n <% end %>\r\n</ul>\r\n"
  432. #src: |
  433. # _buf = ''; _buf << "<ul>\n"
  434. # for item in list
  435. # _buf << " <li>"; _buf << ( item ).to_s; _buf << "</li>\n"
  436. # end
  437. # _buf << "</ul>\n"
  438. # _buf
  439. src:
  440. "_buf = ''; _buf << '<ul>\r\n'; for item in list \r\n _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>\r\n'; end \r\n _buf << '</ul>\r\n';\n_buf.to_s\n"
  441. #output: |
  442. # <ul>
  443. # <li><aaa></li>
  444. # <li>b&b</li>
  445. # <li>"ccc"</li>
  446. # </ul>
  447. output:
  448. "<ul>\n <li><aaa></li>\n <li>b&b</li>\n <li>\"ccc\"</li>\n</ul>\n"
  449. # "<ul>\r\n <li><aaa></li>\r\n <li>b&b</li>\r\n <li>\"ccc\"</li>\r\n</ul>\r\n"
  450. ##
  451. - name: nomatch1
  452. desc: bug
  453. input: &nomatch1|
  454. <ul>
  455. <li>foo</li>
  456. </ul>
  457. src: |
  458. _buf = ''; _buf << '<ul>
  459. <li>foo</li>
  460. </ul>
  461. ';
  462. _buf.to_s
  463. output: *nomatch1
  464. ##
  465. - name: escape1
  466. options: { :escape: true }
  467. input: |
  468. <% str = '<>&"' %>
  469. <%= str %>
  470. <%== str %>
  471. src: |
  472. _buf = ''; str = '<>&"'
  473. _buf << Erubis::XmlHelper.escape_xml( str ); _buf << '
  474. '; _buf << ( str ).to_s; _buf << '
  475. ';
  476. _buf.to_s
  477. output: |
  478. &lt;&gt;&amp;&quot;
  479. <>&"
  480. ##
  481. - name: tailch1
  482. options:
  483. input: |
  484. <p>
  485. <% str = '<>&"' %>
  486. <%= str %>
  487. <%= str =%>
  488. <%= str -%>
  489. </p>
  490. src: |
  491. _buf = ''; _buf << '<p>
  492. '; str = '<>&"'
  493. _buf << ' '; _buf << ( str ).to_s; _buf << '
  494. '; _buf << ' '; _buf << ( str ).to_s; _buf << ' '; _buf << ( str ).to_s; _buf << '</p>
  495. ';
  496. _buf.to_s
  497. output: |
  498. <p>
  499. <>&"
  500. <>&" <>&"</p>
  501. ##
  502. - name: doublepercent1
  503. options:
  504. input: |
  505. <% x1 = 10 %>
  506. <%% x2 = 20 %>
  507. <%= x1 %>
  508. <%%= x2 %>
  509. src: |
  510. _buf = ''; x1 = 10
  511. _buf << '<% x2 = 20 %>
  512. '; _buf << ( x1 ).to_s; _buf << '
  513. '; _buf << '<%= x2 %>
  514. ';
  515. _buf.to_s
  516. output: |
  517. <% x2 = 20 %>
  518. 10
  519. <%= x2 %>
  520. ##
  521. - name: optimized1
  522. class: OptimizedEruby
  523. input: &optimized1_input|
  524. <table>
  525. <% for item in list %>
  526. <tr>
  527. <td><%= item %></td>
  528. <td><%== item %></td>
  529. </tr>
  530. <% end %>
  531. </table>
  532. <ul><% for item in list %><li><%= item %></li><% end %></ul>
  533. src: |
  534. _buf = '<table>
  535. '; for item in list
  536. _buf << ' <tr>
  537. <td>' << ( item ).to_s << '</td>
  538. <td>' << Erubis::XmlHelper.escape_xml( item ) << '</td>
  539. </tr>
  540. '; end
  541. _buf << '</table>
  542. <ul>'; for item in list ; _buf << '<li>' << ( item ).to_s << '</li>'; end ; _buf << '</ul>
  543. '
  544. _buf
  545. output: |
  546. <table>
  547. <tr>
  548. <td><aaa></td>
  549. <td>&lt;aaa&gt;</td>
  550. </tr>
  551. <tr>
  552. <td>b&b</td>
  553. <td>b&amp;b</td>
  554. </tr>
  555. <tr>
  556. <td>"ccc"</td>
  557. <td>&quot;ccc&quot;</td>
  558. </tr>
  559. </table>
  560. <ul><li><aaa></li><li>b&b</li><li>"ccc"</li></ul>
  561. ##
  562. - name: optimized2
  563. class: OptimizedXmlEruby
  564. input: *optimized1_input
  565. # <table>
  566. # <% for item in list %>
  567. # <tr>
  568. # <td><%= item %></td>
  569. # <td><%== item %></td>
  570. # </tr>
  571. # <% end %>
  572. # </table>
  573. # <ul><% for item in list %><li><%= item %></li><% end %></ul>
  574. src: |
  575. _buf = '<table>
  576. '; for item in list
  577. _buf << ' <tr>
  578. <td>' << Erubis::XmlHelper.escape_xml( item ) << '</td>
  579. <td>' << ( item ).to_s << '</td>
  580. </tr>
  581. '; end
  582. _buf << '</table>
  583. <ul>'; for item in list ; _buf << '<li>' << Erubis::XmlHelper.escape_xml( item ) << '</li>'; end ; _buf << '</ul>
  584. '
  585. _buf
  586. output: |
  587. <table>
  588. <tr>
  589. <td>&lt;aaa&gt;</td>
  590. <td><aaa></td>
  591. </tr>
  592. <tr>
  593. <td>b&amp;b</td>
  594. <td>b&b</td>
  595. </tr>
  596. <tr>
  597. <td>&quot;ccc&quot;</td>
  598. <td>"ccc"</td>
  599. </tr>
  600. </table>
  601. <ul><li>&lt;aaa&gt;</li><li>b&amp;b</li><li>&quot;ccc&quot;</li></ul>
  602. ##
  603. - name: optimized3
  604. desc: bug
  605. class: OptimizedEruby
  606. input: |
  607. user = <%= "Foo" %>
  608. <% for item in list %>
  609. <%= item %>
  610. <% end %>
  611. src: |
  612. _buf = 'user = '; _buf << ( "Foo" ).to_s << '
  613. '; for item in list
  614. _buf << ' ' << ( item ).to_s << '
  615. '; end
  616. _buf
  617. output: |
  618. user = Foo
  619. <aaa>
  620. b&b
  621. "ccc"
  622. ##
  623. - name: optimized4
  624. desc: single quotation and backslash
  625. class: OptimizedEruby
  626. input: &optimized4_input|
  627. a = "'"
  628. b = "\""
  629. c = '\''
  630. src: |
  631. _buf = 'a = "\'"
  632. b = "\\""
  633. c = \'\\\'\'
  634. ';
  635. _buf
  636. output: *optimized4_input
  637. ##
  638. - name: tiny1
  639. class: TinyEruby
  640. testopt: binding
  641. input: |
  642. <ul>
  643. <% for item in list %>
  644. <li><%= item %></li>
  645. <% end %>
  646. </ul>
  647. src: |
  648. _buf = ''; _buf << '<ul>
  649. '; for item in list ; _buf << '
  650. <li>'; _buf << ( item ).to_s; _buf << '</li>
  651. '; end ; _buf << '
  652. </ul>
  653. ';
  654. _buf.to_s
  655. output: |
  656. <ul>
  657. ^
  658. <li><aaa></li>
  659. ^
  660. <li>b&b</li>
  661. ^
  662. <li>"ccc"</li>
  663. ^
  664. </ul>
  665. ##
  666. - name: tiny2
  667. class: TinyEruby
  668. testopt: evaluate
  669. input: |
  670. <ul>
  671. <% for item in @list %>
  672. <li><%= item %></li>
  673. <% end %>
  674. </ul>
  675. src: |
  676. _buf = ''; _buf << '<ul>
  677. '; for item in @list ; _buf << '
  678. <li>'; _buf << ( item ).to_s; _buf << '</li>
  679. '; end ; _buf << '
  680. </ul>
  681. ';
  682. _buf.to_s
  683. output: |
  684. <ul>
  685. ^
  686. <li><aaa></li>
  687. ^
  688. <li>b&b</li>
  689. ^
  690. <li>"ccc"</li>
  691. ^
  692. </ul>
  693. ##
  694. - name: pi1
  695. class: PI::Eruby
  696. testopt: evaluate
  697. input: &input_pi1|
  698. <ul>
  699. <?rb for item in @list ?>
  700. <li>@{item}@ / @!{item}@</li>
  701. <li><%= item %> / <%== item %></li>
  702. <?rb end ?>
  703. </ul>
  704. src: &src_pi1|
  705. _buf = ''; _buf << '<ul>
  706. '; for item in @list
  707. _buf << ' <li>'; _buf << Erubis::XmlHelper.escape_xml(item); _buf << ' / '; _buf << (item).to_s; _buf << '</li>
  708. <li>'; _buf << ( item ).to_s; _buf << ' / '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</li>
  709. '; end
  710. _buf << '</ul>
  711. ';
  712. _buf.to_s
  713. output: &output_pi1|
  714. <ul>
  715. <li>&lt;aaa&gt; / <aaa></li>
  716. <li><aaa> / &lt;aaa&gt;</li>
  717. <li>b&amp;b / b&b</li>
  718. <li>b&b / b&amp;b</li>
  719. <li>&quot;ccc&quot; / "ccc"</li>
  720. <li>"ccc" / &quot;ccc&quot;</li>
  721. </ul>
  722. ##
  723. - name: pi2
  724. class: PI::Eruby
  725. options: { :escape: false }
  726. testopt: evaluate
  727. input: *input_pi1
  728. src: |
  729. _buf = ''; _buf << '<ul>
  730. '; for item in @list
  731. _buf << ' <li>'; _buf << (item).to_s; _buf << ' / '; _buf << Erubis::XmlHelper.escape_xml(item); _buf << '</li>
  732. <li>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << ' / '; _buf << ( item ).to_s; _buf << '</li>
  733. '; end
  734. _buf << '</ul>
  735. ';
  736. _buf.to_s
  737. output: |
  738. <ul>
  739. <li><aaa> / &lt;aaa&gt;</li>
  740. <li>&lt;aaa&gt; / <aaa></li>
  741. <li>b&b / b&amp;b</li>
  742. <li>b&amp;b / b&b</li>
  743. <li>"ccc" / &quot;ccc&quot;</li>
  744. <li>&quot;ccc&quot; / "ccc"</li>
  745. </ul>
  746. ##
  747. - name: pi3
  748. class: PI::Eruby
  749. options: { :pi: hoge, :embchar: '$' }
  750. testopt: evaluate
  751. input: |
  752. <ul>
  753. <?hoge for item in @list ?>
  754. <li>${item}$ / $!{item}$</li>
  755. <li><%= item %> / <%== item %></li>
  756. <?hoge end ?>
  757. </ul>
  758. src: *src_pi1
  759. output: *output_pi1
  760. - name: pi4
  761. class: PI::Eruby
  762. testopt: evaluate
  763. input: |
  764. <?rb-header
  765. def show(list)
  766. ?>
  767. <ul>
  768. <?rb for item in list ?>
  769. <?rb-value item ?>
  770. <?rb end ?>
  771. <?rb-comment
  772. # comment
  773. # comment
  774. ?>
  775. </ul>
  776. <?rb-footer
  777. end
  778. show(@list) ?>
  779. src: |4
  780. def show(list)
  781. _buf = ''; _buf << '<ul>
  782. '; for item in list
  783. _buf << ( item
  784. ).to_s; end
  785. _buf << '</ul>
  786. ';
  787. _buf.to_s
  788. end
  789. show(@list)
  790. output: |
  791. <ul>
  792. <aaa>b&b"ccc"</ul>
  793. - name: pitiny1
  794. class: PI::TinyEruby
  795. testopt: evaluate
  796. input: |
  797. <ul>
  798. <?rb for item in @list ?>
  799. <li>@{item}@ / @!{item}@</li>
  800. <?rb end ?>
  801. </ul>
  802. src: |
  803. _buf = ''; _buf << '<ul>
  804. '; for item in @list
  805. _buf << ' <li>'; _buf << Erubis::XmlHelper.escape_xml(item); _buf << ' / '; _buf << (item).to_s; _buf << '</li>
  806. '; end
  807. _buf << '</ul>
  808. ';
  809. _buf.to_s
  810. output: |
  811. <ul>
  812. <li>&lt;aaa&gt; / <aaa></li>
  813. <li>b&amp;b / b&b</li>
  814. <li>&quot;ccc&quot; / "ccc"</li>
  815. </ul>