1
2 package jp.sourceforge.torkenizer.test;
3
4 import jp.sourceforge.tokenizer.EofToken;
5 import jp.sourceforge.tokenizer.Token;
6 import jp.sourceforge.tokenizer.TokenInfo;
7 import jp.sourceforge.tokenizer.Tokenizer;
8 import jp.sourceforge.tokenizer.TokenizerException;
9 import junit.framework.TestCase;
10
11 /**
12 * 字句解析のテストを行います。
13 *
14 * @author uguu@users.sourceforge.jp
15 */
16 public class TokenizerTest extends TestCase {
17
18 /**
19 * インスタンスを初期化します。
20 *
21 * @param name
22 * テストの名前。
23 */
24 public TokenizerTest(String name) {
25 super(name);
26 }
27
28 /**
29 * 正常系テスト1。
30 */
31 public void testNormal1() {
32 String text = "123.456 + (789.012 - 345.678) - 012.345";
33 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new SkipTokenInfo(), new PlusTokenInfo(), new MinusTokenInfo(), new LeftBracketTokenInfo(), new RightBracketTokenInfo(), };
34 TokenInfo[] skipTokenInfos = new TokenInfo[0];
35
36 Tokenizer tokenizer = new Tokenizer(text);
37
38 assertNull(tokenizer.current());
39
40 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
41 Token t = tokenizer.current();
42 assertTrue(t instanceof NumberToken);
43 assertEquals("123.456", t.getToken());
44 assertEquals(0, t.getLine());
45 assertEquals(0, t.getColumn());
46
47 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
48 t = tokenizer.current();
49 assertTrue(t instanceof SkipToken);
50 assertEquals(" ", t.getToken());
51 assertEquals(0, t.getLine());
52 assertEquals(0, t.getColumn());
53
54 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
55 t = tokenizer.current();
56 assertTrue(t instanceof PlusToken);
57 assertEquals("+", t.getToken());
58 assertEquals(0, t.getLine());
59 assertEquals(0, t.getColumn());
60
61 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
62 t = tokenizer.current();
63 assertTrue(t instanceof SkipToken);
64 assertEquals(" ", t.getToken());
65 assertEquals(0, t.getLine());
66 assertEquals(0, t.getColumn());
67
68 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
69 t = tokenizer.current();
70 assertTrue(t instanceof LeftBracketToken);
71 assertEquals("(", t.getToken());
72 assertEquals(0, t.getLine());
73 assertEquals(0, t.getColumn());
74
75 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
76 t = tokenizer.current();
77 assertTrue(t instanceof NumberToken);
78 assertEquals("789.012", t.getToken());
79 assertEquals(0, t.getLine());
80 assertEquals(0, t.getColumn());
81
82 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
83 t = tokenizer.current();
84 assertTrue(t instanceof SkipToken);
85 assertEquals(" ", t.getToken());
86 assertEquals(0, t.getLine());
87 assertEquals(0, t.getColumn());
88
89 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
90 t = tokenizer.current();
91 assertTrue(t instanceof MinusToken);
92 assertEquals("-", t.getToken());
93 assertEquals(0, t.getLine());
94 assertEquals(0, t.getColumn());
95
96 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
97 t = tokenizer.current();
98 assertTrue(t instanceof SkipToken);
99 assertEquals(" ", t.getToken());
100 assertEquals(0, t.getLine());
101 assertEquals(0, t.getColumn());
102
103 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
104 t = tokenizer.current();
105 assertTrue(t instanceof NumberToken);
106 assertEquals("345.678", t.getToken());
107 assertEquals(0, t.getLine());
108 assertEquals(0, t.getColumn());
109
110 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
111 t = tokenizer.current();
112 assertTrue(t instanceof RightBracketToken);
113 assertEquals(")", t.getToken());
114 assertEquals(0, t.getLine());
115 assertEquals(0, t.getColumn());
116
117 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
118 t = tokenizer.current();
119 assertTrue(t instanceof SkipToken);
120 assertEquals(" ", t.getToken());
121 assertEquals(0, t.getLine());
122 assertEquals(0, t.getColumn());
123
124 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
125 t = tokenizer.current();
126 assertTrue(t instanceof MinusToken);
127 assertEquals("-", t.getToken());
128 assertEquals(0, t.getLine());
129 assertEquals(0, t.getColumn());
130
131 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
132 t = tokenizer.current();
133 assertTrue(t instanceof SkipToken);
134 assertEquals(" ", t.getToken());
135 assertEquals(0, t.getLine());
136 assertEquals(0, t.getColumn());
137
138 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
139 t = tokenizer.current();
140 assertTrue(t instanceof NumberToken);
141 assertEquals("012.345", t.getToken());
142 assertEquals(0, t.getLine());
143 assertEquals(0, t.getColumn());
144
145 assertFalse(tokenizer.read(readTokenInfos, skipTokenInfos));
146 t = tokenizer.current();
147 assertTrue(t instanceof EofToken);
148 assertEquals(null, t.getToken());
149 assertEquals(0, t.getLine());
150 assertEquals(0, t.getColumn());
151 }
152
153 /**
154 * 正常系テスト2。
155 */
156 public void testNormal2() {
157 String text = "123.456 + (789.012-345.678 ) - 012.345 ";
158 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new PlusTokenInfo(), new MinusTokenInfo(), new LeftBracketTokenInfo(), new RightBracketTokenInfo(), };
159 TokenInfo[] skipTokenInfos = new TokenInfo[] { new SkipTokenInfo(), };
160
161 Tokenizer tokenizer = new Tokenizer(text);
162
163 assertNull(tokenizer.current());
164
165 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
166 Token t = tokenizer.current();
167 assertTrue(t instanceof NumberToken);
168 assertEquals("123.456", t.getToken());
169 assertEquals(0, t.getLine());
170 assertEquals(0, t.getColumn());
171
172 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
173 t = tokenizer.current();
174 assertTrue(t instanceof PlusToken);
175 assertEquals("+", t.getToken());
176 assertEquals(0, t.getLine());
177 assertEquals(0, t.getColumn());
178
179 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
180 t = tokenizer.current();
181 assertTrue(t instanceof LeftBracketToken);
182 assertEquals("(", t.getToken());
183 assertEquals(0, t.getLine());
184 assertEquals(0, t.getColumn());
185
186 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
187 t = tokenizer.current();
188 assertTrue(t instanceof NumberToken);
189 assertEquals("789.012", t.getToken());
190 assertEquals(0, t.getLine());
191 assertEquals(0, t.getColumn());
192
193 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
194 t = tokenizer.current();
195 assertTrue(t instanceof MinusToken);
196 assertEquals("-", t.getToken());
197 assertEquals(0, t.getLine());
198 assertEquals(0, t.getColumn());
199
200 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
201 t = tokenizer.current();
202 assertTrue(t instanceof NumberToken);
203 assertEquals("345.678", t.getToken());
204 assertEquals(0, t.getLine());
205 assertEquals(0, t.getColumn());
206
207 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
208 t = tokenizer.current();
209 assertTrue(t instanceof RightBracketToken);
210 assertEquals(")", t.getToken());
211 assertEquals(0, t.getLine());
212 assertEquals(0, t.getColumn());
213
214 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
215 t = tokenizer.current();
216 assertTrue(t instanceof MinusToken);
217 assertEquals("-", t.getToken());
218 assertEquals(0, t.getLine());
219 assertEquals(0, t.getColumn());
220
221 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
222 t = tokenizer.current();
223 assertTrue(t instanceof NumberToken);
224 assertEquals("012.345", t.getToken());
225 assertEquals(0, t.getLine());
226 assertEquals(0, t.getColumn());
227
228 assertFalse(tokenizer.read(readTokenInfos, skipTokenInfos));
229 t = tokenizer.current();
230 assertTrue(t instanceof EofToken);
231 assertEquals(null, t.getToken());
232 assertEquals(0, t.getLine());
233 assertEquals(0, t.getColumn());
234 }
235
236 /**
237 * 正常系テスト3。
238 */
239 public void testNormal3() {
240 String text = "123.456 + (789.012 - 345.678) - 012.345";
241 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new PlusTokenInfo(), new MinusTokenInfo(), };
242 TokenInfo[] skipTokenInfos = new TokenInfo[] { new SkipTokenInfo(), };
243
244 Tokenizer tokenizer = new Tokenizer(text);
245
246 assertNull(tokenizer.current());
247
248 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
249 Token t = tokenizer.current();
250 assertTrue(t instanceof NumberToken);
251 assertEquals("123.456", t.getToken());
252 assertEquals(0, t.getLine());
253 assertEquals(0, t.getColumn());
254
255 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
256 t = tokenizer.current();
257 assertTrue(t instanceof PlusToken);
258 assertEquals("+", t.getToken());
259 assertEquals(0, t.getLine());
260 assertEquals(0, t.getColumn());
261
262 assertFalse(tokenizer.read(readTokenInfos, skipTokenInfos));
263 t = tokenizer.current();
264 assertTrue(t instanceof PlusToken);
265 assertEquals("+", t.getToken());
266 assertEquals(0, t.getLine());
267 assertEquals(0, t.getColumn());
268 }
269
270 /**
271 * 異常系テスト1。コンストラクタでtextがnullの場合、{@link NullPointerException}例外がスローされることを確認します。
272 */
273 public void testIllegal1() {
274 try {
275 new Tokenizer(null);
276 fail();
277 } catch (NullPointerException e) {
278 assertEquals("textがnullです。", e.getMessage());
279 }
280 }
281
282 /**
283 * 異常系テスト2。{@link Tokenizer#read(TokenInfo[], TokenInfo[])}でreadTokenInfosがnullの場合、{@link NullPointerException}例外がスローされることを確認します。
284 */
285 public void testIllegal2() {
286 String text = "123.456 + (789.012 - 345.678) - 012.345";
287 TokenInfo[] readTokenInfos = null;
288 TokenInfo[] skipTokenInfos = new TokenInfo[0];
289
290 Tokenizer tokenizer = new Tokenizer(text);
291 try {
292 tokenizer.read(readTokenInfos, skipTokenInfos);
293 fail();
294 } catch (NullPointerException e) {
295 assertEquals("readTokenInfosがnullです。", e.getMessage());
296 }
297 }
298
299 /**
300 * 異常系テスト3。{@link Tokenizer#read(TokenInfo[], TokenInfo[])}でskipTokenInfosがnullの場合、{@link NullPointerException}例外がスローされることを確認します。
301 */
302 public void testIllegal3() {
303 String text = "123.456 + (789.012 - 345.678) - 012.345";
304 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new PlusTokenInfo(), new MinusTokenInfo(), new LeftBracketTokenInfo(), new RightBracketTokenInfo(), };
305 TokenInfo[] skipTokenInfos = null;
306
307 Tokenizer tokenizer = new Tokenizer(text);
308 try {
309 tokenizer.read(readTokenInfos, skipTokenInfos);
310 fail();
311 } catch (NullPointerException e) {
312 assertEquals("skipTokenInfosがnullです。", e.getMessage());
313 }
314 }
315
316 /**
317 * 異常系テスト4。{@link Tokenizer#read(TokenInfo[], TokenInfo[])}でreadTokenInfos[2]がnullの場合、{@link NullPointerException}例外がスローされることを確認します。
318 */
319 public void testIllegal4() {
320 String text = "123.456 + (789.012 - 345.678) - 012.345";
321 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new PlusTokenInfo(), null, new MinusTokenInfo(), new LeftBracketTokenInfo(), new RightBracketTokenInfo(), };
322 TokenInfo[] skipTokenInfos = new TokenInfo[] { new SkipTokenInfo(), };
323
324 Tokenizer tokenizer = new Tokenizer(text);
325 try {
326 tokenizer.read(readTokenInfos, skipTokenInfos);
327 fail();
328 } catch (NullPointerException e) {
329 assertEquals("readTokenInfos[2]がnullです。", e.getMessage());
330 }
331 }
332
333 /**
334 * 異常系テスト5。{@link Tokenizer#read(TokenInfo[], TokenInfo[])}でskipTokenInfos[0]がnullの場合、{@link NullPointerException}例外がスローされることを確認します。
335 */
336 public void testIllegal5() {
337 String text = "123.456 + (789.012 - 345.678) - 012.345";
338 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new PlusTokenInfo(), new MinusTokenInfo(), new LeftBracketTokenInfo(), new RightBracketTokenInfo(), };
339 TokenInfo[] skipTokenInfos = new TokenInfo[] { null, };
340
341 Tokenizer tokenizer = new Tokenizer(text);
342 try {
343 tokenizer.read(readTokenInfos, skipTokenInfos);
344 fail();
345 } catch (NullPointerException e) {
346 assertEquals("skipTokenInfos[0]がnullです。", e.getMessage());
347 }
348 }
349
350 /**
351 * 異常系テスト6。{@link Tokenizer#read(TokenInfo[], TokenInfo[])}でreadTokenInfosの要素数が0の場合、{@link IllegalArgumentException}例外がスローされることを確認します。
352 */
353 public void testIllegal6() {
354 String text = "123.456 + (789.012 - 345.678) - 012.345";
355 TokenInfo[] readTokenInfos = new TokenInfo[0];
356 TokenInfo[] skipTokenInfos = new TokenInfo[0];
357
358 Tokenizer tokenizer = new Tokenizer(text);
359 try {
360 tokenizer.read(readTokenInfos, skipTokenInfos);
361 fail();
362 } catch (IllegalArgumentException e) {
363 assertEquals("readTokenInfosの要素数が0です。", e.getMessage());
364 }
365 }
366
367 /**
368 * 異常系テスト7。{@link Tokenizer#read(TokenInfo[], TokenInfo[])}で複数のトークンに一致した場合、{@link TokenizerException}例外がスローされることを確認します。
369 */
370 public void testIllegal7() {
371 String text = "123.456 + (789.012 - 345.678) - 012.345";
372 TokenInfo[] readTokenInfos = new TokenInfo[] { new NumberTokenInfo(), new SkipTokenInfo(), new PlusTokenInfo(), new MinusTokenInfo(), new LeftBracketTokenInfo(), new RightBracketTokenInfo(), };
373 TokenInfo[] skipTokenInfos = new TokenInfo[] { new SkipTokenInfo(), };
374
375 Tokenizer tokenizer = new Tokenizer(text);
376
377 assertTrue(tokenizer.read(readTokenInfos, skipTokenInfos));
378
379 try {
380 tokenizer.read(readTokenInfos, skipTokenInfos);
381 fail();
382 } catch (TokenizerException e) {
383 assertEquals("0行目、0列目で複数のトークンに一致しました。一致したトークンの正規表現は次の通りです。{ , }", e.getMessage());
384 assertEquals(0, e.getLine());
385 assertEquals(0, e.getColumn());
386 }
387 }
388 }