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 }