]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/WikiTokenizerTest.java
9142bd87312508aec7b40dbac36d23533530fa34
[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   
60   public void testFunction() {
61     String wikiText;
62     
63     wikiText = "{{abc}}";
64     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
65     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
66     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
67     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionPositionArgs().size());
68     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
69
70     wikiText = "{{abc|def}}";
71     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
72     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
73     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
74     assertEquals(Arrays.asList("def"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
75     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
76
77     wikiText = "{{abc|d[[|]]ef|ghi}}";
78     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
79     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
80     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
81     assertEquals(Arrays.asList("d[[|]]ef", "ghi"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
82     assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
83
84     wikiText = "{{abc|arg1=101|ghi|arg2=202|arg3={{n1|n2=7|n3}}|{{d}}}}";
85     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
86     assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
87     assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
88     assertEquals(Arrays.asList("ghi", "{{d}}"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
89     assertEquals(3, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
90     assertEquals("101", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg1"));
91     assertEquals("202", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg2"));
92     assertEquals("{{n1|n2=7|n3}}", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg3"));
93
94     wikiText = "{{gloss|asdf}\nAsdf\n\n";
95     assertEquals("{{gloss|asdf}", new WikiTokenizer(wikiText).nextToken().token());
96
97     wikiText = "#*{{quote-book|year=1960|author={{w|P. G. Wodehouse}}\n" +
98     "|title={{w|Jeeves in the Offing}}\n" +
99     "|section=chapter XI\n" +
100     "|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" +
101     "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" +
102     "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" +
103     "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" +
104     "upine. Slip of the tongue, no doubt, as so often happens with ghosts.”}}";
105     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
106
107     
108   }
109   
110   public void testReturn() {
111     String wikiText;
112
113     wikiText = "hello\n=Heading=\nhello2";
114     
115     final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
116     
117     assertEquals("hello", tokenizer.nextToken().token());
118     tokenizer.returnToLineStart();
119     assertEquals("hello", tokenizer.nextToken().token());
120     assertEquals("\n", tokenizer.nextToken().token());
121     tokenizer.returnToLineStart();
122     assertEquals("hello", tokenizer.nextToken().token());
123     assertEquals("\n", tokenizer.nextToken().token());
124     
125     assertEquals("=Heading=", tokenizer.nextToken().token());
126     tokenizer.returnToLineStart();
127     assertEquals("=Heading=", tokenizer.nextToken().token());
128     assertEquals("\n", tokenizer.nextToken().token());
129     tokenizer.returnToLineStart();
130     assertEquals("=Heading=", tokenizer.nextToken().token());
131     assertEquals("\n", tokenizer.nextToken().token());
132
133     assertEquals("hello2", tokenizer.nextToken().token());
134     assertEquals(null, tokenizer.nextToken());
135     tokenizer.returnToLineStart();
136     assertEquals("hello2", tokenizer.nextToken().token());
137     assertEquals(null, tokenizer.nextToken());
138     
139     
140   }
141
142   public void testWikiHeading() {
143     String wikiText;
144
145     wikiText = "==";
146     assertEquals("==", new WikiTokenizer(wikiText).nextToken().token());
147     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
148     assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
149     assertEquals("", new WikiTokenizer(wikiText).nextToken().headingWikiText());
150     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
151
152     
153     wikiText = "=a";
154     assertEquals("=a", new WikiTokenizer(wikiText).nextToken().token());
155     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
156     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
157     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
158     assertEquals(2, new WikiTokenizer(wikiText).nextToken().errors.size());
159
160     wikiText = "=a==";
161     assertEquals("=a==", new WikiTokenizer(wikiText).nextToken().token());
162     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
163     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
164     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
165     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
166
167     wikiText = "a=";
168     assertEquals("a", new WikiTokenizer(wikiText).nextToken().token());
169     assertFalse(new WikiTokenizer(wikiText).nextToken().isHeading());
170
171     wikiText = "=a=";
172     assertEquals("=a=", new WikiTokenizer(wikiText).nextToken().token());
173     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
174     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
175     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
176     assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
177
178     wikiText = "==aa[[|=]] {{|={{=}} }}==";
179     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
180     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
181     assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
182     assertEquals("aa[[|=]] {{|={{=}} }}", new WikiTokenizer(wikiText).nextToken().headingWikiText());
183     assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
184     
185   }
186
187   
188
189   public void testSimple() {
190     final String wikiText =
191       "Hi" + "\n" +
192       "Hello =thad| you're <!-- not --> '''pretty''' cool '''''over''''' there." + "\n" +
193       "hi <!--" + "\n" +
194       "multi-line" + "\n" +
195       "# comment -->" + "\n" +
196       "" + "\n" +
197       "asdf\n" +
198       "{{template_not_in_list}}" + "\n" +
199       "# {{template_in_list}}" + "\n" +
200       "[[wikitext]]:[[wikitext]]" + "\n" +  // don't want this to trigger a list
201       ": but this is a list!" + "\n" +
202       "*:* and so is this :::" + "\n" +
203       "here's [[some blah|some]] wikitext." + "\n" +
204       "here's a {{template|this has an = sign|blah=2|blah2=3|" + "\n" +
205       "blah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}} and some more text." + "\n" +
206       "== Header 2 ==" + "\n" +
207       "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}" + "\n" +
208       "{{mismatched]]" + "\n" +
209       "[[mismatched}}" + "\n" +
210       "{extraterminated}}" + "\n" +
211       "[extraterminated]]" + "\n" +
212       "=== {{header-template}} ===" + "\n";
213     
214     final String[] expectedTokens = new String[] {
215         "Hi",
216         "\n",
217         "Hello ",
218         "=",
219         "thad",
220         "|",
221         " you're ",
222         "<!-- not -->",
223         " ",
224         "'''",
225         "pretty",
226         "'''",
227         " cool ",
228         "'''",
229         "''",
230         "over",
231         "'''",
232         "''",
233         " there.",
234         "\n",
235         "hi ",
236         "<!--\nmulti-line\n# comment -->",
237         "\n",
238         "\n",
239         "asdf",
240         "\n",
241         "{{template_not_in_list}}",
242         "\n",
243         "# {{template_in_list}}",
244         "\n",
245         "[[wikitext]]",
246         ":",
247         "[[wikitext]]",
248         "\n",
249         ": but this is a list!",
250         "\n",
251         "*:* and so is this :::",
252         "\n",
253         "here's ",
254         "[[some blah|some]]",
255         " wikitext.",
256         "\n",
257         "here's a ",
258         "{{template|this has an = sign|blah=2|blah2=3|\nblah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}}",
259         " and some more text.",
260         "\n",
261         "== Header 2 ==",
262         "\n",
263         "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}",
264         "\n",
265         "{{mismatched]]",
266         "\n",
267         "[[mismatched}}",
268         "\n",
269         "{extraterminated",
270         "}}",
271         "\n",
272         "[extraterminated",
273         "]]",
274         "\n",
275         "=== {{header-template}} ===",
276         "\n",
277         };
278     
279     final List<String> actualTokens = new ArrayList<String>();
280     
281     final WikiTokenizer wikiTokenizer = new WikiTokenizer(wikiText);
282     WikiTokenizer token;
283     int i = 0;
284     while ((token = wikiTokenizer.nextToken()) != null) {
285       actualTokens.add(token.token());
286       System.out.println("\"" + token.token().replace("\n", "\\n") + "\",");
287       assertEquals(expectedTokens[i++], token.token());
288     }
289     assertEquals(Arrays.asList(expectedTokens), actualTokens);
290   }
291   
292 }