1 2 package jp.sourceforge.rpn_computer.test; 3 4 import jp.sourceforge.rpn_computer.ParseException; 5 import jp.sourceforge.rpn_computer.RpnNode; 6 import jp.sourceforge.rpn_computer.RpnParser; 7 import junit.framework.TestCase; 8 9 /** 10 * 構文解析のテストを行います。 11 * 12 * @author uguu@users.sourceforge.jp 13 */ 14 public class RpnParserTest extends TestCase { 15 16 /** 17 * インスタンスを初期化します。 18 * 19 * @param name 20 * テストの名前。 21 */ 22 public RpnParserTest(String name) { 23 super(name); 24 } 25 26 /** 27 * 正常系テスト1。 28 */ 29 public void testNormal1() { 30 String exp = "12.34 + 56.78"; 31 32 RpnParser parser = new RpnParser(); 33 RpnNode node = parser.parse(exp); 34 35 String str = "expression statement\n" + "\tadditive expression\n" + "\t\tmultiplicative expression\n" + "\t\t\tprimary expression\n" + "\t\t\t\tnumber[12.34]\n" + "\t\tadd[+]\n" + "\t\tadditive expression\n" + "\t\t\tmultiplicative expression\n" + "\t\t\t\tprimary expression\n" + "\t\t\t\t\tnumber[56.78]\n"; 36 37 assertEquals(str, node.toString()); 38 } 39 40 /** 41 * 正常系テスト2。 42 */ 43 public void testNormal2() { 44 String exp = "(1.2 + 3.4) * (5.6 - 7.8 / (9.0 + 0.1))"; 45 46 RpnParser parser = new RpnParser(); 47 RpnNode node = parser.parse(exp); 48 49 String str = "expression statement\n" + "\tadditive expression\n" + "\t\tmultiplicative expression\n" + "\t\t\tprimary expression\n" + "\t\t\t\tleft bracket[(]\n" + "\t\t\t\tadditive expression\n" + "\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\tnumber[1.2]\n" + "\t\t\t\t\tadd[+]\n" + "\t\t\t\t\tadditive expression\n" + "\t\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\t\tnumber[3.4]\n" + "\t\t\t\tright bracket[)]\n" + "\t\t\tmultiply[*]\n" + "\t\t\tmultiplicative expression\n" + "\t\t\t\tprimary expression\n" + "\t\t\t\t\tleft bracket[(]\n" + "\t\t\t\t\tadditive expression\n" + "\t\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\t\tnumber[5.6]\n" + "\t\t\t\t\t\tsubtract[-]\n" + "\t\t\t\t\t\tadditive expression\n" + "\t\t\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\t\t\tnumber[7.8]\n" + "\t\t\t\t\t\t\t\tdivide[/]\n" + "\t\t\t\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\t\t\t\tleft bracket[(]\n" + "\t\t\t\t\t\t\t\t\t\tadditive expression\n" + "\t\t\t\t\t\t\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\t\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\t\t\t\t\t\t\tnumber[9.0]\n" + "\t\t\t\t\t\t\t\t\t\t\tadd[+]\n" + "\t\t\t\t\t\t\t\t\t\t\tadditive expression\n" + "\t\t\t\t\t\t\t\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\t\t\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\t\t\t\t\t\t\t\tnumber[0.1]\n" + "\t\t\t\t\t\t\t\t\t\tright bracket[)]\n" + "\t\t\t\t\tright bracket[)]\n"; 50 51 assertEquals(str, node.toString()); 52 } 53 54 /** 55 * 正常系テスト3。 56 */ 57 public void testNormal3() { 58 String exp = "1 + + 2"; 59 60 RpnParser parser = new RpnParser(); 61 RpnNode node = parser.parse(exp); 62 63 String str = "expression statement\n" + "\tadditive expression\n" + "\t\tmultiplicative expression\n" + "\t\t\tprimary expression\n" + "\t\t\t\tnumber[1.0]\n" + "\t\tadd[+]\n" + "\t\tadditive expression\n" + "\t\t\tmultiplicative expression\n" + "\t\t\t\tprimary expression\n" + "\t\t\t\t\tpre add[+]\n" + "\t\t\t\t\tnumber[2.0]\n"; 64 65 assertEquals(str, node.toString()); 66 } 67 68 /** 69 * 正常系テスト4。 70 */ 71 public void testNormal4() { 72 String exp = "(+1)"; 73 74 RpnParser parser = new RpnParser(); 75 RpnNode node = parser.parse(exp); 76 77 String str = "expression statement\n" + "\tadditive expression\n" + "\t\tmultiplicative expression\n" + "\t\t\tprimary expression\n" + "\t\t\t\tleft bracket[(]\n" + "\t\t\t\tadditive expression\n" + "\t\t\t\t\tmultiplicative expression\n" + "\t\t\t\t\t\tprimary expression\n" + "\t\t\t\t\t\t\tpre add[+]\n" + "\t\t\t\t\t\t\tnumber[1.0]\n" + "\t\t\t\tright bracket[)]\n"; 78 79 assertEquals(str, node.toString()); 80 } 81 82 /** 83 * 異常系テスト1。{@link RpnParser#parse(String)}メソッドのexpressionがnullのとき、{@link NullPointerException}例外がスローされることを確認します。 84 */ 85 public void testFail1() { 86 RpnParser parser = new RpnParser(); 87 try { 88 parser.parse(null); 89 fail(); 90 } catch (NullPointerException e) { 91 assertEquals("expressionがnullです。", e.getMessage()); 92 } 93 } 94 95 /** 96 * 異常系テスト2。不正な構文を指定したとき、{@link ParseException}例外がスローされることを確認します。 97 */ 98 public void testFail2() { 99 String exp = "1 2"; 100 101 RpnParser parser = new RpnParser(); 102 try { 103 parser.parse(exp); 104 fail(); 105 } catch (ParseException e) { 106 assertEquals("0行目、0列目でトークン\"2\"が出現しました。正しくは、次のパターンのトークンを期待しています。{}", e.getMessage()); 107 } 108 } 109 110 /** 111 * 異常系テスト3。不正な構文を指定したとき、{@link ParseException}例外がスローされることを確認します。 112 */ 113 public void testFail3() { 114 String exp = "1 (1 + 2)"; 115 116 RpnParser parser = new RpnParser(); 117 try { 118 parser.parse(exp); 119 fail(); 120 } catch (ParseException e) { 121 assertEquals("0行目、0列目でトークン\"(\"が出現しました。正しくは、次のパターンのトークンを期待しています。{}", e.getMessage()); 122 } 123 } 124 125 /** 126 * 異常系テスト4。不正な構文を指定したとき、{@link ParseException}例外がスローされることを確認します。 127 */ 128 public void testFail4() { 129 String exp = "1 + * 1"; 130 131 RpnParser parser = new RpnParser(); 132 try { 133 parser.parse(exp); 134 fail(); 135 } catch (ParseException e) { 136 assertEquals("期待したトークンが出現しませんでした。次のパターンのトークンを期待しています。{[0-9]+(\\.[0-9]+)?, \\(}", e.getMessage()); 137 } 138 } 139 140 /** 141 * 異常系テスト5。不正な構文を指定したとき、{@link ParseException}例外がスローされることを確認します。 142 */ 143 public void testFail5() { 144 String exp = "1 * * 1"; 145 146 RpnParser parser = new RpnParser(); 147 try { 148 parser.parse(exp); 149 fail(); 150 } catch (ParseException e) { 151 assertEquals("期待したトークンが出現しませんでした。次のパターンのトークンを期待しています。{[0-9]+(\\.[0-9]+)?, \\(}", e.getMessage()); 152 } 153 } 154 155 /** 156 * 異常系テスト6。不正な構文を指定したとき、{@link ParseException}例外がスローされることを確認します。 157 */ 158 public void testFail6() { 159 String exp = "()"; 160 161 RpnParser parser = new RpnParser(); 162 try { 163 parser.parse(exp); 164 fail(); 165 } catch (ParseException e) { 166 assertEquals("期待したトークンが出現しませんでした。次のパターンのトークンを期待しています。{[0-9]+(\\.[0-9]+)?, \\(}", e.getMessage()); 167 } 168 } 169 }