Initial revision
[lhc/web/wiklou.git] / testsuite / src / com / piclab / wikitest / ParserTest.java
1
2 /*
3 * Test parsing of WikiText into HTML.
4 */
5
6 package com.piclab.wikitest;
7 import com.meterware.httpunit.*;
8 import java.util.regex.*;
9
10 public class ParserTest extends WikiTest {
11
12 public String testName() { return "Parsing"; }
13
14 protected int initTest() throws Exception {
15 logout();
16 return 0;
17 }
18
19 protected int runTest() throws Exception {
20 int c = 0;
21
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 ); }
29 return 0;
30 }
31
32 /*
33 * Check replacement of variables like {{NUMBEROFARTICLES}}
34 */
35 private int part1() throws Exception {
36 String[] pats = {
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+"
40 };
41
42 WebResponse wr = viewPage( "Bracketvars" );
43 String text = getArticle( wr );
44
45 int ret;
46 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
47 return 100 + ret;
48 }
49 return 0;
50 }
51
52 /*
53 * Check block-level elements like bullet lists and pre sections.
54 */
55 private int part2() throws Exception {
56 String[] pats = {
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>" +
90 "\\s*</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"
93 };
94
95 WebResponse wr = viewPage( "Blocklevels" );
96 String text = getArticle( wr );
97
98 int ret;
99 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
100 return 200 + ret;
101 }
102 return 0;
103 }
104
105 /*
106 * Check translation of quotes to bold/italic
107 */
108 private int part3() throws Exception {
109 String[] pats = {
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"
129 };
130
131 WebResponse wr = viewPage( "Quotes" );
132 String text = getArticle( wr );
133
134 int ret;
135 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
136 return 300 + ret;
137 }
138 return 0;
139 }
140
141 /*
142 * Check rendering of external links
143 */
144 private int part4() throws Exception {
145 String[] pats = {
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"
176 };
177
178 WebResponse wr = viewPage( "ExternalLinks" );
179 String text = getArticle( wr );
180
181 int ret;
182 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
183 return 400 + ret;
184 }
185 return 0;
186 }
187
188 /*
189 * Check rendering of internal links
190 */
191 private int part5() throws Exception {
192 String[] pats = {
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"
216 };
217
218 WebResponse wr = viewPage( "InternalLinks" );
219 String text = getArticle( wr );
220
221
222 int ret;
223 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
224 return 500 + ret;
225 }
226 return 0;
227 }
228
229 /*
230 * Check headings and horizontal rules
231 */
232 private int part6() throws Exception {
233 String[] pats = {
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>"
242 };
243
244 WebResponse wr = viewPage( "Headings" );
245 String text = getArticle( wr );
246
247 int ret;
248 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
249 return 600 + ret;
250 }
251 return 0;
252 }
253
254 /*
255 * Check magic text replacements like ISBNs, RFCs
256 */
257 private int part7() throws Exception {
258 String[] pats = {
259 "\\(1\\)\\s*<a\\s[^>]*Special:Booksources[^>]*1234567890[^>]*>\\s*ISBN 1234567890\\s*</a",
260 /*RFC not implemented*/
261 };
262
263 WebResponse wr = viewPage( "Magics" );
264 String text = getArticle( wr );
265
266 int ret;
267 if ( 0 != ( ret = checkGoodPatterns( text, pats ) ) ) {
268 return 700 + ret;
269 }
270 return 0;
271 }
272
273
274 public static void main( String[] params ) {
275 (new ParserTest()).runSingle( params );
276 }
277
278 }