test-enhancers.rb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. ##
  2. ## $Release: 2.7.0 $
  3. ## copyright(c) 2006-2011 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. class EnhancersTest < Test::Unit::TestCase
  11. testdata_list = load_yaml_datafile(__FILE__)
  12. define_testmethods(testdata_list)
  13. def _test()
  14. @src.gsub!(/\^/, ' ')
  15. @output.gsub!(/\^/, ' ') if @output.is_a?(String)
  16. if @class
  17. k = Erubis
  18. @class.split('::').each do |name| k = k.const_get(name) end
  19. @klass = k
  20. else
  21. @klass = Erubis::Eruby
  22. end
  23. @options ||= {}
  24. @chomp.each do |target|
  25. case target
  26. when 'src' ; @src.chomp!
  27. when 'input' ; @input.chomp!
  28. when 'expected' ; @expected.chomp!
  29. else
  30. raise "#{@name}: invalid chomp value: #{@chomp.inspect}"
  31. end
  32. end if @chomp
  33. if @testopt == 'load_file'
  34. filename = "tmp.#{@name}.eruby"
  35. begin
  36. File.open(filename, 'w') { |f| f.write(@input) }
  37. eruby = @klass.load_file(filename, @options)
  38. ensure
  39. cachename = filename + '.cache'
  40. File.unlink(cachename) if test(?f, cachename)
  41. File.unlink(filename) if test(?f, filename)
  42. end
  43. else
  44. #if @klass == Erubis::TinyEruby
  45. # eruby = @klass.new(@input)
  46. #else
  47. eruby = @klass.new(@input, @options)
  48. #end
  49. end
  50. assert_text_equal(@src, eruby.src)
  51. return if @testopt == 'skip_output'
  52. list = ['<aaa>', 'b&b', '"ccc"']
  53. context = @testopt == 'context' ? Erubis::Context.new : {}
  54. context[:list] = list
  55. case @testopt
  56. when /\Aeval\(/
  57. eval eruby.src
  58. actual = eval @testopt
  59. assert_text_equal(@output, actual)
  60. when 'stdout', 'print'
  61. begin
  62. orig = $stdout
  63. $stdout = stringio = StringIO.new
  64. #actual = eruby.evaluate(context)
  65. actual = eruby.result(context)
  66. ensure
  67. $stdout = orig
  68. end
  69. if @testopt == 'stdout'
  70. assert_equal("", actual)
  71. else
  72. assert_nil(actual)
  73. end
  74. assert_text_equal(@output, stringio.string)
  75. when 'evaluate', 'context'
  76. actual = eruby.evaluate(context)
  77. assert_text_equal(@output, actual)
  78. when 'binding'
  79. actual = eruby.result(binding())
  80. assert_text_equal(@output, actual)
  81. else
  82. actual = eruby.result(context)
  83. assert_text_equal(@output, actual)
  84. end
  85. end
  86. self.post_definition()
  87. end
  88. __END__
  89. ##
  90. - name: basic1
  91. class: Eruby
  92. input: &basic1_input|
  93. <ul>
  94. <% for item in list %>
  95. <li><%= item %></li>
  96. <% end %>
  97. </ul>
  98. src: &basic1_src|
  99. _buf = ''; _buf << '<ul>
  100. '; for item in list
  101. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  102. '; end
  103. _buf << '</ul>
  104. ';
  105. _buf.to_s
  106. output: &basic1_output|
  107. <ul>
  108. <li><aaa></li>
  109. <li>b&b</li>
  110. <li>"ccc"</li>
  111. </ul>
  112. - name: xml1
  113. class: XmlEruby
  114. input: |
  115. <pre>
  116. <% for item in list %>
  117. <%= item %>
  118. <%== item %>
  119. <% end %>
  120. </pre>
  121. src: |
  122. _buf = ''; _buf << '<pre>
  123. '; for item in list
  124. _buf << ' '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '
  125. '; _buf << ' '; _buf << ( item ).to_s; _buf << '
  126. '; end
  127. _buf << '</pre>
  128. ';
  129. _buf.to_s
  130. output: |
  131. <pre>
  132. &lt;aaa&gt;
  133. <aaa>
  134. b&amp;b
  135. b&b
  136. &quot;ccc&quot;
  137. "ccc"
  138. </pre>
  139. ##
  140. - name: xml2
  141. class: XmlEruby
  142. testopt: skip_output
  143. input: |
  144. <% for item in list %>
  145. <%= item["var#{n}"] %>
  146. <%== item["var#{n}"] %>
  147. <%=== item["var#{n}"] %>
  148. <%==== item["var#{n}"] %>
  149. <% end %>
  150. src: |
  151. _buf = ''; for item in list
  152. _buf << ' '; _buf << Erubis::XmlHelper.escape_xml( item["var#{n}"] ); _buf << '
  153. '; _buf << ' '; _buf << ( item["var#{n}"] ).to_s; _buf << '
  154. '; _buf << ' '; $stderr.puts("*** debug: item[\"var\#{n}\"]=#{(item["var#{n}"]).inspect}"); _buf << '
  155. '; _buf << ' '; _buf << '
  156. '; end
  157. _buf.to_s
  158. output: |
  159. ##
  160. - name: printout1
  161. class: PrintOutEruby
  162. testopt: print
  163. input: *basic1_input
  164. src: |4
  165. print '<ul>
  166. '; for item in list
  167. print ' <li>'; print(( item ).to_s); print '</li>
  168. '; end
  169. print '</ul>
  170. ';
  171. output: *basic1_output
  172. ##
  173. - name: printenabled1
  174. class: PrintEnabledEruby
  175. input: &printenabled1_input|
  176. <ul>
  177. <% for item in list %>
  178. <li><% print item %></li>
  179. <% end %>
  180. </ul>
  181. src: |
  182. @_buf = _buf = ''; _buf << '<ul>
  183. '; for item in list
  184. _buf << ' <li>'; print item ; _buf << '</li>
  185. '; end
  186. _buf << '</ul>
  187. ';
  188. _buf.to_s
  189. output: *basic1_output
  190. # <ul>
  191. # <li><aaa></li>
  192. # <li>b&b</li>
  193. # <li>"ccc"</li>
  194. # </ul>
  195. ##
  196. - name: stdout1
  197. class: StdoutEruby
  198. testopt: stdout
  199. input: *basic1_input
  200. # <ul>
  201. # <% for item in list %>
  202. # <li><%= item %></li>
  203. # <% end %>
  204. # </ul>
  205. src: |
  206. _buf = $stdout; _buf << '<ul>
  207. '; for item in list
  208. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  209. '; end
  210. _buf << '</ul>
  211. ';
  212. ''
  213. output: *basic1_output
  214. # <ul>
  215. # <li><aaa></li>
  216. # <li>b&b</li>
  217. # <li>"ccc"</li>
  218. # </ul>
  219. ##
  220. - name: array1
  221. class: ArrayEruby
  222. input: |
  223. <ul>
  224. <% for item in list %>
  225. <li><%= item %></li>
  226. <% end %>
  227. </ul>
  228. src: |
  229. _buf = []; _buf << '<ul>
  230. '; for item in list
  231. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  232. '; end
  233. _buf << '</ul>
  234. ';
  235. _buf
  236. output:
  237. - "<ul>\n"
  238. - " <li>"
  239. - "<aaa>"
  240. - "</li>\n"
  241. - " <li>"
  242. - "b&b"
  243. - "</li>\n"
  244. - " <li>"
  245. - "\"ccc\""
  246. - "</li>\n"
  247. - "</ul>\n"
  248. ##
  249. - name: arraybuffer1
  250. class: ArrayBufferEruby
  251. input: *basic1_input
  252. src: |
  253. _buf = []; _buf << '<ul>
  254. '; for item in list
  255. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  256. '; end
  257. _buf << '</ul>
  258. ';
  259. _buf.join
  260. output: *basic1_output
  261. - name: stringbuffer1
  262. class: StringBufferEruby
  263. input: *basic1_input
  264. # <ul>
  265. # <% for item in list %>
  266. # <li><%= item %></li>
  267. # <% end %>
  268. # </ul>
  269. src: |
  270. _buf = ''; _buf << '<ul>
  271. '; for item in list
  272. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  273. '; end
  274. _buf << '</ul>
  275. ';
  276. _buf.to_s
  277. output: *basic1_output
  278. # <ul>
  279. # <li><aaa></li>
  280. # <li>b&b</li>
  281. # <li>"ccc"</li>
  282. # </ul>
  283. ##
  284. - name: erbout1
  285. class: ErboutEruby
  286. input: *basic1_input
  287. src: |
  288. _erbout = _buf = ''; _buf << '<ul>
  289. '; for item in list
  290. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  291. '; end
  292. _buf << '</ul>
  293. ';
  294. _buf.to_s
  295. output: *basic1_output
  296. ##
  297. - name: stringio1
  298. class: StringIOEruby
  299. input: *basic1_input
  300. src: |
  301. _buf = StringIO.new; _buf << '<ul>
  302. '; for item in list
  303. _buf << ' <li>'; _buf << ( item ).to_s; _buf << '</li>
  304. '; end
  305. _buf << '</ul>
  306. ';
  307. _buf.string
  308. output: *basic1_output
  309. ##
  310. - name: notext1
  311. class: NoTextEruby
  312. input: *basic1_input
  313. src: |
  314. _buf = '';
  315. for item in list
  316. _buf << ( item ).to_s;
  317. end
  318. _buf.to_s
  319. output: '<aaa>b&b"ccc"'
  320. ##
  321. - name: nocode1
  322. class: NoCodeEruby
  323. testopt: skip_output
  324. input: *basic1_input
  325. src: |
  326. <ul>
  327. <li></li>
  328. </ul>
  329. output:
  330. ##
  331. - name: simplified
  332. class: SimplifiedEruby
  333. input: |
  334. <ul>
  335. <% for item in list %>
  336. <li>
  337. <%= item %>
  338. </li>
  339. <% end %>
  340. </ul>
  341. src: |
  342. _buf = ''; _buf << '<ul>
  343. '; for item in list ; _buf << '
  344. <li>
  345. '; _buf << ( item ).to_s; _buf << '
  346. </li>
  347. '; end ; _buf << '
  348. </ul>
  349. ';
  350. _buf.to_s
  351. output: |
  352. <ul>
  353. ^
  354. <li>
  355. <aaa>
  356. </li>
  357. ^
  358. <li>
  359. b&b
  360. </li>
  361. ^
  362. <li>
  363. "ccc"
  364. </li>
  365. ^
  366. </ul>
  367. ##
  368. - name: bipattern1
  369. class: BiPatternEruby
  370. #options: { :bipattern : '\[= =\]' }
  371. input: |
  372. <% for item in list %>
  373. <%= item %> % <%== item %>
  374. [= item =] = [== item =]
  375. <% end %>
  376. src: |
  377. _buf = ''; for item in list
  378. _buf << ' '; _buf << ( item ).to_s; _buf << ' % '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '
  379. '; _buf << ' '; _buf << ( item ).to_s; _buf << ' = '; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '
  380. '; end
  381. _buf.to_s
  382. output: |4
  383. <aaa> % &lt;aaa&gt;
  384. <aaa> = &lt;aaa&gt;
  385. b&b % b&amp;b
  386. b&b = b&amp;b
  387. "ccc" % &quot;ccc&quot;
  388. "ccc" = &quot;ccc&quot;
  389. ##
  390. - name: bipattern2
  391. class: BiPatternEruby
  392. options: { :bipattern: '\$\{ \}' }
  393. input: |
  394. <% for item in list %>
  395. <%=item%> % <%==item%>
  396. ${item} = ${=item}
  397. <% end %>
  398. src: |
  399. _buf = ''; for item in list
  400. _buf << ' '; _buf << (item).to_s; _buf << ' % '; _buf << Erubis::XmlHelper.escape_xml(item); _buf << '
  401. '; _buf << ' '; _buf << (item).to_s; _buf << ' = '; _buf << Erubis::XmlHelper.escape_xml(item); _buf << '
  402. '; end
  403. _buf.to_s
  404. output: |4
  405. <aaa> % &lt;aaa&gt;
  406. <aaa> = &lt;aaa&gt;
  407. b&b % b&amp;b
  408. b&b = b&amp;b
  409. "ccc" % &quot;ccc&quot;
  410. "ccc" = &quot;ccc&quot;
  411. ##
  412. - name: percentline1
  413. class: PercentLineEruby
  414. options:
  415. input: |
  416. <table>
  417. % for item in list
  418. <tr>
  419. <td><%= item %></td>
  420. <td><%== item %></td>
  421. </tr>
  422. % end
  423. </table>
  424. <pre>
  425. %% double percent
  426. % spaced percent
  427. </pre>
  428. src: |
  429. _buf = ''; _buf << '<table>
  430. '; for item in list
  431. _buf << ' <tr>
  432. <td>'; _buf << ( item ).to_s; _buf << '</td>
  433. <td>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</td>
  434. </tr>
  435. '; end
  436. _buf << '</table>
  437. <pre>
  438. % double percent
  439. % spaced percent
  440. </pre>
  441. ';
  442. _buf.to_s
  443. output: |
  444. <table>
  445. <tr>
  446. <td><aaa></td>
  447. <td>&lt;aaa&gt;</td>
  448. </tr>
  449. <tr>
  450. <td>b&b</td>
  451. <td>b&amp;b</td>
  452. </tr>
  453. <tr>
  454. <td>"ccc"</td>
  455. <td>&quot;ccc&quot;</td>
  456. </tr>
  457. </table>
  458. <pre>
  459. % double percent
  460. % spaced percent
  461. </pre>
  462. ##
  463. - name: prefixedline1
  464. class: PrefixedLineEruby
  465. options: { :prefixchar: '!' }
  466. input: |
  467. <table>
  468. ! for item in list
  469. <tr>
  470. <td><%= item %></td>
  471. <td><%== item %></td>
  472. </tr>
  473. ! end
  474. </table>
  475. <pre>
  476. !! doubled characters
  477. </pre>
  478. src: |
  479. _buf = ''; _buf << '<table>
  480. '; for item in list
  481. _buf << ' <tr>
  482. <td>'; _buf << ( item ).to_s; _buf << '</td>
  483. <td>'; _buf << Erubis::XmlHelper.escape_xml( item ); _buf << '</td>
  484. </tr>
  485. '; end
  486. _buf << '</table>
  487. <pre>
  488. ! doubled characters
  489. </pre>
  490. ';
  491. _buf.to_s
  492. output: |
  493. <table>
  494. <tr>
  495. <td><aaa></td>
  496. <td>&lt;aaa&gt;</td>
  497. </tr>
  498. <tr>
  499. <td>b&b</td>
  500. <td>b&amp;b</td>
  501. </tr>
  502. <tr>
  503. <td>"ccc"</td>
  504. <td>&quot;ccc&quot;</td>
  505. </tr>
  506. </table>
  507. <pre>
  508. ! doubled characters
  509. </pre>
  510. ##
  511. - name: headerfooter1
  512. class: HeaderFooterEruby
  513. options:
  514. testopt: eval('ordered_list(list)')
  515. input: |
  516. <!--#header:
  517. def ordered_list(list)
  518. #-->
  519. <ol>
  520. <% for item in list %>
  521. <li><%==item%></li>
  522. <% end %>
  523. </ol>
  524. <!--#footer: end #-->
  525. src: |4
  526. def ordered_list(list)
  527. _buf = ''; _buf << '<ol>
  528. '; for item in list
  529. _buf << ' <li>'; _buf << Erubis::XmlHelper.escape_xml(item); _buf << '</li>
  530. '; end
  531. _buf << '</ol>
  532. ';
  533. _buf.to_s
  534. end
  535. output: |
  536. <ol>
  537. <li>&lt;aaa&gt;</li>
  538. <li>b&amp;b</li>
  539. <li>&quot;ccc&quot;</li>
  540. </ol>
  541. ##
  542. - name: deleteindent1
  543. class: DeleteIndentEruby
  544. options:
  545. testopt:
  546. input: *basic1_input
  547. src: |
  548. _buf = ''; _buf << '<ul>
  549. '; for item in list
  550. _buf << '<li>'; _buf << ( item ).to_s; _buf << '</li>
  551. '; end
  552. _buf << '</ul>
  553. ';
  554. _buf.to_s
  555. output: |
  556. <ul>
  557. <li><aaa></li>
  558. <li>b&b</li>
  559. <li>"ccc"</li>
  560. </ul>
  561. ##
  562. - name: interpolation1
  563. class: InterpolationEruby
  564. options:
  565. testopt:
  566. input: *basic1_input
  567. src: |
  568. _buf = ''; _buf << %Q`<ul>\n`
  569. for item in list
  570. _buf << %Q` <li>#{ item }</li>\n`
  571. end
  572. _buf << %Q`</ul>\n`
  573. _buf.to_s
  574. output: *basic1_output
  575. - name: interpolation2
  576. desc: sharp, back-quote, and backslash should be escaped, but other quotes should not be escaped (reported by andrewj)
  577. class: InterpolationEruby
  578. options:
  579. testopt:
  580. input: |
  581. <p>`back-quote`</p>
  582. <p><%= `echo back-tick operator` %></p>
  583. <p>#{sharp}</p>
  584. <p>'single quote'</p>
  585. <p>"double quote"</p>
  586. <p>backslash\n\t</p>
  587. src: |
  588. _buf = ''; _buf << %Q`<p>\`back-quote\`</p>
  589. <p>#{ `echo back-tick operator` }</p>
  590. <p>\#{sharp}</p>
  591. <p>'single quote'</p>
  592. <p>"double quote"</p>
  593. <p>backslash\\n\\t</p>\n`
  594. _buf.to_s
  595. output: |
  596. <p>`back-quote`</p>
  597. <p>back-tick operator
  598. </p>
  599. <p>#{sharp}</p>
  600. <p>'single quote'</p>
  601. <p>"double quote"</p>
  602. <p>backslash\n\t</p>