a17bd0a4390a133f670a6ac522e660a4cb67cb29
[moodle.git] / lib / simpletest / testmathslib.php
1 <?php
3 if (!defined('MOODLE_INTERNAL')) {
4     die('Direct access to this script is forbidden.');    ///  It must be included from a Moodle page
5 }
7 require_once($CFG->libdir . '/mathslib.php');
9 /**
10  * Unit tests of mathslib wrapper and underlying EvalMath library.
11  *
12  * @author Petr Skoda (skodak)
13  * @version $Id$
14  */
15 class mathsslib_test extends UnitTestCase {
17     public static $includecoverage = array('lib/mathslib.php');
19     /**
20      * Tests the basic formula evaluation
21      */
22     function test__basic() {
23         $formula = new calc_formula('=1+2');
24         $res = $formula->evaluate();
25         $this->assertEqual($res, 3, '3+1 is: %s');
26     }
28     /**
29      * Tests the formula params
30      */
31     function test__params() {
32         $formula = new calc_formula('=a+b+c', array('a'=>10,'b'=>20,'c'=>30));
33         $res = $formula->evaluate();
34         $this->assertEqual($res, 60, '10+20+30 is: %s');
35     }
37     /**
38      * Tests the changed params
39      */
40     function test__changing_params() {
41         $formula = new calc_formula('=a+b+c', array('a'=>10,'b'=>20,'c'=>30));
42         $res = $formula->evaluate();
43         $this->assertEqual($res, 60, '10+20+30 is: %s');
44         $formula->set_params(array('a'=>1,'b'=>2,'c'=>3));
45         $res = $formula->evaluate();
46         $this->assertEqual($res, 6, 'changed params 1+2+3 is: %s');
47     }
49     /**
50      * Tests the spreadsheet emulation function in formula
51      */
52     function test__calc_function() {
53         $formula = new calc_formula('=sum(a,b,c)', array('a'=>10,'b'=>20,'c'=>30));
54         $res = $formula->evaluate();
55         $this->assertEqual($res, 60, 'sum(a,b,c) is: %s');
56     }
58     /**
59      * Tests the min and max functions
60      */
61     function test__minmax_function() {
62         $formula = new calc_formula('=min(a,b,c)', array('a'=>10,'b'=>20,'c'=>30));
63         $res = $formula->evaluate();
64         $this->assertEqual($res, 10, 'minimum is: %s');
65         $formula = new calc_formula('=max(a,b,c)', array('a'=>10,'b'=>20,'c'=>30));
66         $res = $formula->evaluate();
67         $this->assertEqual($res, 30, 'maximum is: %s');
68     }
70     /**
71      * Tests special chars
72      */
73     function test__specialchars() {
74         $formula = new calc_formula('=gi1 + gi2 + gi11', array('gi1'=>10,'gi2'=>20,'gi11'=>30));
75         $res = $formula->evaluate();
76         $this->assertEqual($res, 60, 'sum is: %s');
77     }
79     /**
80      * Tests some slightly more complex expressions
81      */
82     function test__more_complex_expressions() {
83         $formula = new calc_formula('=pi() + a', array('a'=>10));
84         $res = $formula->evaluate();
85         $this->assertEqual($res, pi()+10);
86         $formula = new calc_formula('=pi()^a', array('a'=>10));
87         $res = $formula->evaluate();
88         $this->assertEqual($res, pow(pi(),10));
89         $formula = new calc_formula('=-8*(5/2)^2*(1-sqrt(4))-8');
90         $res = $formula->evaluate();
91         $this->assertEqual($res, -8*pow((5/2),2)*(1-sqrt(4))-8);
92     }
94     /**
95      * Tests some slightly more complex expressions
96      */
97     function test__error_handling() {
98         if (debugging('', DEBUG_DEVELOPER)){
99             $this->expectError();
100         }
101         $formula = new calc_formula('=pi( + a', array('a'=>10));
102         $res = $formula->evaluate();
103         $this->assertEqual($res, false);
104         $this->assertEqual($formula->get_error(), get_string('unexpectedoperator', 'mathslib', '+'));
106         if (debugging('', DEBUG_DEVELOPER)){
107             $this->expectError();
108         }
109         $formula = new calc_formula('=pi(');
110         $res = $formula->evaluate();
111         $this->assertEqual($res, false);
112         $this->assertEqual($formula->get_error(), get_string('expectingaclosingbracket', 'mathslib'));
114         if (debugging('', DEBUG_DEVELOPER)){
115             $this->expectError();
116         }
117         $formula = new calc_formula('=pi()^');
118         $res = $formula->evaluate();
119         $this->assertEqual($res, false);
120         $this->assertEqual($formula->get_error(), get_string('operatorlacksoperand', 'mathslib', '^'));
122     }
124     function test_rounding_function() {
125         $formula = new calc_formula('=round(2.5)');
126         $this->assertEqual($formula->evaluate(), 3);
128         $formula = new calc_formula('=round(1.5)');
129         $this->assertEqual($formula->evaluate(), 2);
131         $formula = new calc_formula('=round(-1.49)');
132         $this->assertEqual($formula->evaluate(), -1);
134         $formula = new calc_formula('=round(-2.49)');
135         $this->assertEqual($formula->evaluate(), -2);
137         $formula = new calc_formula('=round(-1.5)');
138         $this->assertEqual($formula->evaluate(), -2);
140         $formula = new calc_formula('=round(-2.5)');
141         $this->assertEqual($formula->evaluate(), -3);
144         $formula = new calc_formula('=ceil(2.5)');
145         $this->assertEqual($formula->evaluate(), 3);
147         $formula = new calc_formula('=ceil(1.5)');
148         $this->assertEqual($formula->evaluate(), 2);
150         $formula = new calc_formula('=ceil(-1.49)');
151         $this->assertEqual($formula->evaluate(), -1);
153         $formula = new calc_formula('=ceil(-2.49)');
154         $this->assertEqual($formula->evaluate(), -2);
156         $formula = new calc_formula('=ceil(-1.5)');
157         $this->assertEqual($formula->evaluate(), -1);
159         $formula = new calc_formula('=ceil(-2.5)');
160         $this->assertEqual($formula->evaluate(), -2);
163         $formula = new calc_formula('=floor(2.5)');
164         $this->assertEqual($formula->evaluate(), 2);
166         $formula = new calc_formula('=floor(1.5)');
167         $this->assertEqual($formula->evaluate(), 1);
169         $formula = new calc_formula('=floor(-1.49)');
170         $this->assertEqual($formula->evaluate(), -2);
172         $formula = new calc_formula('=floor(-2.49)');
173         $this->assertEqual($formula->evaluate(), -3);
175         $formula = new calc_formula('=floor(-1.5)');
176         $this->assertEqual($formula->evaluate(), -2);
178         $formula = new calc_formula('=floor(-2.5)');
179         $this->assertEqual($formula->evaluate(), -3);
181     }