]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/WikiTokenizerTest.java
b4999d854601a9c822c0051afb389637d8975273
[DictionaryPC.git] / src / com / hughes / android / dictionary / parser / WikiTokenizerTest.java
1 // Copyright 2011 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package com.hughes.android.dictionary.parser;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
20
21 import junit.framework.TestCase;
22
23 public class WikiTokenizerTest extends TestCase {
24     
25   public void testWikiLink() {
26     String wikiText;
27     
28     wikiText = "[[abc]]";
29     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
30     assertTrue(new WikiTokenizer(wikiText).nextToken().isWikiLink());
31     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
32     assertEquals(null, new WikiTokenizer(wikiText).nextToken().wikiLinkDest());
33     
34     wikiText = "[[abc|def]]";
35     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
36     assertTrue(new WikiTokenizer(wikiText).nextToken().isWikiLink());
37     assertEquals("def", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
38     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkDest());
39
40     wikiText = "[[abc|def|ghi{{a|=2}}p]]";
41     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
42     assertTrue(new WikiTokenizer(wikiText).nextToken().isWikiLink());
43     assertEquals("ghi{{a|=2}}p", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
44     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkDest());
45
46     wikiText = "[[abc]][[def]]";
47     assertEquals("[[abc]]", new WikiTokenizer(wikiText).nextToken().token());
48     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
49     assertEquals("def", new WikiTokenizer(wikiText).nextToken().nextToken().wikiLinkText());
50
51   }
52   
53   public void testWikiList() {
54     String wikiText;
55
56     wikiText = "* This is ''bold''' asdf.";
57     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
58
59     wikiText = "* {{a|US}} {{IPA|[ˈfɔɹ.wɝd]]}}\nasdf\n";
60     assertEquals("* {{a|US}} {{IPA|[ˈfɔɹ.wɝd]]}}", new WikiTokenizer(wikiText).nextToken().token());
61     assertTrue(new WikiTokenizer(wikiText).nextToken().isListItem());
62     assertEquals("\n", new WikiTokenizer(wikiText).nextToken().nextToken().token());
63
64     
65     wikiText = "* [[asdf|\u2028" +
66                 "asdf]]";
67     assertEquals("* [[asdf|\n" +
68         "asdf]]", new WikiTokenizer(wikiText).nextToken().token());
69     assertTrue(new WikiTokenizer(wikiText).nextToken().isListItem());
70
71   }
72   
73   public void testFunction() {
74     String wikiText;
75
76     {
77     WikiTokenizer wt = new WikiTokenizer("'''Προστατευόμενη Ονομασία Προέλευσης''', \"Protected Designation of Origin\" {{");
78         while (wt.nextToken() != null) {
79             if (wt.isFunction()) {
80                 assertEquals("", wt.functionName());
81             }
82         }
83     }
84
85     wikiText = "{{abc}}";
86     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
87     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
88     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
89     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionPositionArgs().size());
90     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
91
92     wikiText = "{{abc|def}}";
93     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
94     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
95     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
96     assertEquals(Arrays.asList("def"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
97     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
98
99     wikiText = "{{abc|d[[|]]ef|ghi}}";
100     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
101     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
102     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
103     assertEquals(Arrays.asList("d[[|]]ef", "ghi"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
104     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
105
106     wikiText = "{{abc|arg1=101|ghi|arg2=202|arg3={{n1|n2=7|n3}}|{{d}}}}";
107     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
108     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
109     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
110     assertEquals(Arrays.asList("ghi", "{{d}}"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
111     assertEquals(3, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
112     assertEquals("101", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg1"));
113     assertEquals("202", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg2"));
114     assertEquals("{{n1|n2=7|n3}}", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg3"));
115
116     wikiText = "{{gloss|asdf}\nAsdf\n\n";
117     assertEquals("{{gloss|asdf}", new WikiTokenizer(wikiText).nextToken().token());
118
119     wikiText = "#*{{quote-book|year=1960|author={{w|P. G. Wodehouse}}\n" +
120     "|title={{w|Jeeves in the Offing}}\n" +
121     "|section=chapter XI\n" +
122     "|passage=“I'm sorely beset, Jeeves. Do you recall telling me once about someone who told somebody he could tell him something which would make him think a bit? Knitted socks and porcu\n" +
123     "pines entered into it, I remember.” “I think you may be referring to the ghost of the father of Hamlet, Prince of Denmark, sir. Addressing his son, he said ‘I could a tale unfold whos\n" +
124     "e lightest word would harrow up thy soul, freeze thy young blood, make thy two eyes, like stars, start from their spheres, thy knotted and combined locks to part and each particular h\n" +
125     "air to stand on end like quills upon the fretful '''porpentine'''.’ ” “That's right. Locks, of course, not socks. Odd that he should have said '''porpentine''' when he meant porc\n" +
126     "upine. Slip of the tongue, no doubt, as so often happens with ghosts.”}}";
127     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
128
129     
130   }
131   
132   public void testReturn() {
133     String wikiText;
134
135     wikiText = "hello\n=Heading=\nhello2";
136     
137     final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
138     
139     assertEquals("hello", tokenizer.nextToken().token());
140     tokenizer.returnToLineStart();
141     assertEquals("hello", tokenizer.nextToken().token());
142     assertEquals("\n", tokenizer.nextToken().token());
143     tokenizer.returnToLineStart();
144     assertEquals("hello", tokenizer.nextToken().token());
145     assertEquals("\n", tokenizer.nextToken().token());
146     
147     assertEquals("=Heading=", tokenizer.nextToken().token());
148     tokenizer.returnToLineStart();
149     assertEquals("=Heading=", tokenizer.nextToken().token());
150     assertEquals("\n", tokenizer.nextToken().token());
151     tokenizer.returnToLineStart();
152     assertEquals("=Heading=", tokenizer.nextToken().token());
153     assertEquals("\n", tokenizer.nextToken().token());
154
155     assertEquals("hello2", tokenizer.nextToken().token());
156     assertEquals(null, tokenizer.nextToken());
157     tokenizer.returnToLineStart();
158     assertEquals("hello2", tokenizer.nextToken().token());
159     assertEquals(null, tokenizer.nextToken());
160     
161     
162   }
163
164   public void testWikiHeading() {
165     String wikiText;
166
167     wikiText = "==";
168     assertEquals("==", new WikiTokenizer(wikiText).nextToken().token());
169     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
170     assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
171     assertEquals("", new WikiTokenizer(wikiText).nextToken().headingWikiText());
172     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
173
174     
175     wikiText = "=a";
176     assertEquals("=a", new WikiTokenizer(wikiText).nextToken().token());
177     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
178     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
179     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
180     assertEquals(2, new WikiTokenizer(wikiText).nextToken().errors.size());
181
182     wikiText = "=a==";
183     assertEquals("=a==", new WikiTokenizer(wikiText).nextToken().token());
184     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
185     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
186     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
187     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
188
189     wikiText = "a=";
190     assertEquals("a", new WikiTokenizer(wikiText).nextToken().token());
191     assertFalse(new WikiTokenizer(wikiText).nextToken().isHeading());
192
193     wikiText = "=a=";
194     assertEquals("=a=", new WikiTokenizer(wikiText).nextToken().token());
195     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
196     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
197     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
198     assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
199
200     wikiText = "==aa[[|=]] {{|={{=}} }}==";
201     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
202     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
203     assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
204     assertEquals("aa[[|=]] {{|={{=}} }}", new WikiTokenizer(wikiText).nextToken().headingWikiText());
205     assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
206     
207   }
208
209   
210
211   public void testSimple() {
212     final String wikiText =
213       "Hi" + "\n" +
214       "Hello =thad| you're <!-- not --> '''pretty''' cool '''''over''''' there." + "\n" +
215       "hi <!--" + "\n" +
216       "multi-line" + "\n" +
217       "# comment -->" + "\n" +
218       "" + "\n" +
219       "asdf\n" +
220       "{{template_not_in_list}}" + "\n" +
221       "# {{template_in_list}}" + "\n" +
222       "[[wikitext]]:[[wikitext]]" + "\n" +  // don't want this to trigger a list
223       ": but this is a list!" + "\n" +
224       "*:* and so is this :::" + "\n" +
225       "here's [[some blah|some]] wikitext." + "\n" +
226       "here's a {{template|this has an = sign|blah=2|blah2=3|" + "\n" +
227       "blah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}} and some more text." + "\n" +
228       "== Header 2 ==" + "\n" +
229       "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}" + "\n" +
230       "{{mismatched]]" + "\n" +
231       "[[mismatched}}" + "\n" +
232       "{extraterminated}}" + "\n" +
233       "[extraterminated]]" + "\n" +
234       "=== {{header-template}} ===" + "\n";
235     
236     final String[] expectedTokens = new String[] {
237         "Hi",
238         "\n",
239         "Hello ",
240         "=",
241         "thad",
242         "|",
243         " you're ",
244         "<!-- not -->",
245         " ",
246         "'''",
247         "pretty",
248         "'''",
249         " cool ",
250         "'''",
251         "''",
252         "over",
253         "'''",
254         "''",
255         " there.",
256         "\n",
257         "hi ",
258         "<!--\nmulti-line\n# comment -->",
259         "\n",
260         "\n",
261         "asdf",
262         "\n",
263         "{{template_not_in_list}}",
264         "\n",
265         "# {{template_in_list}}",
266         "\n",
267         "[[wikitext]]",
268         ":",
269         "[[wikitext]]",
270         "\n",
271         ": but this is a list!",
272         "\n",
273         "*:* and so is this :::",
274         "\n",
275         "here's ",
276         "[[some blah|some]]",
277         " wikitext.",
278         "\n",
279         "here's a ",
280         "{{template|this has an = sign|blah=2|blah2=3|\nblah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}}",
281         " and some more text.",
282         "\n",
283         "== Header 2 ==",
284         "\n",
285         "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}",
286         "\n",
287         "{{mismatched]]",
288         "\n",
289         "[[mismatched}}",
290         "\n",
291         "{extraterminated",
292         "}}",
293         "\n",
294         "[extraterminated",
295         "]]",
296         "\n",
297         "=== {{header-template}} ===",
298         "\n",
299         };
300     
301     final List<String> actualTokens = new ArrayList<String>();
302     
303     final WikiTokenizer wikiTokenizer = new WikiTokenizer(wikiText);
304     WikiTokenizer token;
305     int i = 0;
306     while ((token = wikiTokenizer.nextToken()) != null) {
307       actualTokens.add(token.token());
308       System.out.println("\"" + token.token().replace("\n", "\\n") + "\",");
309       assertEquals(expectedTokens[i++], token.token());
310     }
311     assertEquals(Arrays.asList(expectedTokens), actualTokens);
312   }
313   
314   public void testHtml() {
315       String wikiText;
316
317       {
318       wikiText = " zz <pre> asdf </pre> ZZ <math> 1234 </math> XX ";
319       final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
320       assertEquals(" zz ", tokenizer.nextToken().token());
321       assertEquals("<pre> asdf </pre>", tokenizer.nextToken().token());
322       assertEquals(" ZZ ", tokenizer.nextToken().token());
323       assertEquals("<math> 1234 </math>", tokenizer.nextToken().token());
324       assertEquals(" XX ", tokenizer.nextToken().token());
325       }
326       {
327       wikiText = "\n<math> 1234 </math>";
328       final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
329       assertEquals("<math> 1234 </math>", tokenizer.nextToken().nextToken().token());
330       }
331
332       {
333       wikiText = "# z'' is the '''free''' variable in \"<math>\\forall x\\exists y:xy=z</math>\".''";
334       final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
335       assertEquals(wikiText, tokenizer.nextToken().token());
336       }
337
338       
339   }
340   
341 }