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
pub fn evaluate(expr: &str) -> Result<f32, &str> {
let mut stack:Vec<f32> = Vec::new();
for token in expr.split_whitespace() {
let wrapped_operand = token.parse::<f32>();
let is_operator = wrapped_operand.is_err();
if is_operator {
if stack.len() < 2 {
return Err("Unsufficient operands before operator");
}
let operand2 = stack.pop().expect("expected f32 values in stack");
let operand1 = stack.pop().expect("expected f32 values in stack");
let result = match token {
"+" => operand1 + operand2,
"-" => operand1 - operand2,
"*" => operand1 * operand2,
"/" => operand1 / operand2,
_ => return Err("Unsupported operator")
};
stack.push(result);
} else {
stack.push(wrapped_operand.unwrap());
}
}
if stack.len() != 1 {
return Err("Remaining untreated operands. Probably missing operator.");
}
return Ok(stack.pop().expect("expected a f32 value remaining in stack"));
}
#[test]
fn it_adds() {
let result = evaluate("1 2 +");
assert_eq!(result.unwrap(), 3.0);
}
#[test]
fn it_substracts() {
let result = evaluate("1 2 -");
assert_eq!(result.unwrap(), -1.0);
}
#[test]
fn it_multiplies() {
let result = evaluate("6 7 *");
assert_eq!(result.unwrap(), 42.0);
}
#[test]
fn it_divides() {
let result = evaluate("1 2 /");
assert_eq!(result.unwrap(), 0.5);
}
#[test]
fn it_evaluates_complex_expressions() {
let result = evaluate("1 2 + 8 * 5 1 - / 1 - 2 /");
assert_eq!(result.unwrap(), 2.5);
}
#[test]
fn it_allows_multiple_shitespaces() {
let result = evaluate("1 2 +\t3 -");
assert_eq!(result.unwrap(), 0.0);
}
#[test]
fn it_panics_for_unsupported_characters() {
let result = evaluate("1 2 t");
assert_eq!(result.unwrap_err(), "Unsupported operator");
}
#[test]
fn it_panics_for_unsufficient_operands() {
let result = evaluate("1 +");
assert_eq!(result.unwrap_err(), "Unsufficient operands before operator");
}
#[test]
fn it_panics_for_unsufficient_operators() {
let result = evaluate("1 2 3 +");
assert_eq!(result.unwrap_err(),
"Remaining untreated operands. Probably missing operator.");
}