|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 // This file is part of Moodle - http://moodle.org/ 00003 // 00004 // Moodle is free software: you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation, either version 3 of the License, or 00007 // (at your option) any later version. 00008 // 00009 // Moodle is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU General Public License 00015 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00016 if (!defined('MOODLE_INTERNAL')) { 00017 die('Direct access to this script is forbidden.'); 00018 } 00019 00020 require_once($CFG->libdir . '/mathslib.php'); 00021 00028 class mathsslib_test extends UnitTestCase { 00029 00030 public static $includecoverage = array('lib/mathslib.php'); 00031 00035 public function test__basic() { 00036 $formula = new calc_formula('=1+2'); 00037 $res = $formula->evaluate(); 00038 $this->assertEqual($res, 3, '3+1 is: %s'); 00039 } 00040 00044 public function test__params() { 00045 $formula = new calc_formula('=a+b+c', array('a'=>10, 'b'=>20, 'c'=>30)); 00046 $res = $formula->evaluate(); 00047 $this->assertEqual($res, 60, '10+20+30 is: %s'); 00048 } 00049 00053 public function test__changing_params() { 00054 $formula = new calc_formula('=a+b+c', array('a'=>10, 'b'=>20, 'c'=>30)); 00055 $res = $formula->evaluate(); 00056 $this->assertEqual($res, 60, '10+20+30 is: %s'); 00057 $formula->set_params(array('a'=>1, 'b'=>2, 'c'=>3)); 00058 $res = $formula->evaluate(); 00059 $this->assertEqual($res, 6, 'changed params 1+2+3 is: %s'); 00060 } 00061 00065 public function test__calc_function() { 00066 $formula = new calc_formula('=sum(a, b, c)', array('a'=>10, 'b'=>20, 'c'=>30)); 00067 $res = $formula->evaluate(); 00068 $this->assertEqual($res, 60, 'sum(a, b, c) is: %s'); 00069 } 00070 00071 public function test_other_functions() { 00072 $formula = new calc_formula('=average(1,2,3)'); 00073 $this->assertEqual($formula->evaluate(), 2); 00074 00075 $formula = new calc_formula('=mod(10,3)'); 00076 $this->assertEqual($formula->evaluate(), 1); 00077 00078 $formula = new calc_formula('=power(2,3)'); 00079 $this->assertEqual($formula->evaluate(), 8); 00080 } 00081 00085 public function test__minmax_function() { 00086 $formula = new calc_formula('=min(a, b, c)', array('a'=>10, 'b'=>20, 'c'=>30)); 00087 $res = $formula->evaluate(); 00088 $this->assertEqual($res, 10, 'minimum is: %s'); 00089 $formula = new calc_formula('=max(a, b, c)', array('a'=>10, 'b'=>20, 'c'=>30)); 00090 $res = $formula->evaluate(); 00091 $this->assertEqual($res, 30, 'maximum is: %s'); 00092 } 00093 00097 public function test__specialchars() { 00098 $formula = new calc_formula('=gi1 + gi2 + gi11', array('gi1'=>10, 'gi2'=>20, 'gi11'=>30)); 00099 $res = $formula->evaluate(); 00100 $this->assertEqual($res, 60, 'sum is: %s'); 00101 } 00102 00106 public function test__more_complex_expressions() { 00107 $formula = new calc_formula('=pi() + a', array('a'=>10)); 00108 $res = $formula->evaluate(); 00109 $this->assertEqual($res, pi()+10); 00110 $formula = new calc_formula('=pi()^a', array('a'=>10)); 00111 $res = $formula->evaluate(); 00112 $this->assertEqual($res, pow(pi(), 10)); 00113 $formula = new calc_formula('=-8*(5/2)^2*(1-sqrt(4))-8'); 00114 $res = $formula->evaluate(); 00115 $this->assertEqual($res, -8*pow((5/2), 2)*(1-sqrt(4))-8); 00116 } 00117 00121 public function test__error_handling() { 00122 if (debugging('', DEBUG_DEVELOPER)) { 00123 $this->expectError(); 00124 } 00125 $formula = new calc_formula('=pi( + a', array('a'=>10)); 00126 $res = $formula->evaluate(); 00127 $this->assertEqual($res, false); 00128 $this->assertEqual($formula->get_error(), 00129 get_string('unexpectedoperator', 'mathslib', '+')); 00130 00131 if (debugging('', DEBUG_DEVELOPER)) { 00132 $this->expectError(); 00133 } 00134 $formula = new calc_formula('=pi('); 00135 $res = $formula->evaluate(); 00136 $this->assertEqual($res, false); 00137 $this->assertEqual($formula->get_error(), 00138 get_string('expectingaclosingbracket', 'mathslib')); 00139 00140 if (debugging('', DEBUG_DEVELOPER)) { 00141 $this->expectError(); 00142 } 00143 $formula = new calc_formula('=pi()^'); 00144 $res = $formula->evaluate(); 00145 $this->assertEqual($res, false); 00146 $this->assertEqual($formula->get_error(), 00147 get_string('operatorlacksoperand', 'mathslib', '^')); 00148 00149 } 00150 00151 public function test_rounding_function() { 00152 $formula = new calc_formula('=round(2.5)'); 00153 $this->assertEqual($formula->evaluate(), 3); 00154 00155 $formula = new calc_formula('=round(1.5)'); 00156 $this->assertEqual($formula->evaluate(), 2); 00157 00158 $formula = new calc_formula('=round(-1.49)'); 00159 $this->assertEqual($formula->evaluate(), -1); 00160 00161 $formula = new calc_formula('=round(-2.49)'); 00162 $this->assertEqual($formula->evaluate(), -2); 00163 00164 $formula = new calc_formula('=round(-1.5)'); 00165 $this->assertEqual($formula->evaluate(), -2); 00166 00167 $formula = new calc_formula('=round(-2.5)'); 00168 $this->assertEqual($formula->evaluate(), -3); 00169 00170 $formula = new calc_formula('=ceil(2.5)'); 00171 $this->assertEqual($formula->evaluate(), 3); 00172 00173 $formula = new calc_formula('=ceil(1.5)'); 00174 $this->assertEqual($formula->evaluate(), 2); 00175 00176 $formula = new calc_formula('=ceil(-1.49)'); 00177 $this->assertEqual($formula->evaluate(), -1); 00178 00179 $formula = new calc_formula('=ceil(-2.49)'); 00180 $this->assertEqual($formula->evaluate(), -2); 00181 00182 $formula = new calc_formula('=ceil(-1.5)'); 00183 $this->assertEqual($formula->evaluate(), -1); 00184 00185 $formula = new calc_formula('=ceil(-2.5)'); 00186 $this->assertEqual($formula->evaluate(), -2); 00187 00188 $formula = new calc_formula('=floor(2.5)'); 00189 $this->assertEqual($formula->evaluate(), 2); 00190 00191 $formula = new calc_formula('=floor(1.5)'); 00192 $this->assertEqual($formula->evaluate(), 1); 00193 00194 $formula = new calc_formula('=floor(-1.49)'); 00195 $this->assertEqual($formula->evaluate(), -2); 00196 00197 $formula = new calc_formula('=floor(-2.49)'); 00198 $this->assertEqual($formula->evaluate(), -3); 00199 00200 $formula = new calc_formula('=floor(-1.5)'); 00201 $this->assertEqual($formula->evaluate(), -2); 00202 00203 $formula = new calc_formula('=floor(-2.5)'); 00204 $this->assertEqual($formula->evaluate(), -3); 00205 00206 } 00207 00208 public function test_scientific_notation() { 00209 $formula = new calc_formula('=10e10'); 00210 $this->assertWithinMargin($formula->evaluate(), 1e11, 1e11*1e-15); 00211 00212 $formula = new calc_formula('=10e-10'); 00213 $this->assertWithinMargin($formula->evaluate(), 1e-9, 1e11*1e-15); 00214 00215 $formula = new calc_formula('=10e+10'); 00216 $this->assertWithinMargin($formula->evaluate(), 1e11, 1e11*1e-15); 00217 00218 $formula = new calc_formula('=10e10*5'); 00219 $this->assertWithinMargin($formula->evaluate(), 5e11, 1e11*1e-15); 00220 00221 $formula = new calc_formula('=10e10^2'); 00222 $this->assertWithinMargin($formula->evaluate(), 1e22, 1e22*1e-15); 00223 00224 } 00225 00226 00227 00228 } 00229 00230