1 package com.hughes.android.dictionary.parser;
3 import java.util.ArrayList;
4 import java.util.Arrays;
7 import junit.framework.TestCase;
9 public class WikiTokenizerTest extends TestCase {
11 public void testWikiLink() {
15 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
16 assertTrue(new WikiTokenizer(wikiText).nextToken().isWikiLink());
17 assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
18 assertEquals(null, new WikiTokenizer(wikiText).nextToken().wikiLinkDest());
20 wikiText = "[[abc|def]]";
21 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
22 assertTrue(new WikiTokenizer(wikiText).nextToken().isWikiLink());
23 assertEquals("def", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
24 assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkDest());
26 wikiText = "[[abc|def|ghi{{a|=2}}p]]";
27 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
28 assertTrue(new WikiTokenizer(wikiText).nextToken().isWikiLink());
29 assertEquals("ghi{{a|=2}}p", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
30 assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkDest());
32 wikiText = "[[abc]][[def]]";
33 assertEquals("[[abc]]", new WikiTokenizer(wikiText).nextToken().token());
34 assertEquals("abc", new WikiTokenizer(wikiText).nextToken().wikiLinkText());
35 assertEquals("def", new WikiTokenizer(wikiText).nextToken().nextToken().wikiLinkText());
39 public void testWikiList() {
42 wikiText = "* This is ''bold''' asdf.";
43 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
46 public void testFunction() {
50 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
51 assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
52 assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
53 assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionPositionArgs().size());
54 assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
56 wikiText = "{{abc|def}}";
57 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
58 assertTrue(new WikiTokenizer(wikiText).nextToken().isFunction());
59 assertEquals("abc", new WikiTokenizer(wikiText).nextToken().functionName());
60 assertEquals(Arrays.asList("def"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
61 assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
63 wikiText = "{{abc|d[[|]]ef|ghi}}";
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(Arrays.asList("d[[|]]ef", "ghi"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
68 assertEquals(0, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
70 wikiText = "{{abc|arg1=101|ghi|arg2=202|arg3={{n1|n2=7|n3}}|{{d}}}}";
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("ghi", "{{d}}"), new WikiTokenizer(wikiText).nextToken().functionPositionArgs());
75 assertEquals(3, new WikiTokenizer(wikiText).nextToken().functionNamedArgs().size());
76 assertEquals("101", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg1"));
77 assertEquals("202", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg2"));
78 assertEquals("{{n1|n2=7|n3}}", new WikiTokenizer(wikiText).nextToken().functionNamedArgs().get("arg3"));
83 public void testReturn() {
86 wikiText = "hello\n=Heading=\nhello2";
88 final WikiTokenizer tokenizer = new WikiTokenizer(wikiText);
90 assertEquals("hello", tokenizer.nextToken().token());
91 tokenizer.returnToLineStart();
92 assertEquals("hello", tokenizer.nextToken().token());
93 assertEquals("\n", tokenizer.nextToken().token());
94 tokenizer.returnToLineStart();
95 assertEquals("hello", tokenizer.nextToken().token());
96 assertEquals("\n", tokenizer.nextToken().token());
98 assertEquals("=Heading=", tokenizer.nextToken().token());
99 tokenizer.returnToLineStart();
100 assertEquals("=Heading=", tokenizer.nextToken().token());
101 assertEquals("\n", tokenizer.nextToken().token());
102 tokenizer.returnToLineStart();
103 assertEquals("=Heading=", tokenizer.nextToken().token());
104 assertEquals("\n", tokenizer.nextToken().token());
106 assertEquals("hello2", tokenizer.nextToken().token());
107 assertEquals(null, tokenizer.nextToken());
108 tokenizer.returnToLineStart();
109 assertEquals("hello2", tokenizer.nextToken().token());
110 assertEquals(null, tokenizer.nextToken());
115 public void testWikiHeading() {
119 assertEquals("==", new WikiTokenizer(wikiText).nextToken().token());
120 assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
121 assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
122 assertEquals("", new WikiTokenizer(wikiText).nextToken().headingWikiText());
123 assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
127 assertEquals("=a", new WikiTokenizer(wikiText).nextToken().token());
128 assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
129 assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
130 assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
131 assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
134 assertEquals("=a==", new WikiTokenizer(wikiText).nextToken().token());
135 assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
136 assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
137 assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
138 assertEquals(1, new WikiTokenizer(wikiText).nextToken().errors.size());
141 assertEquals("a", new WikiTokenizer(wikiText).nextToken().token());
142 assertFalse(new WikiTokenizer(wikiText).nextToken().isHeading());
145 assertEquals("=a=", new WikiTokenizer(wikiText).nextToken().token());
146 assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
147 assertEquals(1, new WikiTokenizer(wikiText).nextToken().headingDepth());
148 assertEquals("a", new WikiTokenizer(wikiText).nextToken().headingWikiText());
149 assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
151 wikiText = "==aa[[|=]] {{|={{=}} }}==";
152 assertEquals(wikiText, new WikiTokenizer(wikiText).nextToken().token());
153 assertTrue(new WikiTokenizer(wikiText).nextToken().isHeading());
154 assertEquals(2, new WikiTokenizer(wikiText).nextToken().headingDepth());
155 assertEquals("aa[[|=]] {{|={{=}} }}", new WikiTokenizer(wikiText).nextToken().headingWikiText());
156 assertEquals(0, new WikiTokenizer(wikiText).nextToken().errors.size());
161 public void testSimple() {
162 final String wikiText =
164 "Hello =thad| you're <!-- not --> '''pretty''' cool '''''over''''' there." + "\n" +
166 "multi-line" + "\n" +
167 "# comment -->" + "\n" +
170 "{{template_not_in_list}}" + "\n" +
171 "# {{template_in_list}}" + "\n" +
172 "[[wikitext]]:[[wikitext]]" + "\n" + // don't want this to trigger a list
173 ": but this is a list!" + "\n" +
174 "*:* and so is this :::" + "\n" +
175 "here's [[some blah|some]] wikitext." + "\n" +
176 "here's a {{template|this has an = sign|blah=2|blah2=3|" + "\n" +
177 "blah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}} and some more text." + "\n" +
178 "== Header 2 ==" + "\n" +
179 "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}" + "\n" +
180 "{{mismatched]]" + "\n" +
181 "[[mismatched}}" + "\n" +
182 "{extraterminated}}" + "\n" +
183 "[extraterminated]]" + "\n" +
184 "=== {{header-template}} ===" + "\n";
186 final String[] expectedTokens = new String[] {
208 "<!--\nmulti-line\n# comment -->",
213 "{{template_not_in_list}}",
215 "# {{template_in_list}}",
221 ": but this is a list!",
223 "*:* and so is this :::",
226 "[[some blah|some]]",
230 "{{template|this has an = sign|blah=2|blah2=3|\nblah3=3,[[asdf]|[asdf asdf]|[asdf asdf asdf]],blah4=4}}",
231 " and some more text.",
235 "{{some-func|blah={{nested-func|n2}}|blah2=asdf}}",
247 "=== {{header-template}} ===",
251 final List<String> actualTokens = new ArrayList<String>();
253 final WikiTokenizer wikiTokenizer = new WikiTokenizer(wikiText);
256 while ((token = wikiTokenizer.nextToken()) != null) {
257 actualTokens.add(token.token());
258 System.out.println("\"" + token.token().replace("\n", "\\n") + "\",");
259 assertEquals(expectedTokens[i++], token.token());
261 assertEquals(Arrays.asList(expectedTokens), actualTokens);