From 9a61734fb79052bfda6f55b3ab9d60a6a30a2fc2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Sat, 12 Oct 2013 17:34:15 +0200 Subject: [PATCH] FormOptions: Implement FLOAT type Also added WebRequest#getFloat(). Change-Id: I854f09bd26287880a2806852274471904bc33092 --- includes/FormOptions.php | 35 +++++++++++++++++----- includes/WebRequest.php | 14 +++++++++ tests/phpunit/includes/FormOptionsTest.php | 9 ++++++ 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/includes/FormOptions.php b/includes/FormOptions.php index 54822e3271..cd6e207231 100644 --- a/includes/FormOptions.php +++ b/includes/FormOptions.php @@ -4,6 +4,7 @@ * * Copyright © 2008, Niklas Laxström * Copyright © 2011, Antoine Musso + * Copyright © 2013, Bartosz Dziewoński * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -42,6 +43,9 @@ class FormOptions implements ArrayAccess { const STRING = 0; /** Integer type, maps guessType() to WebRequest::getInt() */ const INT = 1; + /** Float type, maps guessType() to WebRequest::getFloat() + * @since 1.23 */ + const FLOAT = 4; /** Boolean type, maps guessType() to WebRequest::getBool() */ const BOOL = 2; /** Integer type or null, maps to WebRequest::getIntOrNull() @@ -112,6 +116,8 @@ class FormOptions implements ArrayAccess { return self::BOOL; } elseif ( is_int( $data ) ) { return self::INT; + } elseif ( is_float( $data ) ) { + return self::FLOAT; } elseif ( is_string( $data ) ) { return self::STRING; } else { @@ -234,19 +240,29 @@ class FormOptions implements ArrayAccess { } /** - * Validate and set an option integer value - * The value will be altered to fit in the range. + * @see validateBounds() + */ + public function validateIntBounds( $name, $min, $max ) { + $this->validateBounds( $name, $min, $max ); + } + + /** + * Constrain a numeric value for a given option to a given range. The value will be altered to fit + * in the range. * - * @param string $name option name - * @param int $min minimum value - * @param int $max maximum value + * @since 1.23 + * + * @param string $name Option name + * @param int|float $min Minimum value + * @param int|float $max Maximum value * @throws MWException If option is not of type INT */ - public function validateIntBounds( $name, $min, $max ) { + public function validateBounds( $name, $min, $max ) { $this->validateName( $name, true ); + $type = $this->options[$name]['type']; - if ( $this->options[$name]['type'] !== self::INT ) { - throw new MWException( "Option $name is not of type int" ); + if ( $type !== self::INT && $type !== self::FLOAT ) { + throw new MWException( "Option $name is not of type INT or FLOAT" ); } $value = $this->getValueReal( $this->options[$name] ); @@ -333,6 +349,9 @@ class FormOptions implements ArrayAccess { case self::INT: $value = $r->getInt( $name, $default ); break; + case self::FLOAT: + $value = $r->getFloat( $name, $default ); + break; case self::STRING: $value = $r->getText( $name, $default ); break; diff --git a/includes/WebRequest.php b/includes/WebRequest.php index 462b312114..4ad7344f37 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -480,6 +480,20 @@ class WebRequest { : null; } + /** + * Fetch a floating point value from the input or return $default if not set. + * Guaranteed to return a float; non-numeric input will typically + * return 0. + * + * @since 1.23 + * @param $name String + * @param $default Float + * @return Float + */ + public function getFloat( $name, $default = 0 ) { + return floatval( $this->getVal( $name, $default ) ); + } + /** * Fetch a boolean value from the input or return $default if not set. * Guaranteed to return true or false, with normal PHP semantics for diff --git a/tests/phpunit/includes/FormOptionsTest.php b/tests/phpunit/includes/FormOptionsTest.php index 08d6ba8956..665fa39017 100644 --- a/tests/phpunit/includes/FormOptionsTest.php +++ b/tests/phpunit/includes/FormOptionsTest.php @@ -34,6 +34,7 @@ class FormOptionsTest extends MediaWikiTestCase { $this->object->add( 'string1', 'string one' ); $this->object->add( 'string2', 'string two' ); $this->object->add( 'integer', 0 ); + $this->object->add( 'float', 0.0 ); $this->object->add( 'intnull', 0, FormOptions::INTNULL ); } @@ -45,6 +46,9 @@ class FormOptionsTest extends MediaWikiTestCase { private function assertGuessInt( $data ) { $this->guess( FormOptions::INT, $data ); } + private function assertGuessFloat( $data ) { + $this->guess( FormOptions::FLOAT, $data ); + } private function assertGuessString( $data ) { $this->guess( FormOptions::STRING, $data ); } @@ -71,10 +75,15 @@ class FormOptionsTest extends MediaWikiTestCase { $this->assertGuessInt( 5 ); $this->assertGuessInt( 0x0F ); + $this->assertGuessFloat( 0.0 ); + $this->assertGuessFloat( 1.5 ); + $this->assertGuessFloat( 1e3 ); + $this->assertGuessString( 'true' ); $this->assertGuessString( 'false' ); $this->assertGuessString( '5' ); $this->assertGuessString( '0' ); + $this->assertGuessString( '1.5' ); } /** -- 2.20.1