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