-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRpnEvaluation.test.ts
104 lines (87 loc) · 3.15 KB
/
RpnEvaluation.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { Token, TokenType, UnaryOperation, Binary } from "../Types";
import { rpnEvaluator } from "../RPNEvaluator";
describe("rpnEvaluator", () => {
it("should evaluate a simple addition in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "3" },
{ type: TokenType.Number, value: "4" },
{ type: TokenType.Binary, value: "+" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("7");
});
it("should evaluate a simple subtraction in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "10" },
{ type: TokenType.Number, value: "4" },
{ type: TokenType.Binary, value: "-" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("6");
});
it("should evaluate a simple multiplication in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "2" },
{ type: TokenType.Number, value: "5" },
{ type: TokenType.Binary, value: "*" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("10");
});
it("should evaluate a complex expression in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "5" },
{ type: TokenType.Number, value: "1" },
{ type: TokenType.Number, value: "2" },
{ type: TokenType.Binary, value: "+" },
{ type: TokenType.Binary, value: "*" },
{ type: TokenType.Number, value: "4" },
{ type: TokenType.Binary, value: "+" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("19");
});
it("should evaluate a unary operation in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "9" },
{ type: TokenType.Unary, value: "sqrt" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("3"); // sqrt(9) = 3
});
it("should evaluate a mixed unary and binary operation in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "16" },
{ type: TokenType.Unary, value: "sqrt" },
{ type: TokenType.Number, value: "2" },
{ type: TokenType.Binary, value: "*" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("8"); // sqrt(16) * 2 = 8
});
it("should handle division in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "10" },
{ type: TokenType.Number, value: "2" },
{ type: TokenType.Binary, value: "/" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual("5");
});
it("should evaluate an expression with right-associative operator in RPN", () => {
const tokens: Token[] = [
{ type: TokenType.Number, value: "2" },
{ type: TokenType.Number, value: "3" },
{ type: TokenType.Number, value: "4" },
{ type: TokenType.Binary, value: "**" },
{ type: TokenType.Binary, value: "**" },
];
const result = rpnEvaluator(tokens);
expect(result).toEqual((2 ** (3 ** 4)).toString()); // 2^(3^4)
});
it("should return 0 for empty input", () => {
const tokens: Token[] = [];
const result = rpnEvaluator(tokens);
expect(result).toEqual("0");
});
});