]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/WikiTokenizerTest.java
5193c00892a1f407ced4c994a7e669baf142f204
[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 }