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 }