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 }