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
mod operator;
mod postfix_calculator;

pub use self::operator::Operator;
pub use self::postfix_calculator::PostfixCalculator;

#[cfg(test)]
mod tests {
    use super::Operator;
    use super::PostfixCalculator;
    use std::collections::HashMap;
    use std::f64::INFINITY;

    #[test]
    fn it_adds() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["4", "2", "+"];
        assert_eq!(Ok(6.0), calculator.evaluate(&expression));
    }

    #[test]
    fn it_adds_3() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["1", "2", "3", "+", "+"];
        assert_eq!(Ok(6.0), calculator.evaluate(&expression));
    }

    #[test]
    fn it_subtracts() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["4", "2", "-"];
        assert_eq!(Ok(2.0), calculator.evaluate(&expression));
    }

    #[test]
    fn it_multiplies() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["4", "2", "*"];
        assert_eq!(Ok(8.0), calculator.evaluate(&expression));
    }

    #[test]
    fn it_divides() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["4", "2", "/"];
        assert_eq!(Ok(2.0), calculator.evaluate(&expression));
    }

    #[test]
    fn it_divides_by_zero() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["4", "0", "/"];
        assert_eq!(Ok(INFINITY), calculator.evaluate(&expression));
    }

    #[test]
    fn it_respects_precedence() {
        let calculator = PostfixCalculator::new();
        let expression = vec!["1", "2", "4", "+", "-"];
        assert_eq!(Ok(-5.0), calculator.evaluate(&expression));
    }

    #[test]
    fn it_uses_custom_operators() {
        let mut custom = HashMap::new();
        custom.insert("pow", Operator::binary(&|a: f64, b| Ok(a.powf(b))));
        let calculator = PostfixCalculator::with_operators(&custom).unwrap();
        let expression = vec!["1", "2", "4", "+", "-"];
        assert_eq!(Ok(-5.0), calculator.evaluate(&expression));
    }
}