3 * Test parsing of WikiText into HTML.
6 package com
.piclab
.wikitest
;
7 import com
.meterware
.httpunit
.*;
8 import java
.util
.regex
.*;
10 public class ParserTest
extends WikiTest
{
12 public String
testName() { return "Parsing"; }
14 protected int initTest() throws Exception
{
19 protected int runTest() throws Exception
{
22 if ( 0 != ( c
= part1() ) ) { return fail( c
); }
23 if ( 0 != ( c
= part2() ) ) { return fail( c
); }
24 if ( 0 != ( c
= part3() ) ) { return fail( c
); }
25 if ( 0 != ( c
= part4() ) ) { return fail( c
); }
26 if ( 0 != ( c
= part5() ) ) { return fail( c
); }
27 if ( 0 != ( c
= part6() ) ) { return fail( c
); }
28 if ( 0 != ( c
= part7() ) ) { return fail( c
); }
33 * Check replacement of variables like {{NUMBEROFARTICLES}}
35 private int part1() throws Exception
{
37 "Month: \\d+", "Month name: [A-Z][a-z]+", "Day: \\d+",
38 "Day name: [A-Z][a-z]+day", "Year: \\d\\d\\d\\d",
39 "Time: \\d\\d:\\d\\d", "Number of articles: \\d+"
42 WebResponse wr
= viewPage( "Bracketvars" );
43 String text
= getArticle( wr
);
46 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
53 * Check block-level elements like bullet lists and pre sections.
55 private int part2() throws Exception
{
57 "\\(1\\)[^(]*<ul>\\s*<li>[^<]*</li>\\s*<li>[^<]*</li>\\s*<li>[^<]*</li>\\s*</ul>",
58 "\\(2\\)[^(]*<ol>\\s*<li>[^<]*</li>\\s*<li>[^<]*</li>\\s*<li>[^<]*</li>\\s*</ol>",
59 "\\(3\\)[^(]*<ul>\\s*<li>[^<]*</li>\\s*</ul>[^<]*Par",
60 "\\(4\\)[^(]*<ol>\\s*<li>[^<]*</li>\\s*<li>[^<]*</li>\\s*</ol>[^<]*Par",
61 "\\(5\\)[^(]*<pre>\\s*Fixed[^<]*</pre>",
62 "\\(6\\)[^(]*Par[^<]*<ol>\\s*<li>[^<]*</li>\\s*</ol>",
63 "\\(7\\)[^(]*<pre>\\s*Fixed[^<]*</pre>\\s*<ul>\\s*<li>[^<]*</li>\\s*</ul>",
64 "\\(8\\)[^(]*<ul>\\s*<li>\\s*Level 1\\s*</li>\\s*<li>\\s*Level 1\\s*" +
65 "<ul>\\s*<li>\\s*Level 2\\s*</li>\\s*<li>\\s*Level 2\\s*<ul>\\s*" +
66 "<li>\\s*Level 3\\s*</li>\\s*</ul>\\s*</li>\\s*<li>\\s*Level 2\\s*" +
67 "</li>\\s*</ul>\\s*</li>\\s*<li>\\s*Level 1\\s*<ul>\\s*<li>\\s*" +
68 "Level 2\\s*<ul>\\s*<li>\\s*Level 3\\s*<ul>\\s*<li>\\s*Level 4\\s*" +
69 "</li>\\s*</ul>\\s*</li>\\s*</ul>\\s*</li>\\s*</ul>\\s*</li>\\s*" +
70 "<li>\\s*Level 1\\s*</li>\\s*</ul>",
71 "\\(9\\)[^(]*<ol>\\s*<li>\\s*Level 1\\s*</li>\\s*<li>\\s*Level 1\\s*" +
72 "<ol>\\s*<li>\\s*Level 2\\s*</li>\\s*<li>\\s*Level 2\\s*<ol>\\s*" +
73 "<li>\\s*Level 3\\s*</li>\\s*</ol>\\s*</li>\\s*<li>\\s*Level 2\\s*" +
74 "</li>\\s*</ol>\\s*</li>\\s*<li>\\s*Level 1\\s*<ol>\\s*<li>\\s*" +
75 "Level 2\\s*<ol>\\s*<li>\\s*Level 3\\s*<ol>\\s*<li>\\s*Level 4\\s*" +
76 "</li>\\s*</ol>\\s*</li>\\s*</ol>\\s*</li>\\s*</ol>\\s*</li>\\s*" +
77 "<li>\\s*Level 1\\s*</li>\\s*</ol>",
78 "\\(10\\)[^(]*<ul>\\s*<li>\\s*Level 1\\s*</li>\\s*<li>\\s*Level 1\\s*" +
79 "<ol>\\s*<li>\\s*Level 2\\s*</li>\\s*<li>\\s*Level 2\\s*<ul>\\s*" +
80 "<li>\\s*Level 3\\s*</li>\\s*</ul>\\s*</li>\\s*<li>\\s*Level 2\\s*" +
81 "</li>\\s*</ol>\\s*</li>\\s*<li>\\s*Level 1\\s*<ol>\\s*<li>\\s*" +
82 "Level 2\\s*<ul>\\s*<li>\\s*Level 3\\s*<ol>\\s*<li>\\s*Level 4\\s*" +
83 "</li>\\s*</ol>\\s*</li>\\s*</ul>\\s*</li>\\s*</ol>\\s*</li>\\s*" +
84 "<li>\\s*Level 1\\s*</li>\\s*</ul>",
85 "\\(11\\)[^(]*<dl>\\s*<dt>\\s*Word\\s*</dt>\\s*<dd>\\s*Definition\\s*</dd>\\s*</dl>",
86 "\\(12\\)[^(]*<dl>\\s*<dt>\\s*Word\\s*</dt>\\s*<dd>\\s*Definition\\s*</dd>\\s*</dl>",
87 "\\(13\\)[^(]*<dl>\\s*<dt>\\s*Word\\s*<ol>\\s*<li>\\s*First[^<]*</li>" +
88 "\\s*<li>\\s*Second[^<]*</li>\\s*</ol>\\s*</dt>\\s*</dl>",
89 "\\(14\\)[^(]*<dl>\\s*<dd>\\s*<dl>\\s*<dd>\\s*Double[^<]*</dd>\\s*</dl>" +
91 "\\(15\\)[^(]*<dl>\\s*<dd>\\s*<dl>\\s*<dd>\\s*<dl>\\s*<dd>\\s*Triple" +
92 "[^<]*</dd>\\s*</dl>\\s*</dd>\\s*</dl>\\s*</dd>\\s*</dl>\\s*Par"
95 WebResponse wr
= viewPage( "Blocklevels" );
96 String text
= getArticle( wr
);
99 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
106 * Check translation of quotes to bold/italic
108 private int part3() throws Exception
{
110 "\\(1\\) normal <strong>bold</strong> normal",
111 "\\(2\\) normal <em>italic</em> normal",
112 /*"\\(3\\) normal <strong><em>bold italic</em></strong> normal",*/
113 "\\(4\\) normal <strong>bold <em>bold italic</em> bold</strong> normal",
114 "\\(5\\) normal <em>italic <strong>bold italic</strong> italic</em> normal",
115 "\\(6\\) normal <strong><em>bold italic</em> bold</strong> normal",
116 /*"\\(7\\) normal <em><strong>bold italic</strong> italic</em> normal",*/
117 "\\(8\\) normal <em>italic <strong>bold italic</strong></em> normal",
118 /*"\\(9\\) normal <strong>bold <em>bold italic</em></strong> normal",*/
119 "\\(10\\) normal <strong>bold's</strong> normal",
120 "\\(11\\) normal <em>italic's</em> normal",
121 "\\(12\\) normal <em>italic's <strong>bold's italic</strong> italic's</em> normal",
122 "\\(13\\) normal <strong><em>bold's italic</em> bold's</strong> normal",
123 /*"\\(14\\) normal <em>italic</em>' normal", */
124 /*"\\(15\\) normal '<strong>bold</strong> normal", */
125 "\\(16\\) normal <em>italic</em> normal <em>italic</em> normal",
126 "\\(17\\) normal <em>italic</em> normal <strong>bold</strong> normal",
127 "\\(18\\) normal <strong>bold</strong> normal <strong>bold</strong> normal",
128 "\\(19\\) normal <strong>bold</strong> normal <em>italic</em> normal"
131 WebResponse wr
= viewPage( "Quotes" );
132 String text
= getArticle( wr
);
135 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
142 * Check rendering of external links
144 private int part4() throws Exception
{
146 "\\(1\\) <a\\s[^>]*href\\s*=\\s*.http://a/b/c",
147 "\\(1\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>ABC</a",
148 "\\(2\\) <a\\s[^>]*href\\s*=\\s*.https://d/e/f",
149 "\\(2\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>DEF</a",
150 "\\(3\\) <a\\s[^>]*href\\s*=\\s*.ftp://g/h/i",
151 "\\(3\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>GHI</a",
152 "\\(4\\) <a\\s[^>]*href\\s*=\\s*.gopher://j/k/l",
153 "\\(4\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>JKL</a",
154 "\\(5\\) <a\\s[^>]*href\\s*=\\s*.news:a\\.b\\.c",
155 "\\(5\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>A\\.B\\.C</a",
156 "\\(6\\) <a\\s[^>]*href\\s*=\\s*.mailto:a@b\\.c",
157 "\\(6\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>A@B\\.C</a",
158 "\\(7\\) <a\\s[^>]*href\\s*=\\s*.http://m/n/o",
159 "\\(7\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>\\[1\\]</a",
160 "\\(8\\) <a\\s[^>]*href\\s*=\\s*.http://p/q/r",
161 "\\(8\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>\\[2\\]</a",
162 "\\(9\\) <a\\s[^>]*href\\s*=\\s*.http://a/b/c\\.png",
163 "\\(9\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>\\[3\\]</a",
164 "\\(10\\) <a\\s[^>]*href\\s*=\\s*.http://d/e/f\\.jpg",
165 "\\(10\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>\\[4\\]</a",
166 "\\(11\\) <a\\s[^>]*href\\s*=\\s*.http://a/b/c",
167 "\\(11\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>http://a/b/c</a",
168 "\\(12\\) <img\\s[^>]*src\\s*=\\s*.http://a/b/c\\.png",
169 "\\(12\\) <img\\s[^>]*alt\\s*=\\s*.c\\.png",
170 "\\(13\\) <img\\s[^>]*src\\s*=\\s*.http://d/e/f\\.jpg",
171 "\\(13\\) <img\\s[^>]*alt\\s*=\\s*.f\\.jpg",
172 "\\(14\\) <a\\s[^>]*href\\s*=\\s*.http://a/b/c",
173 "\\(14\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>http://a/b/c</a[^>]*>\\. More",
174 "\\(15\\) <a\\s[^>]*href\\s*=\\s*.http://d/e/f",
175 "\\(15\\) <a\\s[^>]*class\\s*=\\s*.external.[^>]*>http://d/e/f</a[^>]*>, More"
178 WebResponse wr
= viewPage( "ExternalLinks" );
179 String text
= getArticle( wr
);
182 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
189 * Check rendering of internal links
191 private int part5() throws Exception
{
193 "\\(1\\) <a\\s[^>]*class\\s*=\\s*.internal",
194 "\\(1\\) <a\\s[^>]*href\\s*=[^>]*Mathematics[^>]*>Mathematics</a",
195 "\\(2\\) <a\\s[^>]*class\\s*=\\s*.new",
196 "\\(2\\) <a\\s[^>]*href\\s*=[^>]*Non-existing_article[^>]*action=edit",
197 "\\(3\\) <a\\s[^>]*class\\s*=\\s*.internal",
198 "\\(3\\) <a\\s[^>]*href\\s*=[^>]*Cooking[^>]*>Burning</a",
199 "\\(4\\) <a\\s[^>]*class\\s*=\\s*.internal",
200 "\\(4\\) <a\\s[^>]*href\\s*=[^>]*User:Fred[^>]*>Fred</a",
201 "\\(5\\) <a\\s[^>]*class\\s*=\\s*.internal",
202 "\\(5\\) <a\\s[^>]*href\\s*=[^>]*Talk:Language[^>]*>Talk:Language</a",
203 "\\(6\\) <a\\s[^>]*class\\s*=\\s*.image",
204 "\\(6\\) <a\\s[^>]*href\\s*=[^>]*Image:Foo.png",
205 "\\(6\\) <a\\s[^>]*>\\s*<img\\s[^>]*src\\s*=[^>]*Foo.png",
206 "\\(6\\) <a\\s[^>]*>\\s*<img\\s[^>]*alt\\s*=[^>]*Foo.png[^>]*>\\s*</a",
207 "\\(7\\) <a\\s[^>]*class\\s*=\\s*.media",
208 "\\(7\\) <a\\s[^>]*href\\s*=[^>]*Bar.ogg[^>]*>Bar.ogg</a",
209 /* International stuff is changing */
210 "\\(9\\) <a\\s[^>]*class\\s*=\\s*.image",
211 "\\(9\\) <a\\s[^>]*href\\s*=[^>]*Image:Bar.jpg",
212 "\\(9\\) <a\\s[^>]*>\\s*<img\\s[^>]*src\\s*=[^>]*Bar.jpg",
213 "\\(9\\) <a\\s[^>]*>\\s*<img\\s[^>]*alt\\s*=[^>]*Alt text[^>]*>\\s*</a",
214 "\\(10\\) <a\\s[^>]*class\\s*=\\s*.internal",
215 "\\(10\\) <a\\s[^>]*href\\s*=[^>]*Game[^s][^>]*>Games</a"
218 WebResponse wr
= viewPage( "InternalLinks" );
219 String text
= getArticle( wr
);
223 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
230 * Check headings and horizontal rules
232 private int part6() throws Exception
{
234 "<h2>\\s*AAA 2\\s*</h2>", "<h3>\\s*BBB 3\\s*</h3>",
235 "<h2>\\s*CCC 2\\s*</h2>", "<h3>\\s*DDD 3\\s*</h3>",
236 "<h4>\\s*FFF 4\\s*</h4>", "<h3>\\s*GGG 3\\s*</h3>\\s*Extra",
237 /*"<h4>\\s*HHH 4\\s*</h4>\\s*Par", "<h4>\\s*III 4\\s*</h4>\\s*<p>\\s*Par",*/
238 "\\(1\\)[^(]*---\\s", "\\(2\\)[^(]*[^-]<hr>[^-]", "\\(3\\)[^(]*[^-]<hr>[^-]",
239 "\\(4\\)[^(]*<hr>\\s*XXX", "<h5>\\s*JJJ 5\\s*</h5>",
240 "<h6>\\s*KKK 6\\s*</h6>", "<h3>\\s*LLL 3\\s*</h3>",
241 "<h2>\\s*MMM 2\\s*</h2>"
244 WebResponse wr
= viewPage( "Headings" );
245 String text
= getArticle( wr
);
248 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
255 * Check magic text replacements like ISBNs, RFCs
257 private int part7() throws Exception
{
259 "\\(1\\)\\s*<a\\s[^>]*Special:Booksources[^>]*1234567890[^>]*>\\s*ISBN 1234567890\\s*</a",
260 /*RFC not implemented*/
263 WebResponse wr
= viewPage( "Magics" );
264 String text
= getArticle( wr
);
267 if ( 0 != ( ret
= checkGoodPatterns( text
, pats
) ) ) {
274 public static void main( String
[] params
) {
275 (new ParserTest()).runSingle( params
);