3 use Test::More tests => 153;
5 sub format_test($$$;$);
6 sub noformat_test($$$;$);
8 my $gotmodule = require_ok('DevHelp::Formatter');
13 skip "couldn't load module", 146 unless $gotmodule;
14 format_test 'acronym[hello]', '<p><acronym>hello</acronym></p>', 'acronym';
15 format_test 'acronym[|hello]', '<p><acronym>hello</acronym></p>', 'acronym with empty title';
16 format_test 'acronym[foo|hello]', '<p><acronym title="foo">hello</acronym></p>', 'acronym with title';
17 format_test 'acronym[foo|bar|hello]', '<p><acronym class="bar" title="foo">hello</acronym></p>', 'acronym with class and title';
18 format_test 'bdo[ltr|hello]', '<p><bdo dir="ltr">hello</bdo></p>', 'bdo with dir';
19 format_test 'code[hello]', '<p><code>hello</code></p>', 'code';
20 format_test 'code[|hello]', '<p><code>hello</code></p>', 'code empty class';
21 format_test 'code[foo|hello]', '<p><code class="foo">hello</code></p>', 'code with class';
22 format_test 'code[var[x]="1"]', '<p><code><var>x</var>="1"</code></p>', 'code with var';
23 format_test 'cite[hello]', '<p><cite>hello</cite></p>', 'cite';
24 format_test 'cite[|hello]', '<p><cite>hello</cite></p>', 'cite with empty title';
25 format_test 'cite[foo|hello]', '<p><cite title="foo">hello</cite></p>', 'cite with title';
26 format_test 'cite[foo|bar|hello]', '<p><cite class="bar" title="foo">hello</cite></p>', 'cite with class and title';
27 format_test 'small[hello]', '<p><small>hello</small></p>', 'small';
28 format_test 'small[|hello]', '<p><small>hello</small></p>', 'small empty class';
29 format_test 'small[foo|hello]', '<p><small class="foo">hello</small></p>', 'small with class';
30 format_test 'large[hello]', '<p><large>hello</large></p>', 'large';
31 format_test 'large[|hello]', '<p><large>hello</large></p>', 'large empty class';
32 format_test 'large[foo|hello]', '<p><large class="foo">hello</large></p>', 'large with class';
33 format_test 'mark[hello]', '<p><mark>hello</mark></p>', 'mark';
34 format_test 'mark[|hello]', '<p><mark>hello</mark></p>', 'mark empty class';
35 format_test 'mark[foo|hello]', '<p><mark class="foo">hello</mark></p>', 'mark with class';
36 format_test 'link[foo|hello]', '<p><a href="foo">hello</a></p>', 'anchor';
37 format_test 'poplink[foo|hello]', '<p><a href="foo" target="_blank">hello</a></p>', 'anchor with popup';
38 format_test <<IN, <<OUT, 'blockquote', 'both';
45 <blockquote>hello</blockquote>
50 format_test <<IN, <<OUT, 'blockquote with empty class', 'both';
59 <blockquote>hello</blockquote>
64 format_test <<IN, <<OUT, 'blockquote with class', 'both';
74 <blockquote class="foo">hello</blockquote>
75 <blockquote class="foo">hello<br />
77 <blockquote class="foo">
82 format_test <<IN, <<OUT, 'article', 'both';
89 <article>hello</article>
94 format_test <<IN, <<OUT, 'article with empty class', 'both';
103 <article>hello</article>
108 format_test <<IN, <<OUT, 'article with id and class', 'both';
109 article[#id foo|hello]
115 <article id="id" class="foo">hello</article>
116 <article id="id" class="foo">
120 format_test <<IN, <<OUT, 'section', 'both';
129 format_test <<IN, <<OUT, 'section with empty class', 'both';
137 format_test <<IN, <<OUT, 'section with id and class', 'both';
138 section[#id foo|hello
142 <section id="id" class="foo">
146 format_test <<IN, <<OUT, 'header', 'both';
155 format_test <<IN, <<OUT, 'header with empty class', 'both';
164 format_test <<IN, <<OUT, 'header with id and class', 'both';
169 <header id="id" class="foo">
173 format_test <<IN, <<OUT, 'footer', 'both';
180 format_test <<IN, <<OUT, 'footer with empty class', 'both';
191 format_test <<IN, <<OUT, 'footer with id and class', 'both';
196 <footer id="id" class="foo">
200 format_test <<IN, <<OUT, 'aside', 'both';
205 format_test <<IN, <<OUT, 'aside with empty class', 'both';
210 format_test <<IN, <<OUT, 'aside with id and class', 'both';
213 <aside id="id" class="foo">hello</aside>
215 format_test <<IN, <<OUT, 'nav', 'both';
220 format_test <<IN, <<OUT, 'nav with empty class', 'both';
231 format_test <<IN, <<OUT, 'nav with id and class', 'both';
234 <nav id="id" class="foo">hello</nav>
236 format_test <<IN, <<OUT, 'figure', 'both';
239 <figure>hello</figure>
241 format_test <<IN, <<OUT, 'figure with empty class', 'both';
244 <figure>hello</figure>
246 format_test <<IN, <<OUT, 'figure with id and class', 'both';
247 figure[#id foo|hello]
249 <figure id="id" class="foo">hello</figure>
251 format_test <<IN, <<OUT, 'figcaption', 'both';
254 <figcaption>hello</figcaption>
256 format_test <<IN, <<OUT, 'figcaption with empty class', 'both';
259 <figcaption>hello</figcaption>
261 format_test <<IN, <<OUT, 'figcaption with id and class', 'both';
262 figcaption[#id foo|hello]
264 <figcaption id="id" class="foo">hello</figcaption>
266 format_test <<IN, <<OUT, 'strong over paras', 'both';
271 <p><strong class="foo">hello</strong></p>
272 <p><strong class="foo">foo</strong></p>
274 format_test <<IN, <<OUT, 'blockquote list h1 var', 'both';
294 format_test <<IN, <<OUT, 'address class h1 abbr over paras', 'both';
297 quux]abbr[my abbr|hello]
299 class[foo|b[bold|E=MCsup[2]]]
303 <address class="foo">
306 <p><abbr title="my abbr">hello</abbr></p>
307 <p class="foo"><b class="bold">E=MC<sup>2</sup></b></p>
311 format_test <<IN, <<OUT, 'div blockquote h1 class over paras', 'both';
312 div[quux|blockquote[foo|h1[bar]
314 class[foo|b[bold|E=MCsup[2
321 <blockquote class="foo">
323 <p><b>hello</b><br />
324 <span class="foo"><b class="bold">E=MC<sup>2</sup></b></span></p>
325 <p class="foo"><b class="bold"><sup><kbd class="xxx">super</kbd></sup></b></p>
330 format_test <<IN, <<OUT, 'bold', 'both';
335 format_test 'i[hello]', '<p><i>hello</i></p>', 'italic';
336 format_test 'b[i[hello]]', '<p><b><i>hello</i></b></p>', 'bold/italic';
337 format_test <<IN, <<OUT, 'bold over lines', 'both';
344 format_test <<IN, <<OUT, 'bold over paras', 'both';
352 format_test <<IN, <<OUT, 'combo over paras', 'both';
359 <p><i><b>hello</b></i></p>
360 <p><i><b>foo</b></i></p>
361 <p><i><b>bar</b></i></p>
363 format_test <<IN, <<OUT, 'link', 'both';
368 <a href="http://foo/">
373 format_test <<IN, <<OUT, "multi-p link followed by normal text", 'both';
388 format_test 'tt[hello]', '<p><tt>hello</tt></p>', 'tt';
389 format_test 'font[-1|text]', '<p><font size="-1">text</font></p>', 'fontsize';
390 format_test 'fontcolor[-1|black|text]', '<p><font size="-1" color="black">text</font></p>', 'fontsizecolor';
391 format_test 'anchor[somename]', '<p><a name="somename"></a></p>', 'anchor';
392 format_test <<IN, <<OUT, 'pre', 'both';
401 format_test <<IN, <<OUT, 'pre with bold', 'both';
406 <pre><b>hello there</b>
410 format_test <<IN, <<OUT, 'html', 'both';
411 html[<object foo="bar" />]
416 format_test 'embed[foo]', '', 'embed1';
417 format_test 'embed[foo,bar]', '', 'embed2';
418 format_test 'embed[foo,bar,quux]', '', 'embed3';
419 format_test 'h1[|text]', '<h1>text</h1>', 'h1';
420 format_test 'h1[someclass|text]', '<h1 class="someclass">text</h1>', 'h1class';
421 format_test 'h6[|te>xt]', '<h6>te>xt</h6>', 'h6';
422 format_test 'h1[|foo]h2[|bar]', "<h1>foo</h1>\n<h2>bar</h2>", 'h1h2';
423 format_test 'h1[|foo]texth2[|bar]',
424 "<h1>foo</h1>\n<p>text</p>\n<h2>bar</h2>", 'h1texth2';
425 format_test <<IN, <<OUT, 'align', 'both';
426 align[left|some text]
432 format_test 'hr[]', '<hr />', 'hr0';
433 format_test 'hr[80%]', '<hr width="80%" />', 'hr1';
434 format_test 'hr[80%|10]', '<hr width="80%" size="10" />', 'hr2';
435 format_test <<'IN', <<'OUT', 'hr with other text', 'both';
446 format_test <<IN, <<OUT, 'table1', 'both';
448 bgcolor="black"|quux|blarg
452 <table width="80%"><tr bgcolor="black"><td>quux</td><td>blarg</td></tr><tr><td>hello</td><td>there</td></tr></table>
454 format_test <<IN, <<OUT, 'table2', 'both';
455 table[80%|#808080|2|2|Arial
456 bgcolor="black"|quux|blarg
460 <table width="80%" bgcolor="#808080" cellpadding="2"><tr bgcolor="black"><td><font size="2" face="Arial">quux</font></td><td><font size="2" face="Arial">blarg</font></td></tr><tr><td><font size="2" face="Arial">hello</font></td><td><font size="2" face="Arial">there</font></td></tr></table>
462 format_test <<IN, <<OUT, 'table3', 'both';
465 <table width="80%"><tr><td>foo</td></tr></table>
467 format_test <<IN, <<OUT, 'ol1', 'both';
476 format_test <<IN, <<OUT, 'ol2', 'both';
488 format_test <<IN, <<OUT, 'ol1 alpha', 'both';
497 format_test <<IN, <<OUT, 'ol2 alpha', 'both';
509 format_test <<IN, <<OUT, 'ul1', 'both';
518 format_test <<IN, <<OUT, 'ul2', 'both';
531 format_test <<IN, <<OUT, 'ul indented', 'both';
541 format_test <<IN, <<OUT, "don't ul at end of line", 'both';
542 this shouldn't be a bullet ** some text
544 ** this should be a bullet
547 <p>this shouldn't be a bullet ** some text</p>
549 <li>this should be a bullet</li>
550 <li>so should this</li>
554 format_test <<IN, <<OUT, 'mixed', 'both';
570 format_test <<IN, <<OUT, 'spaces between', 'both';
588 format_test <<IN, <<OUT, "list[] no attrs", 'both';
600 format_test <<IN, <<OUT, "list[] id and class", 'both';
601 list[#test someclass|
606 <ol id="test" class="someclass">
612 format_test <<IN, <<OUT, "list[] %% id and class", 'both';
613 list[#test someclass|
618 <ol id="test" class="someclass" type="a">
624 format_test 'indent[text]', '<div class="indent">text</div>', 'indent';
625 format_test 'center[text]', '<center>text</center>', 'center';
626 format_test 'hrcolor[80|10|#FF0000]', <<OUT, 'hrcolor', 'out';
627 <table width="80" height="10" border="0" bgcolor="#FF0000" cellpadding="0" cellspacing="0"><tr><td><img src="/images/trans_pixel.gif" width="1" height="1" alt="" /></td></tr></table>
629 format_test 'image[foo]', '<p></p>', 'image';
631 format_test 'class[xxx|yyy]', '<p class="xxx">yyy</p>', 'class';
632 format_test "class[xxx|yy\n\nzz]", <<EOS, 'class2', 'out';
633 <p class="xxx">yy</p>
634 <p class="xxx">zz</p>
636 format_test "class[xxx|class[yyy|text]]",
637 '<p class="xxx"><span class="yyy">text</span></p>', "more class";
638 format_test "style[font-size: 18px|class[yyy|text]]",
639 '<p style="font-size: 18px"><span class="yyy">text</span></p>', "more class";
640 format_test 'div[someclass|h1[|foo]barh2[|quux]]', <<EOS, 'divblock', 'out';
641 <div class="someclass">
648 format_test "h1[#foo|test]", q!<h1 id="foo">test</h1>!, 'h1#id';
649 format_test "h1[#foo bar|test]", q!<h1 id="foo" class="bar">test</h1>!, 'h1#id class';
650 format_test "h1[#foo bar quux|test]", q!<h1 id="foo" class="bar quux">test</h1>!, 'h1#id class class';
651 format_test "h1[text-align: center;|test]", q!<h1 style="text-align: center;">test</h1>!, 'h1 styled';
652 format_test "h1[#foo text-align: center;|test]", q!<h1 id="foo" style="text-align: center;">test</h1>!, 'h1 styled, id';
654 format_test "div[text-align: center;|test\n\ntest2]", <<EOS, 'div styled', 'out';
655 <div style="text-align: center;">
661 format_test "div[#foo|test\n\ntest2]", <<EOS, 'div #id', 'out';
668 format_test "abc comment[foo] def", "<p>abc def</p>", "comment";
669 format_test <<IN, <<OUT, 'link over paras following an hr', 'both';
692 format_test <<IN, <<OUT, 'link over div block containing paras', 'both';
695 div[#id class background-color: red;|
705 <div id="id" style="background-color: red;" class="class">
712 format_test <<IN, <<OUT, 'poplink over div block containing paras', 'both';
714 poplink[http://www.example.com/|
716 div[#id class background-color: red;|
725 <a href="http://www.example.com/" target="_blank">
726 <div id="id" style="background-color: red;" class="class">
733 format_test <<IN, <<OUT, 'link over complex nested block structure', 'both';
735 link[http://www.example.com/|
737 section[#id class background-color: red;|
755 class[quux|yesterday]]
764 <a href="http://www.example.com/">
765 <section id="id" style="background-color: red;" class="class">
770 <article class="foo">
771 <p><b class="bar">hello</b></p>
772 <p><b class="bar"><i>world</i></b></p>
773 <p><b class="bar"><i>today</i></b></p>
775 <p><i>tomorrow</i></p>
776 <p class="quux">yesterday</p>
779 <footer id="id">footer</footer>
784 format_test <<IN, <<OUT, 'list inside a block', 'both';
798 format_test <<IN, <<OUT, 'link starting inline containing a block with paras', 'both';
799 inline text link[http://www.example.com/|div[#id class background-color: red;|hello
804 <a href="http://www.example.com/">
805 <div id="id" style="background-color: red;" class="class">
812 format_test <<IN, <<OUT, 'poplink starting inline containing a block with paras', 'both';
813 inline text poplink[http://www.example.com/|div[#id class background-color: red;|hello
818 <a href="http://www.example.com/" target="_blank">
819 <div id="id" style="background-color: red;" class="class">
826 format_test <<IN, <<OUT, 'link starting inline containing a block', 'both';
827 inline text link[http://www.example.com/|div[#id class background-color: red;|hello world]]
830 <a href="http://www.example.com/">
831 <div id="id" style="background-color: red;" class="class">hello world</div>
835 format_test <<IN, <<OUT, 'poplink starting inline containing a block', 'both';
836 inline text poplink[http://www.example.com/|div[#id class background-color: red;|hello world]]
839 <a href="http://www.example.com/" target="_blank">
840 <div id="id" style="background-color: red;" class="class">hello world</div>
844 # remove_format() tests
845 noformat_test 'image[foo]', '', 'image';
846 noformat_test 'code[something [bar]]', 'something [bar]', 'nested []';
848 noformat_test "abc comment[foo] def", "abc def", "comment";
850 noformat_test 'class[foo|image[bar]]', '', 'class with image content';
851 noformat_test 'abbr[image[bar]]', '', 'abbr[] with image content';
852 noformat_test 'abbr[foo|image[bar]]', '', 'abbr[x|x] with image content';
853 noformat_test 'abbr[|image[bar]]', '', 'abbr[|x] with image content';
854 noformat_test 'strong[image[bar]]', '', 'strong[x] with image content';
855 noformat_test 'strong[|image[bar]]', '', 'strong[|x] with image content';
856 noformat_test 'strong[foo|image[bar]]', '', 'strong[x|x] with image content';
858 noformat_test 'div[foo|image[bar]]', '', 'div[x|x] with image content';
859 noformat_test 'comment[image[bar]]', '', 'comment[image[xx]] with image content';
860 noformat_test 'h1[foo|image[bar]]', '', 'h1[x|x] with image content';
861 noformat_test 'h1[|image[bar]]', '', 'h1[|x] with image content';
862 noformat_test 'h1[image[bar]]', '', 'h1[x] with image content';
864 noformat_test 'poplink[xxx|image[bar]]', '', 'poplink[x|x] with image content';
865 noformat_test 'poplink[image[bar]]', '', 'poplink[x] with image content';
866 noformat_test 'link[xxx|image[bar]]', '', 'link[x|x] with image content';
867 noformat_test 'link[image[bar]]', '', 'link[x] with image content';
868 noformat_test 'align[xxx|image[bar]]', '', 'align[x|x] with image content';
869 noformat_test 'font[xxx|image[bar]]', '', 'font[x|x] with image content';
870 noformat_test 'hr[xxx|image[bar]]', '', 'hr[x|x] with image content';
871 noformat_test 'anchor[image[bar]]', '', 'anchor[x] with image content';
872 noformat_test '**image[bar]', '', '** list with image content';
873 noformat_test '%%image[bar]', '', '%% list with image content';
874 noformat_test '##image[bar]', '', '## list with image content';
875 noformat_test <<IN, <<OUT, "list[] no attr", "both";
887 sub format_test ($$$;$) {
888 my ($in, $out, $desc, $stripnl) = @_;
891 $in =~ s/\n$// if $stripnl eq 'in' || $stripnl eq 'both';
892 $out =~ s/\n$// if $stripnl eq 'out' || $stripnl eq 'both';
894 my $formatter = DevHelp::Formatter->new;
896 my $result = $formatter->format($in);
898 is($result, $out, $desc);
901 sub noformat_test($$$;$) {
902 my ($in, $out, $desc, $stripnl) = @_;
905 $in =~ s/\n$// if $stripnl eq 'in' || $stripnl eq 'both';
906 $out =~ s/\n$// if $stripnl eq 'out' || $stripnl eq 'both';
908 my $formatter = DevHelp::Formatter->new;
910 my $result = $formatter->remove_format($in);
912 is($result, $out, $desc);