File tree

3 files changed

+153
-134
lines changed

3 files changed

+153
-134
lines changed
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const NumberToken = require('./tokens/NumberToken').NumberToken;
22
const PlusToken = require('./tokens/PlusToken').PlusToken;
33
const MinusToken = require('./tokens/MinusToken').MinusToken;
44
const MultiplicationToken = require('./tokens/MultiplicationToken').MultiplicationToken;
5+
const DivisionToken = require('./tokens/DivisionToken').DivisionToken;
56
const OpeningBracketToken = require('./tokens/OpeningBracketToken').OpeningBracketToken;
67
const ClosingBracketToken = require('./tokens/ClosingBracketToken').ClosingBracketToken;
78

Original file line numberDiff line numberDiff line change
@@ -1,151 +1,69 @@
11
const MathParser = require('./MathParser').MathParser;
2+
const singlePlusMinusOperationData = require('./testData').singlePlusMinusOperationData;
3+
const doublePlusMinusOperationData = require('./testData').doublePlusMinusOperationData;
4+
const triplePlusMinusOperationData = require('./testData').triplePlusMinusOperationData;
5+
const singleMultiplyDivideOperationData = require('./testData').singleMultiplyDivideOperationData;
26

37
describe("Recursive Descent Parser tests", function() {
48

5-
[
6-
{num1: 1, num2: 2, operator: "+", expectedResult: 3},
7-
{num1: 10, num2: 2, operator: "+", expectedResult: 12},
8-
{num1: 1, num2: 20, operator: "+", expectedResult: 21},
9-
{num1: -1, num2: 2, operator: "+", expectedResult: 1},
10-
{num1: -10, num2: 2, operator: "+", expectedResult: -8},
11-
{num1: -1, num2: 20, operator: "+", expectedResult: 19},
12-
{num1: 1, num2: 2, operator: "-", expectedResult: -1},
13-
{num1: 10, num2: 2, operator: "-", expectedResult: 8},
14-
{num1: 1, num2: 20, operator: "-", expectedResult: -19},
15-
{num1: -1, num2: 2, operator: "-", expectedResult: -3},
16-
{num1: -10, num2: 2, operator: "-", expectedResult: -12},
17-
{num1: -1, num2: 20, operator: "-", expectedResult: -21},
18-
{num1: 0, num2: 0, operator: "-", expectedResult: 0},
19-
{num1: 00, num2: 0, operator: "-", expectedResult: 0},
20-
{num1: 0, num2: 00, operator: "-", expectedResult: 0},
21-
{num1: 0, num2: 0, operator: "+", expectedResult: 0},
22-
{num1: 00, num2: 0, operator: "+", expectedResult: 0},
23-
{num1: 0, num2: 00, operator: "+", expectedResult: 0},
24-
]
25-
.forEach(testData =>
26-
it("Valid two numbers addition/subtraction expression", function() {
27-
// given
28-
const expression = `${testData.num1}${testData.operator}${testData.num2}`;
29-
mathParser = new MathParser(expression);
9+
10+
singlePlusMinusOperationData.forEach(testData =>
11+
it("Valid two numbers addition/subtraction expression", function() {
12+
// given
13+
const expression = `${testData.num1}${testData.operator}${testData.num2}`;
14+
mathParser = new MathParser(expression);
3015

31-
// when
32-
const result = mathParser.parseExpression();
16+
// when
17+
const result = mathParser.parseExpression();
3318

34-
// then
35-
expect(result).toEqual(testData.expectedResult);
36-
})
37-
);
19+
// then
20+
expect(result).toEqual(testData.expectedResult);
21+
})
22+
);
23+
3824

39-
[
40-
{num1: 1, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: 6},
41-
{num1: 10, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: 15},
42-
{num1: 1, num2: 20, num3: 3, operator1: "+", operator2: "+", expectedResult: 24},
43-
{num1: 1, num2: 2, num3: 30, operator1: "+", operator2: "+", expectedResult: 33},
44-
{num1: -1, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: 4},
45-
{num1: -10, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: -5},
46-
{num1: -1, num2: 20, num3: 3, operator1: "+", operator2: "+", expectedResult: 22},
47-
{num1: -1, num2: 2, num3: 30, operator1: "+", operator2: "+", expectedResult: 31},
48-
{num1: 1, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: -4},
49-
{num1: 10, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: 5},
50-
{num1: 1, num2: 20, num3: 3, operator1: "-", operator2: "-", expectedResult: -22},
51-
{num1: 1, num2: 2, num3: 30, operator1: "-", operator2: "-", expectedResult: -31},
52-
{num1: -1, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: -6},
53-
{num1: -10, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: -15},
54-
{num1: -1, num2: 20, num3: 3, operator1: "-", operator2: "-", expectedResult: -24},
55-
{num1: -1, num2: 2, num3: 30, operator1: "-", operator2: "-", expectedResult: -33},
56-
{num1: 0, num2: 0, num3: 0, operator1: "-", operator2: "-", expectedResult: 0},
57-
{num1: 00, num2: 0, num3: 0, operator1: "-", operator2: "-", expectedResult: 0},
58-
{num1: 0, num2: 00, num3: 0, operator1: "-", operator2: "-", expectedResult: 0},
59-
{num1: 0, num2: 0, num3: 00, operator1: "-", operator2: "-", expectedResult: 0},
60-
{num1: 0, num2: 0, num3: 0, operator1: "+", operator2: "+", expectedResult: 0},
61-
{num1: 00, num2: 0, num3: 0, operator1: "+", operator2: "+", expectedResult: 0},
62-
{num1: 0, num2: 00, num3: 0, operator1: "+", operator2: "+", expectedResult: 0},
63-
{num1: 0, num2: 0, num3: 00, operator1: "+", operator2: "+", expectedResult: 0},
64-
{num1: 1, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: 0},
65-
{num1: 10, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: 9},
66-
{num1: 1, num2: 20, num3: 3, operator1: "+", operator2: "-", expectedResult: 18},
67-
{num1: 1, num2: 2, num3: 30, operator1: "+", operator2: "-", expectedResult: -27},
68-
{num1: -1, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: -2},
69-
{num1: -10, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: -11},
70-
{num1: -1, num2: 20, num3: 3, operator1: "+", operator2: "-", expectedResult: 16},
71-
{num1: -1, num2: 2, num3: 30, operator1: "+", operator2: "-", expectedResult: -29},
72-
{num1: 1, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: 2},
73-
{num1: 10, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: 11},
74-
{num1: 1, num2: 20, num3: 3, operator1: "-", operator2: "+", expectedResult: -16},
75-
{num1: 1, num2: 2, num3: 30, operator1: "-", operator2: "+", expectedResult: 29},
76-
{num1: -1, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: 0},
77-
{num1: -10, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: -9},
78-
{num1: -1, num2: 20, num3: 3, operator1: "-", operator2: "+", expectedResult: -18},
79-
{num1: -1, num2: 2, num3: 30, operator1: "-", operator2: "+", expectedResult: 27},
80-
]
81-
.forEach(testData =>
82-
it("Valid three numbers addition/subtraction expression", function() {
83-
// given
84-
const expression = `${testData.num1}${testData.operator1}${testData.num2}${testData.operator2}${testData.num3}`;
85-
mathParser = new MathParser(expression);
25+
doublePlusMinusOperationData.forEach(testData =>
26+
it("Valid three numbers addition/subtraction expression", function() {
27+
// given
28+
const expression = `${testData.num1}${testData.operator1}${testData.num2}${testData.operator2}${testData.num3}`;
29+
mathParser = new MathParser(expression);
8630

87-
// when
88-
const result = mathParser.parseExpression()
31+
// when
32+
const result = mathParser.parseExpression()
8933

90-
// then
91-
expect(result).toEqual(testData.expectedResult);
92-
})
93-
);
34+
// then
35+
expect(result).toEqual(testData.expectedResult);
36+
})
37+
);
9438

95-
[
96-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "+", expectedResult: 10},
97-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "+", expectedResult: 8},
98-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "+", expectedResult: 6},
99-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "+", expectedResult: 4},
100-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "+", expectedResult: 4},
101-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "+", expectedResult: 2},
102-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "-", expectedResult: 2},
103-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "-", expectedResult: 0},
104-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "+", expectedResult: 0},
105-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "+", expectedResult: -2},
106-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "-", expectedResult: -2},
107-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "-", expectedResult: -4},
108-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "-", expectedResult: -4},
109-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "-", expectedResult: -6},
110-
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "-", expectedResult: -8},
111-
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "-", expectedResult: -10},
112-
{num1: 0, num2: 0, num3: 0, num4: 0, operator1: "+", operator2: "+", operator3: "+", expectedResult: 0},
113-
{num1: 0, num2: 0, num3: 0, num4: 0, operator1: "-", operator2: "-", operator3: "-", expectedResult: 0},
114-
]
115-
.forEach(testData =>
116-
it("Valid four numbers addition/subtraction expression", function() {
117-
// given
118-
const expression = `${testData.num1}${testData.operator1}${testData.num2}${testData.operator2}${testData.num3}${testData.operator3}${testData.num4}`;
119-
mathParser = new MathParser(expression);
39+
40+
triplePlusMinusOperationData.forEach(testData =>
41+
it("Valid four numbers addition/subtraction expression", function() {
42+
// given
43+
const expression = `${testData.num1}${testData.operator1}${testData.num2}${testData.operator2}${testData.num3}${testData.operator3}${testData.num4}`;
44+
mathParser = new MathParser(expression);
12045

121-
// when
122-
const result = mathParser.parseExpression();
46+
// when
47+
const result = mathParser.parseExpression();
12348

124-
// then
125-
expect(result).toEqual(testData.expectedResult);
126-
})
127-
);
49+
// then
50+
expect(result).toEqual(testData.expectedResult);
51+
})
52+
);
12853

129-
[
130-
{num1: 1, num2: 2, operator: "*", expectedResult: 2},
131-
{num1: -1, num2: 2, operator: "*", expectedResult: -2},
132-
{num1: 10, num2: 2, operator: "*", expectedResult: 20},
133-
{num1: -10, num2: 2, operator: "*", expectedResult: -20},
134-
{num1: 1, num2: 20, operator: "*", expectedResult: 20},
135-
{num1: -1, num2: 20, operator: "*", expectedResult: -20},
136-
]
137-
.forEach(testData =>
138-
it("Valid two numbers multiplication expression", function() {
139-
// given
140-
const expression = `${testData.num1}${testData.operator}${testData.num2}`;
141-
mathParser = new MathParser(expression);
54+
55+
singleMultiplyDivideOperationData.forEach(testData =>
56+
it("Valid two numbers multiplication/division expression", function() {
57+
// given
58+
const expression = `${testData.num1}${testData.operator}${testData.num2}`;
59+
mathParser = new MathParser(expression);
14260

143-
// when
144-
const result = mathParser.parseExpression();
61+
// when
62+
const result = mathParser.parseExpression();
14563

146-
// then
147-
expect(result).toEqual(testData.expectedResult);
148-
})
149-
);
64+
// then
65+
expect(result).toEqual(testData.expectedResult);
66+
})
67+
);
15068

15169
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
module.exports.singlePlusMinusOperationData = [
2+
{num1: 1, num2: 2, operator: "+", expectedResult: 3},
3+
{num1: 10, num2: 2, operator: "+", expectedResult: 12},
4+
{num1: 1, num2: 20, operator: "+", expectedResult: 21},
5+
{num1: -1, num2: 2, operator: "+", expectedResult: 1},
6+
{num1: -10, num2: 2, operator: "+", expectedResult: -8},
7+
{num1: -1, num2: 20, operator: "+", expectedResult: 19},
8+
{num1: 1, num2: 2, operator: "-", expectedResult: -1},
9+
{num1: 10, num2: 2, operator: "-", expectedResult: 8},
10+
{num1: 1, num2: 20, operator: "-", expectedResult: -19},
11+
{num1: -1, num2: 2, operator: "-", expectedResult: -3},
12+
{num1: -10, num2: 2, operator: "-", expectedResult: -12},
13+
{num1: -1, num2: 20, operator: "-", expectedResult: -21},
14+
{num1: 0, num2: 0, operator: "-", expectedResult: 0},
15+
{num1: 00, num2: 0, operator: "-", expectedResult: 0},
16+
{num1: 0, num2: 00, operator: "-", expectedResult: 0},
17+
{num1: 0, num2: 0, operator: "+", expectedResult: 0},
18+
{num1: 00, num2: 0, operator: "+", expectedResult: 0},
19+
{num1: 0, num2: 00, operator: "+", expectedResult: 0},
20+
];
21+
22+
module.exports.doublePlusMinusOperationData = [
23+
{num1: 1, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: 6},
24+
{num1: 10, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: 15},
25+
{num1: 1, num2: 20, num3: 3, operator1: "+", operator2: "+", expectedResult: 24},
26+
{num1: 1, num2: 2, num3: 30, operator1: "+", operator2: "+", expectedResult: 33},
27+
{num1: -1, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: 4},
28+
{num1: -10, num2: 2, num3: 3, operator1: "+", operator2: "+", expectedResult: -5},
29+
{num1: -1, num2: 20, num3: 3, operator1: "+", operator2: "+", expectedResult: 22},
30+
{num1: -1, num2: 2, num3: 30, operator1: "+", operator2: "+", expectedResult: 31},
31+
{num1: 1, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: -4},
32+
{num1: 10, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: 5},
33+
{num1: 1, num2: 20, num3: 3, operator1: "-", operator2: "-", expectedResult: -22},
34+
{num1: 1, num2: 2, num3: 30, operator1: "-", operator2: "-", expectedResult: -31},
35+
{num1: -1, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: -6},
36+
{num1: -10, num2: 2, num3: 3, operator1: "-", operator2: "-", expectedResult: -15},
37+
{num1: -1, num2: 20, num3: 3, operator1: "-", operator2: "-", expectedResult: -24},
38+
{num1: -1, num2: 2, num3: 30, operator1: "-", operator2: "-", expectedResult: -33},
39+
{num1: 0, num2: 0, num3: 0, operator1: "-", operator2: "-", expectedResult: 0},
40+
{num1: 00, num2: 0, num3: 0, operator1: "-", operator2: "-", expectedResult: 0},
41+
{num1: 0, num2: 00, num3: 0, operator1: "-", operator2: "-", expectedResult: 0},
42+
{num1: 0, num2: 0, num3: 00, operator1: "-", operator2: "-", expectedResult: 0},
43+
{num1: 0, num2: 0, num3: 0, operator1: "+", operator2: "+", expectedResult: 0},
44+
{num1: 00, num2: 0, num3: 0, operator1: "+", operator2: "+", expectedResult: 0},
45+
{num1: 0, num2: 00, num3: 0, operator1: "+", operator2: "+", expectedResult: 0},
46+
{num1: 0, num2: 0, num3: 00, operator1: "+", operator2: "+", expectedResult: 0},
47+
{num1: 1, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: 0},
48+
{num1: 10, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: 9},
49+
{num1: 1, num2: 20, num3: 3, operator1: "+", operator2: "-", expectedResult: 18},
50+
{num1: 1, num2: 2, num3: 30, operator1: "+", operator2: "-", expectedResult: -27},
51+
{num1: -1, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: -2},
52+
{num1: -10, num2: 2, num3: 3, operator1: "+", operator2: "-", expectedResult: -11},
53+
{num1: -1, num2: 20, num3: 3, operator1: "+", operator2: "-", expectedResult: 16},
54+
{num1: -1, num2: 2, num3: 30, operator1: "+", operator2: "-", expectedResult: -29},
55+
{num1: 1, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: 2},
56+
{num1: 10, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: 11},
57+
{num1: 1, num2: 20, num3: 3, operator1: "-", operator2: "+", expectedResult: -16},
58+
{num1: 1, num2: 2, num3: 30, operator1: "-", operator2: "+", expectedResult: 29},
59+
{num1: -1, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: 0},
60+
{num1: -10, num2: 2, num3: 3, operator1: "-", operator2: "+", expectedResult: -9},
61+
{num1: -1, num2: 20, num3: 3, operator1: "-", operator2: "+", expectedResult: -18},
62+
{num1: -1, num2: 2, num3: 30, operator1: "-", operator2: "+", expectedResult: 27},
63+
];
64+
65+
module.exports.triplePlusMinusOperationData = [
66+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "+", expectedResult: 10},
67+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "+", expectedResult: 8},
68+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "+", expectedResult: 6},
69+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "+", expectedResult: 4},
70+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "+", expectedResult: 4},
71+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "+", expectedResult: 2},
72+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "-", expectedResult: 2},
73+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "+", operator3: "-", expectedResult: 0},
74+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "+", expectedResult: 0},
75+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "+", expectedResult: -2},
76+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "-", expectedResult: -2},
77+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "+", operator3: "-", expectedResult: -4},
78+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "-", expectedResult: -4},
79+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "+", operator2: "-", operator3: "-", expectedResult: -6},
80+
{num1: 1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "-", expectedResult: -8},
81+
{num1: -1, num2: 2, num3: 3, num4: 4, operator1: "-", operator2: "-", operator3: "-", expectedResult: -10},
82+
{num1: 0, num2: 0, num3: 0, num4: 0, operator1: "+", operator2: "+", operator3: "+", expectedResult: 0},
83+
{num1: 0, num2: 0, num3: 0, num4: 0, operator1: "-", operator2: "-", operator3: "-", expectedResult: 0},
84+
];
85+
86+
module.exports.singleMultiplyDivideOperationData = [
87+
{num1: 1, num2: 2, operator: "*", expectedResult: 2},
88+
{num1: -1, num2: 2, operator: "*", expectedResult: -2},
89+
{num1: 10, num2: 2, operator: "*", expectedResult: 20},
90+
{num1: -10, num2: 2, operator: "*", expectedResult: -20},
91+
{num1: 1, num2: 20, operator: "*", expectedResult: 20},
92+
{num1: -1, num2: 20, operator: "*", expectedResult: -20},
93+
94+
{num1: 1, num2: 2, operator: "/", expectedResult: 0.5},
95+
{num1: -1, num2: 2, operator: "/", expectedResult: -0.5},
96+
{num1: 10, num2: 2, operator: "/", expectedResult: 5},
97+
{num1: -10, num2: 2, operator: "/", expectedResult: -5},
98+
{num1: 1, num2: 20, operator: "/", expectedResult: 0.05},
99+
{num1: -1, num2: 20, operator: "/", expectedResult: -0.05},
100+
];

0 commit comments

Comments
 (0)