var $suppress_errors = false;\r
var $last_error = null;\r
\r
- var $v = array('e'=>2.71,'pi'=>3.14); // variables (and constants)\r
+ var $v = array(); // variables (and constants)\r
var $f = array(); // user-defined functions\r
var $vb = array('e', 'pi'); // constants\r
var $fb = array( // built-in functions\r
'sum'=>array(-1), 'pi'=>array(0), 'power'=>array(2), 'round'=>array(2,1), 'average'=>array(-1));\r
\r
function EvalMath() {\r
- // make the variables a little more accurate\r
- $this->v['pi'] = pi();\r
- $this->v['e'] = exp(1);\r
}\r
\r
function e($expr) {\r
--- /dev/null
+<?php
+
+require_once $CFG->dirroot.'/lib/evalmath/evalmath.class.php';
+
+class calc_formula {
+
+ var $em;
+ var $nfx = false;
+ var $error = false;
+
+ function calc_formula($formula, $params=false) {
+ $this->em = new EvalMath();
+ $this->em->suppress_errors = true;
+ if (strpos($formula, '=') !== 0) {
+ $this->error = "missing '='";
+ return;
+ }
+ $formula = substr($formula, 1);
+ if (strpos($formula, '=') !== false) {
+ $this->error = "too many '='";
+ return;
+ }
+ $this->nfx = $this->em->nfx($formula);
+ if ($this->nfx == false) {
+ $this->error = $this->em->last_error;
+ return;
+ }
+ if ($params != false) {
+ $this->em->v = $params;
+ }
+ }
+
+ function set_params($params) {
+ $this->em->v = $params;
+ }
+
+ function evaluate() {
+ if ($this->nfx == false) {
+ return false;
+ }
+ $res = $this->em->pfx($this->nfx);
+ if ($res === false) {
+ $this->error = $this->em->last_error;
+ return false;
+ } else {
+ $this->error = false;
+ return $res;
+ }
+
+ }
+
+ function get_error() {
+ return $this->error;
+ }
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/* $Id$ */
+
+if (!defined('MOODLE_INTERNAL')) {
+ die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
+}
+
+global $CFG;
+require_once($CFG->libdir . '/simpletestlib.php');
+require_once($CFG->libdir . '/mathslib.php');
+
+class mathsslib_test extends UnitTestCase {
+
+ /**
+ * Tests the basic formula execition
+ */
+ function test__basic() {
+ $calc = new calc_formula('=1+2');
+ $res = $calc->evaluate();
+ $this->assertEqual($res, 3, '3+1 is: %s');
+ }
+
+ /**
+ * Tests the formula params
+ */
+ function test__params() {
+ $calc = new calc_formula('=a+b+c', array('a'=>10,'b'=>20,'c'=>30));
+ $res = $calc->evaluate();
+ $this->assertEqual($res, 60, '10+20+30 is: %s');
+ }
+
+ /**
+ * Tests the formula params
+ */
+ function test__calc_function() {
+ $calc = new calc_formula('=sum(a,b,c)', array('a'=>10,'b'=>20,'c'=>30));
+ $res = $calc->evaluate();
+ $this->assertEqual($res, 60, 'sum(a,b,c) is: %s');
+ }
+
+ /**
+ * Tests the formula changed params
+ */
+ function test__changing_params() {
+ $calc = new calc_formula('=a+b+c', array('a'=>10,'b'=>20,'c'=>30));
+ $res = $calc->evaluate();
+ $this->assertEqual($res, 60, '10+20+30 is: %s');
+ $calc->set_params(array('a'=>1,'b'=>2,'c'=>3));
+ $res = $calc->evaluate();
+ $this->assertEqual($res, 6, '1+2+3 is: %s');
+ }
+
+}
+
+?>
\ No newline at end of file