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 }