Permalink
Browse files

Merge branch 'w31_MDL-34538_m23_validatefloats' of git://github.com/s…

…kodak/moodle into MOODLE_23_STABLE
  • Loading branch information...
2 parents af433c5 + 009933e commit acbbf4157d6f3375ea40239e9932c0b2509322cb @danpoltawski danpoltawski committed Jul 30, 2012
Showing with 61 additions and 2 deletions.
  1. +11 −2 lib/moodlelib.php
  2. +50 −0 lib/tests/moodlelib_test.php
View
@@ -661,7 +661,8 @@ function optional_param_array($parname, $default, $type) {
* @param string $type PARAM_ constant
* @param bool $allownull are nulls valid value?
* @param string $debuginfo optional debug information
- * @return mixed the $param value converted to PHP type or invalid_parameter_exception
+ * @return mixed the $param value converted to PHP type
+ * @throws invalid_parameter_exception if $param is not of given type
*/
function validate_param($param, $type, $allownull=NULL_NOT_ALLOWED, $debuginfo='') {
if (is_null($param)) {
@@ -676,7 +677,15 @@ function validate_param($param, $type, $allownull=NULL_NOT_ALLOWED, $debuginfo='
}
$cleaned = clean_param($param, $type);
- if ((string)$param !== (string)$cleaned) {
+
+ if ($type == PARAM_FLOAT) {
+ // Do not detect precision loss here.
+ if (is_float($param) or is_int($param)) {
+ // These always fit.
+ } else if (!is_numeric($param) or !preg_match('/^[\+-]?[0-9]*\.?[0-9]*(e[-+]?[0-9]+)?$/i', (string)$param)) {
+ throw new invalid_parameter_exception($debuginfo);
+ }
+ } else if ((string)$param !== (string)$cleaned) {
// conversion to string is usually lossless
throw new invalid_parameter_exception($debuginfo);
}
@@ -912,6 +912,56 @@ function test_validate_param() {
} catch (invalid_parameter_exception $ex) {
$this->assertTrue(true);
}
+ try {
+ $param = validate_param('1.0', PARAM_FLOAT);
+ $this->assertSame(1.0, $param);
+
+ // Make sure valid floats do not cause exception.
+ validate_param(1.0, PARAM_FLOAT);
+ validate_param(10, PARAM_FLOAT);
+ validate_param('0', PARAM_FLOAT);
+ validate_param('119813454.545464564564546564545646556564465465456465465465645645465645645645', PARAM_FLOAT);
+ validate_param('011.1', PARAM_FLOAT);
+ validate_param('11', PARAM_FLOAT);
+ validate_param('+.1', PARAM_FLOAT);
+ validate_param('-.1', PARAM_FLOAT);
+ validate_param('1e10', PARAM_FLOAT);
+ validate_param('.1e+10', PARAM_FLOAT);
+ validate_param('1E-1', PARAM_FLOAT);
+ $this->assertTrue(true);
+ } catch (invalid_parameter_exception $ex) {
+ $this->fail('Valid float notation not accepted');
+ }
+ try {
+ $param = validate_param('1,2', PARAM_FLOAT);
+ $this->fail('invalid_parameter_exception expected');
+ } catch (invalid_parameter_exception $ex) {
+ $this->assertTrue(true);
+ }
+ try {
+ $param = validate_param('', PARAM_FLOAT);
+ $this->fail('invalid_parameter_exception expected');
+ } catch (invalid_parameter_exception $ex) {
+ $this->assertTrue(true);
+ }
+ try {
+ $param = validate_param('.', PARAM_FLOAT);
+ $this->fail('invalid_parameter_exception expected');
+ } catch (invalid_parameter_exception $ex) {
+ $this->assertTrue(true);
+ }
+ try {
+ $param = validate_param('e10', PARAM_FLOAT);
+ $this->fail('invalid_parameter_exception expected');
+ } catch (invalid_parameter_exception $ex) {
+ $this->assertTrue(true);
+ }
+ try {
+ $param = validate_param('abc', PARAM_FLOAT);
+ $this->fail('invalid_parameter_exception expected');
+ } catch (invalid_parameter_exception $ex) {
+ $this->assertTrue(true);
+ }
}
function test_shorten_text() {

0 comments on commit acbbf41

Please sign in to comment.