]> gitweb.fperrin.net Git - DictionaryPC.git/blob - src/com/hughes/android/dictionary/parser/WikiTokenizerTest.java
Apache license.
[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     
95   }
96   
97   public void testReturn() {
98     String wikiText;
99
100     wikiText = "hello\n=Heading=\nhello2";
101     
102     final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
103     
104     assertEquals("hello", tokenizer.nextToken().token());
105     tokenizer.returnToLineStart();
106     assertEquals("hello", tokenizer.nextToken().token());
107     assertEquals("\n", tokenizer.nextToken().token());
108     tokenizer.returnToLineStart();
109     assertEquals("hello", tokenizer.nextToken().token());
110     assertEquals("\n", tokenizer.nextToken().token());
111     
112     assertEquals("=Heading=", tokenizer.nextToken().token());
113     tokenizer.returnToLineStart();
114     assertEquals("=Heading=", tokenizer.nextToken().token());
115     assertEquals("\n", tokenizer.nextToken().token());
116     tokenizer.returnToLineStart();
117     assertEquals("=Heading=", tokenizer.nextToken().token());
118     assertEquals("\n", tokenizer.nextToken().token());
119
120     assertEquals("hello2", tokenizer.nextToken().token());
121     assertEquals(null, tokenizer.nextToken());
122     tokenizer.returnToLineStart();
123     assertEquals("hello2", tokenizer.nextToken().token());
124     assertEquals(null, tokenizer.nextToken());
125     
126     
127   }
128
129   public void testWikiHeading() {
130     String wikiText;
131
132     wikiText = "==";
133     assertEquals("==", new WikiTokenizer(wikiText).nextToken().token());
134     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
135     assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
136     assertEquals("", new WikiTokenizer(wikiText).nextToken().headingWikiText());
137     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
138
139     
140     wikiText = "=a";
141     assertEquals("=a", new WikiTokenizer(wikiText).nextToken().token());
142     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
143     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
144     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
145     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
146
147     wikiText = "=a==";
148     assertEquals("=a==", new WikiTokenizer(wikiText).nextToken().token());
149     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
150     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
151     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
152     assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
153
154     wikiText = "a=";
155     assertEquals("a", new WikiTokenizer(wikiText).nextToken().token());
156     assertFalse(new WikiTokenizer(wikiText).nextToken().isHeading());
157
158     wikiText = "=a=";
159     assertEquals("=a=", new WikiTokenizer(wikiText).nextToken().token());
160     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
161     assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
162     assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
163     assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
164
165     wikiText = "==aa[[|=]] {{|={{=}} }}==";
166     assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
167     assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
168     assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
169     assertEquals("aa[[|=]] {{|={{=}} }}", new WikiTokenizer(wikiText).nextToken().headingWikiText());
170     assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
171   }
172
173   
174
175   public void testSimple() {
176     final String wikiText =
177       "Hi" + "\n" +
178       "Hello =thad| you're <!-- not --> '''pretty''' cool '''''over''''' there." + "\n" +
179       "hi <!--" + "\n" +
180       "multi-line" + "\n" +
181       "# comment -->" + "\n" +
182       "" + "\n" +
183       "asdf\n" +
184       "{{template_not_in_list}}" + "\n" +
185       "# {{template_in_list}}" + "\n" +
186       "[[wikitext]]:[[wikitext]]" + "\n" +  // don't want this to trigger a list
187       ": but this is a list!" + "\n" +
188       "*:* and so is this :::" + "\n" +
189       "here's [[some blah|some]] wikitext." + "\n" +
190       "here's a {{template|this has an = sign|blah=2|blah2=3|" + "\n" +
191       "blah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}} and some more text." + "\n" +
192       "== Header 2 ==" + "\n" +
193       "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}" + "\n" +
194       "{{mismatched]]" + "\n" +
195       "[[mismatched}}" + "\n" +
196       "{extraterminated}}" + "\n" +
197       "[extraterminated]]" + "\n" +
198       "=== {{header-template}} ===" + "\n";
199     
200     final String[] expectedTokens = new String[] {
201         "Hi",
202         "\n",
203         "Hello ",
204         "=",
205         "thad",
206         "|",
207         " you're ",
208         "<!-- not -->",
209         " ",
210         "'''",
211         "pretty",
212         "'''",
213         " cool ",
214         "'''",
215         "''",
216         "over",
217         "'''",
218         "''",
219         " there.",
220         "\n",
221         "hi ",
222         "<!--\nmulti-line\n# comment -->",
223         "\n",
224         "\n",
225         "asdf",
226         "\n",
227         "{{template_not_in_list}}",
228         "\n",
229         "# {{template_in_list}}",
230         "\n",
231         "[[wikitext]]",
232         ":",
233         "[[wikitext]]",
234         "\n",
235         ": but this is a list!",
236         "\n",
237         "*:* and so is this :::",
238         "\n",
239         "here's ",
240         "[[some blah|some]]",
241         " wikitext.",
242         "\n",
243         "here's a ",
244         "{{template|this has an = sign|blah=2|blah2=3|\nblah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}}",
245         " and some more text.",
246         "\n",
247         "== Header 2 ==",
248         "\n",
249         "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}",
250         "\n",
251         "{{mismatched]]",
252         "\n",
253         "[[mismatched}}",
254         "\n",
255         "{extraterminated",
256         "}}",
257         "\n",
258         "[extraterminated",
259         "]]",
260         "\n",
261         "=== {{header-template}} ===",
262         "\n",
263         };
264     
265     final List<String> actualTokens = new ArrayList<String>();
266     
267     final WikiTokenizer wikiTokenizer = new WikiTokenizer(wikiText);
268     WikiTokenizer token;
269     int i = 0;
270     while ((token = wikiTokenizer.nextToken()) != null) {
271       actualTokens.add(token.token());
272       System.out.println("\"" + token.token().replace("\n", "\\n") + "\",");
273       assertEquals(expectedTokens[i++], token.token());
274     }
275     assertEquals(Arrays.asList(expectedTokens), actualTokens);
276   }
277   
278 }