From 680b19a1da75aa940da4ce4283710eff337139c6 Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Thu, 27 Aug 2015 13:10:48 +1200 Subject: [PATCH 1/9] FIX: Correct PHP4-style constructors in SimpleTest. Note that the best solution to this will be to remove the use of SimpleTest entirely. This is quick fix is intended to help us get PHP7 tests running without needing to cross that bridge. --- thirdparty/simpletest/cookies.php | 4 +- thirdparty/simpletest/encoding.php | 18 +++---- thirdparty/simpletest/form.php | 2 +- thirdparty/simpletest/http.php | 14 +++--- thirdparty/simpletest/page.php | 7 ++- thirdparty/simpletest/parser.php | 14 +++--- thirdparty/simpletest/selector.php | 8 ++-- thirdparty/simpletest/socket.php | 10 ++-- thirdparty/simpletest/tag.php | 75 +++++++++++++++--------------- thirdparty/simpletest/url.php | 2 +- 10 files changed, 76 insertions(+), 78 deletions(-) diff --git a/thirdparty/simpletest/cookies.php b/thirdparty/simpletest/cookies.php index f462e1b674b..0b46a108ee9 100644 --- a/thirdparty/simpletest/cookies.php +++ b/thirdparty/simpletest/cookies.php @@ -36,7 +36,7 @@ class SimpleCookie { * @param string $expiry Expiry date as string. * @param boolean $is_secure Currently ignored. */ - function SimpleCookie($name, $value = false, $path = false, $expiry = false, $is_secure = false) { + function __construct($name, $value = false, $path = false, $expiry = false, $is_secure = false) { $this->_host = false; $this->_name = $name; $this->_value = $value; @@ -232,7 +232,7 @@ class SimpleCookieJar { * Constructor. Jar starts empty. * @access public */ - function SimpleCookieJar() { + function __construct() { $this->_cookies = array(); } diff --git a/thirdparty/simpletest/encoding.php b/thirdparty/simpletest/encoding.php index 162d09eed6f..9b91bdf779b 100644 --- a/thirdparty/simpletest/encoding.php +++ b/thirdparty/simpletest/encoding.php @@ -26,7 +26,7 @@ class SimpleEncodedPair { * @param string $key Form element name. * @param string $value Data to send. */ - function SimpleEncodedPair($key, $value) { + function __construct($key, $value) { $this->_key = $key; $this->_value = $value; } @@ -97,7 +97,7 @@ class SimpleAttachment { * @param string $content Raw data. * @param hash $filename Original filename. */ - function SimpleAttachment($key, $content, $filename) { + function __construct($key, $content, $filename) { $this->_key = $key; $this->_content = $content; $this->_filename = $filename; @@ -198,7 +198,7 @@ class SimpleEncoding { * as lists on a single key. * @access public */ - function SimpleEncoding($query = false) { + function __construct($query = false) { if (! $query) { $query = array(); } @@ -390,8 +390,8 @@ class SimpleHeadEncoding extends SimpleGetEncoding { * as lists on a single key. * @access public */ - function SimpleHeadEncoding($query = false) { - $this->SimpleGetEncoding($query); + function __construct($query = false) { + parent::__construct($query); } /** @@ -419,11 +419,11 @@ class SimplePostEncoding extends SimpleEncoding { * as lists on a single key. * @access public */ - function SimplePostEncoding($query = false) { + function __construct($query = false) { if (is_array($query) and $this->hasMoreThanOneLevel($query)) { $query = $this->rewriteArrayWithMultipleLevels($query); } - $this->SimpleEncoding($query); + parent::__construct($query); } function hasMoreThanOneLevel($query) { @@ -509,8 +509,8 @@ class SimpleMultipartEncoding extends SimplePostEncoding { * as lists on a single key. * @access public */ - function SimpleMultipartEncoding($query = false, $boundary = false) { - $this->SimplePostEncoding($query); + function __construct($query = false, $boundary = false) { + parent::__construct($query); $this->_boundary = ($boundary === false ? uniqid('st') : $boundary); } diff --git a/thirdparty/simpletest/form.php b/thirdparty/simpletest/form.php index be85e2e019c..de17059491b 100644 --- a/thirdparty/simpletest/form.php +++ b/thirdparty/simpletest/form.php @@ -36,7 +36,7 @@ class SimpleForm { * @param SimpleTag $tag Form tag to read. * @param SimplePage $page Holding page. */ - function SimpleForm($tag, &$page) { + function __construct($tag, &$page) { $this->_method = $tag->getAttribute('method'); $this->_action = $this->_createAction($tag->getAttribute('action'), $page); $this->_encoding = $this->_setEncodingClass($tag); diff --git a/thirdparty/simpletest/http.php b/thirdparty/simpletest/http.php index 367504413ed..5f109e650f3 100644 --- a/thirdparty/simpletest/http.php +++ b/thirdparty/simpletest/http.php @@ -28,7 +28,7 @@ class SimpleRoute { * @param SimpleUrl $url URL as object. * @access public */ - function SimpleRoute($url) { + function __construct($url) { $this->_url = $url; } @@ -125,8 +125,8 @@ class SimpleProxyRoute extends SimpleRoute { * @param string $password Password for autentication. * @access public */ - function SimpleProxyRoute($url, $proxy, $username = false, $password = false) { - $this->SimpleRoute($url); + function __construct($url, $proxy, $username = false, $password = false) { + parent::__construct($url); $this->_proxy = $proxy; $this->_username = $username; $this->_password = $password; @@ -208,7 +208,7 @@ class SimpleHttpRequest { * request. * @access public */ - function SimpleHttpRequest(&$route, $encoding) { + function __construct(&$route, $encoding) { $this->_route = &$route; $this->_encoding = $encoding; $this->_headers = array(); @@ -307,7 +307,7 @@ class SimpleHttpHeaders { * @param string $headers Header block. * @access public */ - function SimpleHttpHeaders($headers) { + function __construct($headers) { $this->_raw_headers = $headers; $this->_response_code = false; $this->_http_version = false; @@ -494,8 +494,8 @@ class SimpleHttpResponse extends SimpleStickyError { * @param mixed $encoding Record of content sent. * @access public */ - function SimpleHttpResponse(&$socket, $url, $encoding) { - $this->SimpleStickyError(); + function __construct(&$socket, $url, $encoding) { + parent::__construct(); $this->_url = $url; $this->_encoding = $encoding; $this->_sent = $socket->getSent(); diff --git a/thirdparty/simpletest/page.php b/thirdparty/simpletest/page.php index add42237193..c1e08957dc8 100644 --- a/thirdparty/simpletest/page.php +++ b/thirdparty/simpletest/page.php @@ -127,10 +127,9 @@ class SimplePageBuilder extends SimpleSaxListener { * Sets the builder up empty. * @access public */ - function SimplePageBuilder() { - $this->SimpleSaxListener(); + function __construct() { + parent::__construct(); } - /** * Frees up any references so as to allow the PHP garbage * collection from unset() to work. @@ -358,7 +357,7 @@ class SimplePage { * @param SimpleHttpResponse $response Result of HTTP fetch. * @access public */ - function SimplePage($response = false) { + function __construct($response = false) { $this->_links = array(); $this->_title = false; $this->_left_over_labels = array(); diff --git a/thirdparty/simpletest/parser.php b/thirdparty/simpletest/parser.php index 35616d717e9..c4cb492ffe2 100644 --- a/thirdparty/simpletest/parser.php +++ b/thirdparty/simpletest/parser.php @@ -37,7 +37,7 @@ class ParallelRegex { * for insensitive. * @access public */ - function ParallelRegex($case) { + function __construct($case) { $this->_case = $case; $this->_patterns = array(); $this->_labels = array(); @@ -129,7 +129,7 @@ class SimpleStateStack { * @param string $start Starting state name. * @access public */ - function SimpleStateStack($start) { + function __construct($start) { $this->_stack = array($start); } @@ -193,7 +193,7 @@ class SimpleLexer { * @param boolean $case True for case sensitive. * @access public */ - function SimpleLexer(&$parser, $start = "accept", $case = false) { + function __construct(&$parser, $start = "accept", $case = false) { $this->_case = $case; $this->_regexes = array(); $this->_parser = &$parser; @@ -456,8 +456,8 @@ class SimpleHtmlLexer extends SimpleLexer { * reference. * @access public */ - function SimpleHtmlLexer(&$parser) { - $this->SimpleLexer($parser, 'text'); + function __construct(&$parser) { + parent::__construct($parser, 'text'); $this->mapHandler('text', 'acceptTextToken'); $this->_addSkipping(); foreach ($this->_getParsedTags() as $tag) { @@ -552,7 +552,7 @@ class SimpleHtmlSaxParser { * @param SimpleSaxListener $listener SAX event handler. * @access public */ - function SimpleHtmlSaxParser(&$listener) { + function __construct(&$listener) { $this->_listener = &$listener; $this->_lexer = &$this->createLexer($this); $this->_tag = ''; @@ -728,7 +728,7 @@ class SimpleSaxListener { * Sets the document to write to. * @access public */ - function SimpleSaxListener() { + function __construct() { } /** diff --git a/thirdparty/simpletest/selector.php b/thirdparty/simpletest/selector.php index c33af1bfcc2..8fdfbd13efe 100644 --- a/thirdparty/simpletest/selector.php +++ b/thirdparty/simpletest/selector.php @@ -26,7 +26,7 @@ class SimpleByName { * Stashes the name for later comparison. * @param string $name Name attribute to match. */ - function SimpleByName($name) { + function __construct($name) { $this->_name = $name; } @@ -57,7 +57,7 @@ class SimpleByLabel { * Stashes the name for later comparison. * @param string $label Visible text to match. */ - function SimpleByLabel($label) { + function __construct($label) { $this->_label = $label; } @@ -88,7 +88,7 @@ class SimpleById { * Stashes the name for later comparison. * @param string $id ID atribute to match. */ - function SimpleById($id) { + function __construct($id) { $this->_id = $id; } @@ -115,7 +115,7 @@ class SimpleByLabelOrName { * Stashes the name/label for later comparison. * @param string $label Visible text to match. */ - function SimpleByLabelOrName($label) { + function __construct($label) { $this->_label = $label; } diff --git a/thirdparty/simpletest/socket.php b/thirdparty/simpletest/socket.php index 1d4c97ba64f..d77d43fcb82 100644 --- a/thirdparty/simpletest/socket.php +++ b/thirdparty/simpletest/socket.php @@ -25,7 +25,7 @@ class SimpleStickyError { * Sets the error to empty. * @access public */ - function SimpleStickyError() { + function __construct() { $this->_clearError(); } @@ -85,8 +85,8 @@ class SimpleSocket extends SimpleStickyError { * @param integer $block_size Size of chunk to read. * @access public */ - function SimpleSocket($host, $port, $timeout, $block_size = 255) { - $this->SimpleStickyError(); + function __construct($host, $port, $timeout, $block_size = 255) { + parent::__construct(); if (! ($this->_handle = $this->_openSocket($host, $port, $error_number, $error, $timeout))) { $this->_setError("Cannot open [$host:$port] with [$error] within [$timeout] seconds"); return; @@ -196,8 +196,8 @@ class SimpleSecureSocket extends SimpleSocket { * @param integer $timeout Connection timeout in seconds. * @access public */ - function SimpleSecureSocket($host, $port, $timeout) { - $this->SimpleSocket($host, $port, $timeout); + function __construct($host, $port, $timeout) { + parent::__construct($host, $port, $timeout); } /** diff --git a/thirdparty/simpletest/tag.php b/thirdparty/simpletest/tag.php index e91396513d5..0cb1bf9a477 100644 --- a/thirdparty/simpletest/tag.php +++ b/thirdparty/simpletest/tag.php @@ -31,7 +31,7 @@ class SimpleTag { * the keys must have been * converted to lower case. */ - function SimpleTag($name, $attributes) { + function __construct($name, $attributes) { $this->_name = strtolower(trim($name)); $this->_attributes = $attributes; $this->_content = ''; @@ -162,8 +162,8 @@ class SimpleBaseTag extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleBaseTag($attributes) { - $this->SimpleTag('base', $attributes); + function __construct($attributes) { + parent::__construct('base', $attributes); } /** @@ -188,8 +188,8 @@ class SimpleTitleTag extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleTitleTag($attributes) { - $this->SimpleTag('title', $attributes); + function __construct($attributes) { + parent::__construct('title', $attributes); } } @@ -205,8 +205,8 @@ class SimpleAnchorTag extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleAnchorTag($attributes) { - $this->SimpleTag('a', $attributes); + function __construct($attributes) { + parent::__construct('a', $attributes); } /** @@ -239,8 +239,8 @@ class SimpleWidget extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleWidget($name, $attributes) { - $this->SimpleTag($name, $attributes); + function __construct($name, $attributes) { + parent::__construct($name, $attributes); $this->_value = false; $this->_label = false; $this->_is_set = false; @@ -344,8 +344,8 @@ class SimpleTextTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleTextTag($attributes) { - $this->SimpleWidget('input', $attributes); + function __construct($attributes) { + parent::__construct('input', $attributes); if ($this->getAttribute('value') === false) { $this->_setAttribute('value', ''); } @@ -387,8 +387,8 @@ class SimpleSubmitTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleSubmitTag($attributes) { - $this->SimpleWidget('input', $attributes); + function __construct($attributes) { + parent::__construct('input', $attributes); if ($this->getAttribute('value') === false) { $this->_setAttribute('value', 'Submit'); } @@ -445,10 +445,9 @@ class SimpleImageSubmitTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleImageSubmitTag($attributes) { - $this->SimpleWidget('input', $attributes); + function __construct($attributes) { + parent::__construct('input', $attributes); } - /** * Tag contains no end element. * @return boolean False. @@ -521,8 +520,8 @@ class SimpleButtonTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleButtonTag($attributes) { - $this->SimpleWidget('button', $attributes); + function __construct($attributes) { + parent::__construct('button', $attributes); } /** @@ -577,8 +576,8 @@ class SimpleTextAreaTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleTextAreaTag($attributes) { - $this->SimpleWidget('textarea', $attributes); + function __construct($attributes) { + parent::__construct('textarea', $attributes); } /** @@ -662,8 +661,8 @@ class SimpleUploadTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleUploadTag($attributes) { - $this->SimpleWidget('input', $attributes); + function __construct($attributes) { + parent::__construct('input', $attributes); } /** @@ -705,8 +704,8 @@ class SimpleSelectionTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleSelectionTag($attributes) { - $this->SimpleWidget('select', $attributes); + function __construct($attributes) { + parent::__construct('select', $attributes); $this->_options = array(); $this->_choice = false; } @@ -792,8 +791,8 @@ class MultipleSelectionTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function MultipleSelectionTag($attributes) { - $this->SimpleWidget('select', $attributes); + function __construct($attributes) { + parent::__construct('select', $attributes); $this->_options = array(); $this->_values = false; } @@ -883,8 +882,8 @@ class SimpleOptionTag extends SimpleWidget { /** * Stashes the attributes. */ - function SimpleOptionTag($attributes) { - $this->SimpleWidget('option', $attributes); + function __construct($attributes) { + parent::__construct('option', $attributes); } /** @@ -945,8 +944,8 @@ class SimpleRadioButtonTag extends SimpleWidget { * Stashes the attributes. * @param array $attributes Hash of attributes. */ - function SimpleRadioButtonTag($attributes) { - $this->SimpleWidget('input', $attributes); + function __construct($attributes) { + parent::__construct('input', $attributes); if ($this->getAttribute('value') === false) { $this->_setAttribute('value', 'on'); } @@ -1003,8 +1002,8 @@ class SimpleCheckboxTag extends SimpleWidget { * @param hash $attributes Attribute names and * string values. */ - function SimpleCheckboxTag($attributes) { - $this->SimpleWidget('input', $attributes); + function __construct($attributes) { + parent::__construct('input', $attributes); if ($this->getAttribute('value') === false) { $this->_setAttribute('value', 'on'); } @@ -1359,8 +1358,8 @@ class SimpleLabelTag extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleLabelTag($attributes) { - $this->SimpleTag('label', $attributes); + function __construct($attributes) { + parent::__construct('label', $attributes); } /** @@ -1385,8 +1384,8 @@ class SimpleFormTag extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleFormTag($attributes) { - $this->SimpleTag('form', $attributes); + function __construct($attributes) { + parent::__construct('form', $attributes); } } @@ -1402,8 +1401,8 @@ class SimpleFrameTag extends SimpleTag { * @param hash $attributes Attribute names and * string values. */ - function SimpleFrameTag($attributes) { - $this->SimpleTag('frame', $attributes); + function __construct($attributes) { + parent::__construct('frame', $attributes); } /** diff --git a/thirdparty/simpletest/url.php b/thirdparty/simpletest/url.php index cdd72507918..8bef380ab43 100644 --- a/thirdparty/simpletest/url.php +++ b/thirdparty/simpletest/url.php @@ -41,7 +41,7 @@ class SimpleUrl { * @param string $url Incoming URL. * @access public */ - function SimpleUrl($url = '') { + function __construct($url = '') { list($x, $y) = $this->_chompCoordinates($url); $this->setCoordinates($x, $y); $this->_scheme = $this->_chompScheme($url); From 0dcccfafb3208021f9224e66d636f44791d7e3ae Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Thu, 27 Aug 2015 13:11:02 +1200 Subject: [PATCH 2/9] MINOR: Whitespace fixes in SimpleTest. --- thirdparty/simpletest/cookies.php | 44 +++---- thirdparty/simpletest/encoding.php | 90 ++++++------- thirdparty/simpletest/form.php | 46 +++---- thirdparty/simpletest/http.php | 78 +++++------ thirdparty/simpletest/page.php | 3 +- thirdparty/simpletest/parser.php | 86 ++++++------- thirdparty/simpletest/tag.php | 199 +++++++++++++++-------------- thirdparty/simpletest/url.php | 70 +++++----- 8 files changed, 309 insertions(+), 307 deletions(-) diff --git a/thirdparty/simpletest/cookies.php b/thirdparty/simpletest/cookies.php index 0b46a108ee9..f4a6e43a50a 100644 --- a/thirdparty/simpletest/cookies.php +++ b/thirdparty/simpletest/cookies.php @@ -27,7 +27,7 @@ class SimpleCookie { var $_path; var $_expiry; var $_is_secure; - + /** * Constructor. Sets the stored values. * @param string $name Cookie key. @@ -49,7 +49,7 @@ function __construct($name, $value = false, $path = false, $expiry = false, $is_ } $this->_is_secure = $is_secure; } - + /** * Sets the host. The cookie rules determine * that the first two parts are taken for @@ -67,7 +67,7 @@ function setHost($host) { } return false; } - + /** * Accessor for the truncated host to which this * cookie applies. @@ -77,7 +77,7 @@ function setHost($host) { function getHost() { return $this->_host; } - + /** * Test for a cookie being valid for a host name. * @param string $host Host to test against. @@ -87,7 +87,7 @@ function getHost() { function isValidHost($host) { return ($this->_truncateHost($host) === $this->getHost()); } - + /** * Extracts just the domain part that determines a * cookie's host validity. @@ -104,7 +104,7 @@ function _truncateHost($host) { } return false; } - + /** * Accessor for name. * @return string Cookie key. @@ -113,7 +113,7 @@ function _truncateHost($host) { function getName() { return $this->_name; } - + /** * Accessor for value. A deleted cookie will * have an empty string for this. @@ -123,7 +123,7 @@ function getName() { function getValue() { return $this->_value; } - + /** * Accessor for path. * @return string Valid cookie path. @@ -132,7 +132,7 @@ function getValue() { function getPath() { return $this->_path; } - + /** * Tests a path to see if the cookie applies * there. The test path must be longer or @@ -147,7 +147,7 @@ function isValidPath($path) { $this->getPath(), strlen($this->getPath())) == 0); } - + /** * Accessor for expiry. * @return string Expiry string. @@ -159,7 +159,7 @@ function getExpiry() { } return gmdate("D, d M Y H:i:s", $this->_expiry) . " GMT"; } - + /** * Test to see if cookie is expired against * the cookie format time or timestamp. @@ -180,7 +180,7 @@ function isExpired($now) { } return ($this->_expiry < $now); } - + /** * Ages the cookie by the specified number of * seconds. @@ -192,7 +192,7 @@ function agePrematurely($interval) { $this->_expiry -= $interval; } } - + /** * Accessor for the secure flag. * @return boolean True if cookie needs SSL. @@ -201,7 +201,7 @@ function agePrematurely($interval) { function isSecure() { return $this->_is_secure; } - + /** * Adds a trailing and leading slash to the path * if missing. @@ -227,7 +227,7 @@ function _fixPath($path) { */ class SimpleCookieJar { var $_cookies; - + /** * Constructor. Jar starts empty. * @access public @@ -235,7 +235,7 @@ class SimpleCookieJar { function __construct() { $this->_cookies = array(); } - + /** * Removes expired and temporary cookies as if * the browser was closed and re-opened. @@ -258,7 +258,7 @@ function restartSession($date = false) { } $this->_cookies = $surviving_cookies; } - + /** * Ages all cookies in the cookie jar. * @param integer $interval The old session is moved @@ -272,7 +272,7 @@ function agePrematurely($interval) { $this->_cookies[$i]->agePrematurely($interval); } } - + /** * Sets an additional cookie. If a cookie has * the same name and path it is replaced. @@ -290,7 +290,7 @@ function setCookie($name, $value, $host = false, $path = '/', $expiry = false) { } $this->_cookies[$this->_findFirstMatch($cookie)] = $cookie; } - + /** * Finds a matching cookie to write over or the * first empty slot if none. @@ -311,7 +311,7 @@ function _findFirstMatch($cookie) { } return count($this->_cookies); } - + /** * Reads the most specific cookie value from the * browser cookies. Looks for the longest path that @@ -335,7 +335,7 @@ function getCookieValue($host, $path, $name) { } return (isset($value) ? $value : false); } - + /** * Tests cookie for matching against search * criteria. @@ -359,7 +359,7 @@ function _isMatch($cookie, $host, $path, $name) { } return true; } - + /** * Uses a URL to sift relevant cookies by host and * path. Results are list of strings of form "name=value". diff --git a/thirdparty/simpletest/encoding.php b/thirdparty/simpletest/encoding.php index 9b91bdf779b..35a86c0c861 100644 --- a/thirdparty/simpletest/encoding.php +++ b/thirdparty/simpletest/encoding.php @@ -5,7 +5,7 @@ * @subpackage WebTester * @version $Id: encoding.php 1723 2008-04-08 00:34:10Z lastcraft $ */ - + /**#@+ * include other SimpleTest class files */ @@ -20,7 +20,7 @@ class SimpleEncodedPair { var $_key; var $_value; - + /** * Stashes the data for rendering later. * @param string $key Form element name. @@ -30,7 +30,7 @@ function __construct($key, $value) { $this->_key = $key; $this->_value = $value; } - + /** * The pair as a single string. * @return string Encoded pair. @@ -39,7 +39,7 @@ function __construct($key, $value) { function asRequest() { return urlencode($this->_key) . '=' . urlencode($this->_value); } - + /** * The MIME part as a string. * @return string MIME part encoding. @@ -51,7 +51,7 @@ function asMime() { $part .= "\r\n" . $this->_value; return $part; } - + /** * Is this the value we are looking for? * @param string $key Identifier. @@ -61,7 +61,7 @@ function asMime() { function isKey($key) { return $key == $this->_key; } - + /** * Is this the value we are looking for? * @return string Identifier. @@ -70,7 +70,7 @@ function isKey($key) { function getKey() { return $this->_key; } - + /** * Is this the value we are looking for? * @return string Content. @@ -90,7 +90,7 @@ class SimpleAttachment { var $_key; var $_content; var $_filename; - + /** * Stashes the data for rendering later. * @param string $key Key to add value to. @@ -102,7 +102,7 @@ function __construct($key, $content, $filename) { $this->_content = $content; $this->_filename = $filename; } - + /** * The pair as a single string. * @return string Encoded pair. @@ -111,7 +111,7 @@ function __construct($key, $content, $filename) { function asRequest() { return ''; } - + /** * The MIME part as a string. * @return string MIME part encoding. @@ -125,7 +125,7 @@ function asMime() { $part .= "\r\n\r\n" . $this->_content; return $part; } - + /** * Attempts to figure out the MIME type from the * file extension and the content. @@ -138,7 +138,7 @@ function _deduceMimeType() { } return 'application/octet-stream'; } - + /** * Tests each character is in the range 0-127. * @param string $ascii String to test. @@ -152,7 +152,7 @@ function _isOnlyAscii($ascii) { } return true; } - + /** * Is this the value we are looking for? * @param string $key Identifier. @@ -162,7 +162,7 @@ function _isOnlyAscii($ascii) { function isKey($key) { return $key == $this->_key; } - + /** * Is this the value we are looking for? * @return string Identifier. @@ -171,7 +171,7 @@ function isKey($key) { function getKey() { return $this->_key; } - + /** * Is this the value we are looking for? * @return string Content. @@ -190,7 +190,7 @@ function getValue() { */ class SimpleEncoding { var $_request; - + /** * Starts empty. * @param array $query Hash of parameters. @@ -205,7 +205,7 @@ function __construct($query = false) { $this->clear(); $this->merge($query); } - + /** * Empties the request of parameters. * @access public @@ -213,7 +213,7 @@ function __construct($query = false) { function clear() { $this->_request = array(); } - + /** * Adds a parameter to the query. * @param string $key Key to add value to. @@ -232,7 +232,7 @@ function add($key, $value) { $this->_addPair($key, $value); } } - + /** * Adds a new value into the request. * @param string $key Key to add value to. @@ -242,7 +242,7 @@ function add($key, $value) { function _addPair($key, $value) { $this->_request[] = new SimpleEncodedPair($key, $value); } - + /** * Adds a MIME part to the query. Does nothing for a * form encoded packet. @@ -254,7 +254,7 @@ function _addPair($key, $value) { function attach($key, $content, $filename) { $this->_request[] = new SimpleAttachment($key, $content, $filename); } - + /** * Adds a set of parameters to this query. * @param array/SimpleQueryString $query Multiple values are @@ -270,7 +270,7 @@ function merge($query) { } } } - + /** * Accessor for single value. * @return string/array False if missing, string @@ -293,7 +293,7 @@ function getValue($key) { return $values; } } - + /** * Accessor for listing of pairs. * @return array All pair objects. @@ -302,7 +302,7 @@ function getValue($key) { function getAll() { return $this->_request; } - + /** * Renders the query string as a URL encoded * request part. @@ -327,7 +327,7 @@ function _encode() { * @subpackage WebTester */ class SimpleGetEncoding extends SimpleEncoding { - + /** * Starts empty. * @param array $query Hash of parameters. @@ -335,10 +335,10 @@ class SimpleGetEncoding extends SimpleEncoding { * as lists on a single key. * @access public */ - function SimpleGetEncoding($query = false) { - $this->SimpleEncoding($query); + function __construct($query = false) { + parent::__construct($query); } - + /** * HTTP request method. * @return string Always GET. @@ -347,7 +347,7 @@ function SimpleGetEncoding($query = false) { function getMethod() { return 'GET'; } - + /** * Writes no extra headers. * @param SimpleSocket $socket Socket to write to. @@ -355,7 +355,7 @@ function getMethod() { */ function writeHeadersTo(&$socket) { } - + /** * No data is sent to the socket as the data is encoded into * the URL. @@ -364,7 +364,7 @@ function writeHeadersTo(&$socket) { */ function writeTo(&$socket) { } - + /** * Renders the query string as a URL encoded * request part for attaching to a URL. @@ -382,7 +382,7 @@ function asUrlRequest() { * @subpackage WebTester */ class SimpleHeadEncoding extends SimpleGetEncoding { - + /** * Starts empty. * @param array $query Hash of parameters. @@ -393,7 +393,7 @@ class SimpleHeadEncoding extends SimpleGetEncoding { function __construct($query = false) { parent::__construct($query); } - + /** * HTTP request method. * @return string Always HEAD. @@ -411,7 +411,7 @@ function getMethod() { * @subpackage WebTester */ class SimplePostEncoding extends SimpleEncoding { - + /** * Starts empty. * @param array $query Hash of parameters. @@ -425,7 +425,7 @@ function __construct($query = false) { } parent::__construct($query); } - + function hasMoreThanOneLevel($query) { foreach ($query as $key => $value) { if (is_array($value)) { @@ -449,11 +449,11 @@ function rewriteArrayWithMultipleLevels($query) { if ($this->hasMoreThanOneLevel($query_)) { $query_ = $this->rewriteArrayWithMultipleLevels($query_); } - + return $query_; } - - + + /** * HTTP request method. * @return string Always POST. @@ -462,7 +462,7 @@ function rewriteArrayWithMultipleLevels($query) { function getMethod() { return 'POST'; } - + /** * Dispatches the form headers down the socket. * @param SimpleSocket $socket Socket to write to. @@ -472,7 +472,7 @@ function writeHeadersTo(&$socket) { $socket->write("Content-Length: " . (integer)strlen($this->_encode()) . "\r\n"); $socket->write("Content-Type: application/x-www-form-urlencoded\r\n"); } - + /** * Dispatches the form data down the socket. * @param SimpleSocket $socket Socket to write to. @@ -481,7 +481,7 @@ function writeHeadersTo(&$socket) { function writeTo(&$socket) { $socket->write($this->_encode()); } - + /** * Renders the query string as a URL encoded * request part for attaching to a URL. @@ -501,7 +501,7 @@ function asUrlRequest() { */ class SimpleMultipartEncoding extends SimplePostEncoding { var $_boundary; - + /** * Starts empty. * @param array $query Hash of parameters. @@ -513,7 +513,7 @@ function __construct($query = false, $boundary = false) { parent::__construct($query); $this->_boundary = ($boundary === false ? uniqid('st') : $boundary); } - + /** * Dispatches the form headers down the socket. * @param SimpleSocket $socket Socket to write to. @@ -523,7 +523,7 @@ function writeHeadersTo(&$socket) { $socket->write("Content-Length: " . (integer)strlen($this->_encode()) . "\r\n"); $socket->write("Content-Type: multipart/form-data, boundary=" . $this->_boundary . "\r\n"); } - + /** * Dispatches the form data down the socket. * @param SimpleSocket $socket Socket to write to. @@ -532,7 +532,7 @@ function writeHeadersTo(&$socket) { function writeTo(&$socket) { $socket->write($this->_encode()); } - + /** * Renders the query string as a URL encoded * request part. diff --git a/thirdparty/simpletest/form.php b/thirdparty/simpletest/form.php index de17059491b..241a700f30b 100644 --- a/thirdparty/simpletest/form.php +++ b/thirdparty/simpletest/form.php @@ -5,7 +5,7 @@ * @subpackage WebTester * @version $Id: form.php 1672 2008-03-02 04:47:34Z edwardzyang $ */ - + /**#@+ * include SimpleTest files */ @@ -30,7 +30,7 @@ class SimpleForm { var $_widgets; var $_radios; var $_checkboxes; - + /** * Starts with no held controls/widgets. * @param SimpleTag $tag Form tag to read. @@ -48,7 +48,7 @@ function __construct($tag, &$page) { $this->_radios = array(); $this->_checkboxes = array(); } - + /** * Creates the request packet to be sent by the form. * @param SimpleTag $tag Form tag to read. @@ -64,7 +64,7 @@ function _setEncodingClass($tag) { } return 'SimpleGetEncoding'; } - + /** * Sets the frame target within a frameset. * @param string $frame Name of frame. @@ -73,7 +73,7 @@ function _setEncodingClass($tag) { function setDefaultTarget($frame) { $this->_default_target = $frame; } - + /** * Accessor for method of form submission. * @return string Either get or post. @@ -82,7 +82,7 @@ function setDefaultTarget($frame) { function getMethod() { return ($this->_method ? strtolower($this->_method) : 'get'); } - + /** * Combined action attribute with current location * to get an absolute form target. @@ -96,7 +96,7 @@ function _createAction($action, &$page) { } return $page->expandUrl(new SimpleUrl($action));; } - + /** * Absolute URL of the target. * @return SimpleUrl URL target. @@ -109,7 +109,7 @@ function getAction() { } return $url; } - + /** * Creates the encoding for the current values in the * form. @@ -124,7 +124,7 @@ function _encode() { } return $encoding; } - + /** * ID field of form for unique identification. * @return string Unique tag ID. @@ -133,7 +133,7 @@ function _encode() { function getId() { return $this->_id; } - + /** * Adds a tag contents to the form. * @param SimpleWidget $tag Input tag to add. @@ -148,7 +148,7 @@ function addWidget(&$tag) { $this->_setWidget($tag); } } - + /** * Sets the widget into the form, grouping radio * buttons if any. @@ -164,7 +164,7 @@ function _setWidget(&$tag) { $this->_widgets[] = &$tag; } } - + /** * Adds a radio button, building a group if necessary. * @param SimpleRadioButtonTag $tag Incoming form control. @@ -177,7 +177,7 @@ function _addRadioButton(&$tag) { } $this->_widgets[$this->_radios[$tag->getName()]]->addWidget($tag); } - + /** * Adds a checkbox, making it a group on a repeated name. * @param SimpleCheckboxTag $tag Incoming form control. @@ -197,7 +197,7 @@ function _addCheckbox(&$tag) { $this->_widgets[$index]->addWidget($tag); } } - + /** * Extracts current value from form. * @param SimpleSelector $selector Criteria to apply. @@ -218,7 +218,7 @@ function getValue($selector) { } return null; } - + /** * Sets a widget value within the form. * @param SimpleSelector $selector Criteria to apply. @@ -243,7 +243,7 @@ function setField($selector, $value, $position=false) { } return $success; } - + /** * Used by the page object to set widgets labels to * external label tags. @@ -260,7 +260,7 @@ function attachLabelBySelector($selector, $label) { } } } - + /** * Test to see if a form has a submit button. * @param SimpleSelector $selector Criteria to apply. @@ -275,7 +275,7 @@ function hasSubmit($selector) { } return false; } - + /** * Test to see if a form has an image control. * @param SimpleSelector $selector Criteria to apply. @@ -290,7 +290,7 @@ function hasImage($selector) { } return false; } - + /** * Gets the submit values for a selected button. * @param SimpleSelector $selector Criteria to apply. @@ -309,12 +309,12 @@ function submitButton($selector, $additional = false) { if ($additional) { $encoding->merge($additional); } - return $encoding; + return $encoding; } } return false; } - + /** * Gets the submit values for an image. * @param SimpleSelector $selector Criteria to apply. @@ -335,12 +335,12 @@ function submitImage($selector, $x, $y, $additional = false) { if ($additional) { $encoding->merge($additional); } - return $encoding; + return $encoding; } } return false; } - + /** * Simply submits the form without the submit button * value. Used when there is only one button or it diff --git a/thirdparty/simpletest/http.php b/thirdparty/simpletest/http.php index 5f109e650f3..b66d68978b7 100644 --- a/thirdparty/simpletest/http.php +++ b/thirdparty/simpletest/http.php @@ -22,7 +22,7 @@ */ class SimpleRoute { var $_url; - + /** * Sets the target URL. * @param SimpleUrl $url URL as object. @@ -31,7 +31,7 @@ class SimpleRoute { function __construct($url) { $this->_url = $url; } - + /** * Resource name. * @return SimpleUrl Current url. @@ -40,7 +40,7 @@ function __construct($url) { function getUrl() { return $this->_url; } - + /** * Creates the first line which is the actual request. * @param string $method HTTP request method, usually GET. @@ -51,7 +51,7 @@ function _getRequestLine($method) { return $method . ' ' . $this->_url->getPath() . $this->_url->getEncodedRequest() . ' HTTP/1.0'; } - + /** * Creates the host part of the request. * @return string Host line content. @@ -64,7 +64,7 @@ function _getHostLine() { } return $line; } - + /** * Opens a socket to the route. * @param string $method HTTP request method, usually GET. @@ -86,7 +86,7 @@ function &createConnection($method, $timeout) { } return $socket; } - + /** * Factory for socket. * @param string $scheme Protocol to use. @@ -116,7 +116,7 @@ class SimpleProxyRoute extends SimpleRoute { var $_proxy; var $_username; var $_password; - + /** * Stashes the proxy address. * @param SimpleUrl $url URL as object. @@ -131,7 +131,7 @@ function __construct($url, $proxy, $username = false, $password = false) { $this->_username = $username; $this->_password = $password; } - + /** * Creates the first line which is the actual request. * @param string $method HTTP request method, usually GET. @@ -146,7 +146,7 @@ function _getRequestLine($method) { return $method . ' ' . $scheme . '://' . $url->getHost() . $port . $url->getPath() . $url->getEncodedRequest() . ' HTTP/1.0'; } - + /** * Creates the host part of the request. * @param SimpleUrl $url URL as object. @@ -158,7 +158,7 @@ function _getHostLine() { $port = $this->_proxy->getPort() ? $this->_proxy->getPort() : 8080; return "$host:$port"; } - + /** * Opens a socket to the route. * @param string $method HTTP request method, usually GET. @@ -198,7 +198,7 @@ class SimpleHttpRequest { var $_encoding; var $_headers; var $_cookies; - + /** * Builds the socket request from the different pieces. * These include proxy information, URL, cookies, headers, @@ -214,7 +214,7 @@ function __construct(&$route, $encoding) { $this->_headers = array(); $this->_cookies = array(); } - + /** * Dispatches the content to the route's socket. * @param integer $timeout Connection timeout. @@ -231,7 +231,7 @@ function &fetch($timeout) { $response = &$this->_createResponse($socket); return $response; } - + /** * Sends the headers. * @param SimpleSocket $socket Open socket. @@ -251,7 +251,7 @@ function _dispatchRequest(&$socket, $encoding) { $socket->write("\r\n"); $encoding->writeTo($socket); } - + /** * Adds a header line to the request. * @param string $header_line Text of full header line. @@ -260,7 +260,7 @@ function _dispatchRequest(&$socket, $encoding) { function addHeaderLine($header_line) { $this->_headers[] = $header_line; } - + /** * Reads all the relevant cookies from the * cookie jar. @@ -271,7 +271,7 @@ function addHeaderLine($header_line) { function readCookiesFromJar($jar, $url) { $this->_cookies = $jar->selectAsPairs($url); } - + /** * Wraps the socket in a response parser. * @param SimpleSocket $socket Responding socket. @@ -301,7 +301,7 @@ class SimpleHttpHeaders { var $_cookies; var $_authentication; var $_realm; - + /** * Parses the incoming header block. * @param string $headers Header block. @@ -320,7 +320,7 @@ function __construct($headers) { $this->_parseHeaderLine($header_line); } } - + /** * Accessor for parsed HTTP protocol version. * @return integer HTTP error code. @@ -329,7 +329,7 @@ function __construct($headers) { function getHttpVersion() { return $this->_http_version; } - + /** * Accessor for raw header block. * @return string All headers as raw string. @@ -338,7 +338,7 @@ function getHttpVersion() { function getRaw() { return $this->_raw_headers; } - + /** * Accessor for parsed HTTP error code. * @return integer HTTP error code. @@ -347,7 +347,7 @@ function getRaw() { function getResponseCode() { return (integer)$this->_response_code; } - + /** * Returns the redirected URL or false if * no redirection. @@ -357,7 +357,7 @@ function getResponseCode() { function getLocation() { return $this->_location; } - + /** * Test to see if the response is a valid redirect. * @return boolean True if valid redirect. @@ -367,7 +367,7 @@ function isRedirect() { return in_array($this->_response_code, array(301, 302, 303, 307)) && (boolean)$this->getLocation(); } - + /** * Test to see if the response is an authentication * challenge. @@ -379,7 +379,7 @@ function isChallenge() { (boolean)$this->_authentication && (boolean)$this->_realm; } - + /** * Accessor for MIME type header information. * @return string MIME type. @@ -388,7 +388,7 @@ function isChallenge() { function getMimeType() { return $this->_mime_type; } - + /** * Accessor for authentication type. * @return string Type. @@ -397,7 +397,7 @@ function getMimeType() { function getAuthentication() { return $this->_authentication; } - + /** * Accessor for security realm. * @return string Realm. @@ -406,7 +406,7 @@ function getAuthentication() { function getRealm() { return $this->_realm; } - + /** * Writes new cookies to the cookie jar. * @param SimpleCookieJar $jar Jar to write to. @@ -449,7 +449,7 @@ function _parseHeaderLine($header_line) { $this->_realm = trim($matches[2]); } } - + /** * Parse the Set-cookie content. * @param string $cookie_line Text after "Set-cookie:" @@ -484,7 +484,7 @@ class SimpleHttpResponse extends SimpleStickyError { var $_sent; var $_content; var $_headers; - + /** * Constructor. Reads and parses the incoming * content and headers. @@ -507,7 +507,7 @@ function __construct(&$socket, $url, $encoding) { } $this->_parse($raw); } - + /** * Splits up the headers and the rest of the content. * @param string $raw Content to parse. @@ -525,7 +525,7 @@ function _parse($raw) { $this->_headers = new SimpleHttpHeaders($headers); } } - + /** * Original request method. * @return string GET, POST or HEAD. @@ -534,7 +534,7 @@ function _parse($raw) { function getMethod() { return $this->_encoding->getMethod(); } - + /** * Resource name. * @return SimpleUrl Current url. @@ -543,7 +543,7 @@ function getMethod() { function getUrl() { return $this->_url; } - + /** * Original request data. * @return mixed Sent content. @@ -552,7 +552,7 @@ function getUrl() { function getRequestData() { return $this->_encoding; } - + /** * Raw request that was sent down the wire. * @return string Bytes actually sent. @@ -561,7 +561,7 @@ function getRequestData() { function getSent() { return $this->_sent; } - + /** * Accessor for the content after the last * header line. @@ -571,7 +571,7 @@ function getSent() { function getContent() { return $this->_content; } - + /** * Accessor for header block. The response is the * combination of this and the content. @@ -581,7 +581,7 @@ function getContent() { function getHeaders() { return $this->_headers; } - + /** * Accessor for any new cookies. * @return array List of new cookies. @@ -590,7 +590,7 @@ function getHeaders() { function getNewCookies() { return $this->_headers->getNewCookies(); } - + /** * Reads the whole of the socket output into a * single string. @@ -606,7 +606,7 @@ function _readAll(&$socket) { } return $all; } - + /** * Test to see if the packet from the socket is the * last one. diff --git a/thirdparty/simpletest/page.php b/thirdparty/simpletest/page.php index c1e08957dc8..c47183b1e0d 100644 --- a/thirdparty/simpletest/page.php +++ b/thirdparty/simpletest/page.php @@ -130,6 +130,7 @@ class SimplePageBuilder extends SimpleSaxListener { function __construct() { parent::__construct(); } + /** * Frees up any references so as to allow the PHP garbage * collection from unset() to work. @@ -178,7 +179,7 @@ function &_createParser(&$listener) { $parser = new SimpleHtmlSaxParser($listener); return $parser; } - + /** * Start of element event. Opens a new tag. * @param string $name Element name. diff --git a/thirdparty/simpletest/parser.php b/thirdparty/simpletest/parser.php index c4cb492ffe2..6e043a8664e 100644 --- a/thirdparty/simpletest/parser.php +++ b/thirdparty/simpletest/parser.php @@ -30,7 +30,7 @@ class ParallelRegex { var $_labels; var $_regex; var $_case; - + /** * Constructor. Starts with no patterns. * @param boolean $case True for case sensitive, false @@ -43,7 +43,7 @@ function __construct($case) { $this->_labels = array(); $this->_regex = null; } - + /** * Adds a pattern with an optional label. * @param string $pattern Perl style regex, but ( and ) @@ -58,7 +58,7 @@ function addPattern($pattern, $label = true) { $this->_labels[$count] = $label; $this->_regex = null; } - + /** * Attempts to match all patterns at once against * a string. @@ -84,7 +84,7 @@ function match($subject, &$match) { } return true; } - + /** * Compounds the patterns into a single * regular expression separated with the @@ -105,7 +105,7 @@ function _getCompoundedRegex() { } return $this->_regex; } - + /** * Accessor for perl regex mode flags to use. * @return string Perl regex flags. @@ -123,7 +123,7 @@ function _getPerlMatchingFlags() { */ class SimpleStateStack { var $_stack; - + /** * Constructor. Starts in named state. * @param string $start Starting state name. @@ -132,7 +132,7 @@ class SimpleStateStack { function __construct($start) { $this->_stack = array($start); } - + /** * Accessor for current state. * @return string State. @@ -141,7 +141,7 @@ function __construct($start) { function getCurrent() { return $this->_stack[count($this->_stack) - 1]; } - + /** * Adds a state to the stack and sets it * to be the current state. @@ -151,7 +151,7 @@ function getCurrent() { function enter($state) { array_push($this->_stack, $state); } - + /** * Leaves the current state and reverts * to the previous one. @@ -183,7 +183,7 @@ class SimpleLexer { var $_mode; var $_mode_handlers; var $_case; - + /** * Sets up the lexer in case insensitive matching * by default. @@ -200,7 +200,7 @@ function __construct(&$parser, $start = "accept", $case = false) { $this->_mode = new SimpleStateStack($start); $this->_mode_handlers = array($start => $start); } - + /** * Adds a token search pattern for a particular * parsing mode. The pattern does not change the @@ -221,7 +221,7 @@ function addPattern($pattern, $mode = "accept") { $this->_mode_handlers[$mode] = $mode; } } - + /** * Adds a pattern that will enter a new parsing * mode. Useful for entering parenthesis, strings, @@ -244,7 +244,7 @@ function addEntryPattern($pattern, $mode, $new_mode) { $this->_mode_handlers[$new_mode] = $new_mode; } } - + /** * Adds a pattern that will exit the current mode * and re-enter the previous one. @@ -262,7 +262,7 @@ function addExitPattern($pattern, $mode) { $this->_mode_handlers[$mode] = $mode; } } - + /** * Adds a pattern that has a special mode. Acts as an entry * and exit pattern in one go, effectively calling a special @@ -284,7 +284,7 @@ function addSpecialPattern($pattern, $mode, $special) { $this->_mode_handlers[$special] = $special; } } - + /** * Adds a mapping from a mode to another handler. * @param string $mode Mode to be remapped. @@ -294,7 +294,7 @@ function addSpecialPattern($pattern, $mode, $special) { function mapHandler($mode, $handler) { $this->_mode_handlers[$mode] = $handler; } - + /** * Splits the page text into tokens. Will fail * if the handlers report an error or if no @@ -328,7 +328,7 @@ function parse($raw) { } return $this->_invokeParser($raw, LEXER_UNMATCHED); } - + /** * Sends the matched token and any leading unmatched * text to the parser changing the lexer to a new @@ -364,7 +364,7 @@ function _dispatchTokens($unmatched, $matched, $mode = false) { $this->_mode->enter($mode); return $this->_invokeParser($matched, LEXER_ENTER); } - + /** * Tests to see if the new mode is actually to leave * the current mode and pop an item from the matching @@ -376,7 +376,7 @@ function _dispatchTokens($unmatched, $matched, $mode = false) { function _isModeEnd($mode) { return ($mode === "__exit"); } - + /** * Test to see if the mode is one where this mode * is entered for this token only and automatically @@ -388,7 +388,7 @@ function _isModeEnd($mode) { function _isSpecialMode($mode) { return (strncmp($mode, "_", 1) == 0); } - + /** * Strips the magic underscore marking single token * modes. @@ -399,7 +399,7 @@ function _isSpecialMode($mode) { function _decodeSpecial($mode) { return substr($mode, 1); } - + /** * Calls the parser method named after the current * mode. Empty content will be ignored. The lexer @@ -416,7 +416,7 @@ function _invokeParser($content, $is_match) { $handler = $this->_mode_handlers[$this->_mode->getCurrent()]; return $this->_parser->$handler($content, $is_match); } - + /** * Tries to match a chunk of text and if successful * removes the recognised chunk and any leading @@ -448,7 +448,7 @@ function _reduce($raw) { * @subpackage WebTester */ class SimpleHtmlLexer extends SimpleLexer { - + /** * Sets up the lexer with case insensitive matching * and adds the HTML handlers. @@ -465,7 +465,7 @@ function __construct(&$parser) { } $this->_addInTagTokens(); } - + /** * List of parsed tags. Others are ignored. * @return array List of searched for tags. @@ -475,7 +475,7 @@ function _getParsedTags() { return array('a', 'base', 'title', 'form', 'input', 'button', 'textarea', 'select', 'option', 'frameset', 'frame', 'label'); } - + /** * The lexer has to skip certain sections such * as server code, client code and styles. @@ -492,7 +492,7 @@ function _addSkipping() { $this->addEntryPattern('', 'comment'); } - + /** * Pattern matches to start and end a tag. * @param string $tag Name of tag to scan for. @@ -502,7 +502,7 @@ function _addTag($tag) { $this->addSpecialPattern("", 'text', 'acceptEndToken'); $this->addEntryPattern("<$tag", 'text', 'tag'); } - + /** * Pattern matches to parse the inside of a tag * including the attributes and their quoting. @@ -515,7 +515,7 @@ function _addInTagTokens() { $this->addExitPattern('/>', 'tag'); $this->addExitPattern('>', 'tag'); } - + /** * Matches attributes that are either single quoted, * double quoted or unquoted. @@ -546,7 +546,7 @@ class SimpleHtmlSaxParser { var $_tag; var $_attributes; var $_current_attribute; - + /** * Sets the listener. * @param SimpleSaxListener $listener SAX event handler. @@ -559,7 +559,7 @@ function __construct(&$listener) { $this->_attributes = array(); $this->_current_attribute = ''; } - + /** * Runs the content through the lexer which * should call back to the acceptors. @@ -570,7 +570,7 @@ function __construct(&$listener) { function parse($raw) { return $this->_lexer->parse($raw); } - + /** * Sets up the matching lexer. Starts in 'text' mode. * @param SimpleSaxParser $parser Event generator, usually $self. @@ -582,7 +582,7 @@ function &createLexer(&$parser) { $lexer = new SimpleHtmlLexer($parser); return $lexer; } - + /** * Accepts a token from the tag mode. If the * starting element completes then the element @@ -613,7 +613,7 @@ function acceptStartToken($token, $event) { } return true; } - + /** * Accepts a token from the end tag mode. * The element name is converted to lower case. @@ -628,7 +628,7 @@ function acceptEndToken($token, $event) { } return $this->_listener->endElement(strtolower($matches[1])); } - + /** * Part of the tag data. * @param string $token Incoming characters. @@ -649,7 +649,7 @@ function acceptAttributeToken($token, $event) { } return true; } - + /** * A character entity. * @param string $token Incoming characters. @@ -659,7 +659,7 @@ function acceptAttributeToken($token, $event) { */ function acceptEntityToken($token, $event) { } - + /** * Character data between tags regarded as * important. @@ -671,7 +671,7 @@ function acceptEntityToken($token, $event) { function acceptTextToken($token, $event) { return $this->_listener->addContent($token); } - + /** * Incoming data to be ignored. * @param string $token Incoming characters. @@ -682,7 +682,7 @@ function acceptTextToken($token, $event) { function ignore($token, $event) { return true; } - + /** * Decodes any HTML entities. * @param string $html Incoming HTML. @@ -693,7 +693,7 @@ function ignore($token, $event) { static function decodeHtml($html) { return html_entity_decode($html, ENT_QUOTES); } - + /** * Turns HTML into text browser visible text. Images * are converted to their alt text and tags are supressed. @@ -723,14 +723,14 @@ static function normalise($html) { * @abstract */ class SimpleSaxListener { - + /** * Sets the document to write to. * @access public */ function __construct() { } - + /** * Start of element event. * @param string $name Element name. @@ -742,7 +742,7 @@ function __construct() { */ function startElement($name, $attributes) { } - + /** * End of element event. * @param string $name Element name. @@ -751,7 +751,7 @@ function startElement($name, $attributes) { */ function endElement($name) { } - + /** * Unparsed, but relevant data. * @param string $text May include unparsed tags. diff --git a/thirdparty/simpletest/tag.php b/thirdparty/simpletest/tag.php index 0cb1bf9a477..55b27d20e69 100644 --- a/thirdparty/simpletest/tag.php +++ b/thirdparty/simpletest/tag.php @@ -5,7 +5,7 @@ * @subpackage WebTester * @version $Id: tag.php 1723 2008-04-08 00:34:10Z lastcraft $ */ - + /**#@+ * include SimpleTest files */ @@ -22,7 +22,7 @@ class SimpleTag { var $_name; var $_attributes; var $_content; - + /** * Starts with a named tag with attributes only. * @param string $name Tag name. @@ -36,7 +36,7 @@ function __construct($name, $attributes) { $this->_attributes = $attributes; $this->_content = ''; } - + /** * Check to see if the tag can have both start and * end tags with content in between. @@ -46,7 +46,7 @@ function __construct($name, $attributes) { function expectEndTag() { return true; } - + /** * The current tag should not swallow all content for * itself as it's searchable page content. Private @@ -68,7 +68,7 @@ function isPrivateContent() { function addContent($content) { $this->_content .= (string)$content; } - + /** * Adds an enclosed tag to the content. * @param SimpleTag $tag New tag. @@ -76,7 +76,7 @@ function addContent($content) { */ function addTag(&$tag) { } - + /** * Accessor for tag name. * @return string Name of tag. @@ -85,7 +85,7 @@ function addTag(&$tag) { function getTagName() { return $this->_name; } - + /** * List of legal child elements. * @return array List of element names. @@ -94,7 +94,7 @@ function getTagName() { function getChildElements() { return array(); } - + /** * Accessor for an attribute. * @param string $label Attribute name. @@ -108,7 +108,7 @@ function getAttribute($label) { } return (string)$this->_attributes[$label]; } - + /** * Sets an attribute. * @param string $label Attribute name. @@ -118,7 +118,7 @@ function getAttribute($label) { function _setAttribute($label, $value) { $this->_attributes[strtolower($label)] = $value; } - + /** * Accessor for the whole content so far. * @return string Content as big raw string. @@ -127,7 +127,7 @@ function _setAttribute($label, $value) { function getContent() { return $this->_content; } - + /** * Accessor for content reduced to visible text. Acts * like a text mode browser, normalising space and @@ -138,7 +138,7 @@ function getContent() { function getText() { return SimpleHtmlSaxParser::normalise($this->_content); } - + /** * Test to see if id attribute matches. * @param string $id ID to test against. @@ -156,7 +156,7 @@ function isId($id) { * @subpackage WebTester */ class SimpleBaseTag extends SimpleTag { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -182,7 +182,7 @@ function expectEndTag() { * @subpackage WebTester */ class SimpleTitleTag extends SimpleTag { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -199,7 +199,7 @@ function __construct($attributes) { * @subpackage WebTester */ class SimpleAnchorTag extends SimpleTag { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -208,7 +208,7 @@ class SimpleAnchorTag extends SimpleTag { function __construct($attributes) { parent::__construct('a', $attributes); } - + /** * Accessor for URL as string. * @return string Coerced as string. @@ -232,7 +232,7 @@ class SimpleWidget extends SimpleTag { var $_value; var $_label; var $_is_set; - + /** * Starts with a named tag with attributes only. * @param string $name Tag name. @@ -245,7 +245,7 @@ function __construct($name, $attributes) { $this->_label = false; $this->_is_set = false; } - + /** * Accessor for name submitted as the key in * GET/POST variables hash. @@ -255,7 +255,7 @@ function __construct($name, $attributes) { function getName() { return $this->getAttribute('name'); } - + /** * Accessor for default value parsed with the tag. * @return string Parsed value. @@ -264,7 +264,7 @@ function getName() { function getDefault() { return $this->getAttribute('value'); } - + /** * Accessor for currently set value or default if * none. @@ -278,7 +278,7 @@ function getValue() { } return $this->_value; } - + /** * Sets the current form element value. * @param string $value New value. @@ -290,7 +290,7 @@ function setValue($value) { $this->_is_set = true; return true; } - + /** * Resets the form element value back to the * default. @@ -299,7 +299,7 @@ function setValue($value) { function resetValue() { $this->_is_set = false; } - + /** * Allows setting of a label externally, say by a * label tag. @@ -309,7 +309,7 @@ function resetValue() { function setLabel($label) { $this->_label = trim($label); } - + /** * Reads external or internal label. * @param string $label Label to test. @@ -319,7 +319,7 @@ function setLabel($label) { function isLabel($label) { return $this->_label == trim($label); } - + /** * Dispatches the value into the form encoded packet. * @param SimpleEncoding $encoding Form packet. @@ -338,7 +338,7 @@ function write(&$encoding, $x, $y) { * @subpackage WebTester */ class SimpleTextTag extends SimpleWidget { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -350,7 +350,7 @@ function __construct($attributes) { $this->_setAttribute('value', ''); } } - + /** * Tag contains no content. * @return boolean False. @@ -359,7 +359,7 @@ function __construct($attributes) { function expectEndTag() { return false; } - + /** * Sets the current form element value. Cannot * change the value of a hidden field. @@ -381,7 +381,7 @@ function setValue($value) { * @subpackage WebTester */ class SimpleSubmitTag extends SimpleWidget { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -393,7 +393,7 @@ function __construct($attributes) { $this->_setAttribute('value', 'Submit'); } } - + /** * Tag contains no end element. * @return boolean False. @@ -402,7 +402,7 @@ function __construct($attributes) { function expectEndTag() { return false; } - + /** * Disables the setting of the button value. * @param string $value Ignored. @@ -412,7 +412,7 @@ function expectEndTag() { function setValue($value) { return false; } - + /** * Value of browser visible text. * @return string Visible label. @@ -421,7 +421,7 @@ function setValue($value) { function getLabel() { return $this->getValue(); } - + /** * Test for a label match when searching. * @param string $label Label to test. @@ -432,14 +432,14 @@ function isLabel($label) { return trim($label) == trim($this->getLabel()); } } - + /** * Image button as input tag. * @package SimpleTest * @subpackage WebTester */ class SimpleImageSubmitTag extends SimpleWidget { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -448,6 +448,7 @@ class SimpleImageSubmitTag extends SimpleWidget { function __construct($attributes) { parent::__construct('input', $attributes); } + /** * Tag contains no end element. * @return boolean False. @@ -456,7 +457,7 @@ function __construct($attributes) { function expectEndTag() { return false; } - + /** * Disables the setting of the button value. * @param string $value Ignored. @@ -466,7 +467,7 @@ function expectEndTag() { function setValue($value) { return false; } - + /** * Value of browser visible text. * @return string Visible label. @@ -478,7 +479,7 @@ function getLabel() { } return $this->getAttribute('alt'); } - + /** * Test for a label match when searching. * @param string $label Label to test. @@ -488,7 +489,7 @@ function getLabel() { function isLabel($label) { return trim($label) == trim($this->getLabel()); } - + /** * Dispatches the value into the form encoded packet. * @param SimpleEncoding $encoding Form packet. @@ -506,14 +507,14 @@ function write(&$encoding, $x, $y) { } } } - + /** * Submit button as button tag. * @package SimpleTest * @subpackage WebTester */ class SimpleButtonTag extends SimpleWidget { - + /** * Starts with a named tag with attributes only. * Defaults are very browser dependent. @@ -523,7 +524,7 @@ class SimpleButtonTag extends SimpleWidget { function __construct($attributes) { parent::__construct('button', $attributes); } - + /** * Check to see if the tag can have both start and * end tags with content in between. @@ -533,7 +534,7 @@ function __construct($attributes) { function expectEndTag() { return true; } - + /** * Disables the setting of the button value. * @param string $value Ignored. @@ -543,7 +544,7 @@ function expectEndTag() { function setValue($value) { return false; } - + /** * Value of browser visible text. * @return string Visible label. @@ -552,7 +553,7 @@ function setValue($value) { function getLabel() { return $this->getContent(); } - + /** * Test for a label match when searching. * @param string $label Label to test. @@ -570,7 +571,7 @@ function isLabel($label) { * @subpackage WebTester */ class SimpleTextAreaTag extends SimpleWidget { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -579,7 +580,7 @@ class SimpleTextAreaTag extends SimpleWidget { function __construct($attributes) { parent::__construct('textarea', $attributes); } - + /** * Accessor for starting value. * @return string Parsed value. @@ -588,7 +589,7 @@ function __construct($attributes) { function getDefault() { return $this->_wrap(SimpleHtmlSaxParser::decodeHtml($this->getContent())); } - + /** * Applies word wrapping if needed. * @param string $value New value. @@ -598,7 +599,7 @@ function getDefault() { function setValue($value) { return parent::setValue($this->_wrap($value)); } - + /** * Test to see if text should be wrapped. * @return boolean True if wrapping on. @@ -613,7 +614,7 @@ function _wrapIsEnabled() { } return false; } - + /** * Performs the formatting that is peculiar to * this tag. There is strange behaviour in this @@ -638,7 +639,7 @@ function _wrap($text) { } return $text; } - + /** * The content of textarea is not part of the page. * @return boolean True. @@ -655,7 +656,7 @@ function isPrivateContent() { * @subpackage WebTester */ class SimpleUploadTag extends SimpleWidget { - + /** * Starts with attributes only. * @param hash $attributes Attribute names and @@ -664,7 +665,7 @@ class SimpleUploadTag extends SimpleWidget { function __construct($attributes) { parent::__construct('input', $attributes); } - + /** * Tag contains no content. * @return boolean False. @@ -673,7 +674,7 @@ function __construct($attributes) { function expectEndTag() { return false; } - + /** * Dispatches the value into the form encoded packet. * @param SimpleEncoding $encoding Form packet. @@ -698,7 +699,7 @@ function write(&$encoding, $x, $y) { class SimpleSelectionTag extends SimpleWidget { var $_options; var $_choice; - + /** * Starts with attributes only. * @param hash $attributes Attribute names and @@ -709,7 +710,7 @@ function __construct($attributes) { $this->_options = array(); $this->_choice = false; } - + /** * Adds an option tag to a selection field. * @param SimpleOptionTag $tag New option. @@ -720,7 +721,7 @@ function addTag(&$tag) { $this->_options[] = &$tag; } } - + /** * Text within the selection element is ignored. * @param string $content Ignored. @@ -728,7 +729,7 @@ function addTag(&$tag) { */ function addContent($content) { } - + /** * Scans options for defaults. If none, then * the first option is selected. @@ -746,7 +747,7 @@ function getDefault() { } return ''; } - + /** * Can only set allowed values. * @param string $value New choice. @@ -762,7 +763,7 @@ function setValue($value) { } return false; } - + /** * Accessor for current selection value. * @return string Value attribute or @@ -785,7 +786,7 @@ function getValue() { class MultipleSelectionTag extends SimpleWidget { var $_options; var $_values; - + /** * Starts with attributes only. * @param hash $attributes Attribute names and @@ -796,7 +797,7 @@ function __construct($attributes) { $this->_options = array(); $this->_values = false; } - + /** * Adds an option tag to a selection field. * @param SimpleOptionTag $tag New option. @@ -807,7 +808,7 @@ function addTag(&$tag) { $this->_options[] = &$tag; } } - + /** * Text within the selection element is ignored. * @param string $content Ignored. @@ -815,7 +816,7 @@ function addTag(&$tag) { */ function addContent($content) { } - + /** * Scans options for defaults to populate the * value array(). @@ -831,7 +832,7 @@ function getDefault() { } return $default; } - + /** * Can only set allowed values. Any illegal value * will result in a failure, but all correct values @@ -858,7 +859,7 @@ function setValue($desired) { $this->_values = $achieved; return true; } - + /** * Accessor for current selection value. * @return array List of currently set options. @@ -878,14 +879,14 @@ function getValue() { * @subpackage WebTester */ class SimpleOptionTag extends SimpleWidget { - + /** * Stashes the attributes. */ function __construct($attributes) { parent::__construct('option', $attributes); } - + /** * Does nothing. * @param string $value Ignored. @@ -895,7 +896,7 @@ function __construct($attributes) { function setValue($value) { return false; } - + /** * Test to see if a value matches the option. * @param string $compare Value to compare with. @@ -909,7 +910,7 @@ function isValue($compare) { } return trim($this->getContent()) == $compare; } - + /** * Accessor for starting value. Will be set to * the option label if no value exists. @@ -922,7 +923,7 @@ function getDefault() { } return $this->getAttribute('value'); } - + /** * The content of options is not part of the page. * @return boolean True. @@ -939,7 +940,7 @@ function isPrivateContent() { * @subpackage WebTester */ class SimpleRadioButtonTag extends SimpleWidget { - + /** * Stashes the attributes. * @param array $attributes Hash of attributes. @@ -950,7 +951,7 @@ function __construct($attributes) { $this->_setAttribute('value', 'on'); } } - + /** * Tag contains no content. * @return boolean False. @@ -959,7 +960,7 @@ function __construct($attributes) { function expectEndTag() { return false; } - + /** * The only allowed value sn the one in the * "value" attribute. @@ -976,7 +977,7 @@ function setValue($value) { } return parent::setValue($value); } - + /** * Accessor for starting value. * @return string Parsed value. @@ -996,7 +997,7 @@ function getDefault() { * @subpackage WebTester */ class SimpleCheckboxTag extends SimpleWidget { - + /** * Starts with attributes only. * @param hash $attributes Attribute names and @@ -1008,7 +1009,7 @@ function __construct($attributes) { $this->_setAttribute('value', 'on'); } } - + /** * Tag contains no content. * @return boolean False. @@ -1017,7 +1018,7 @@ function __construct($attributes) { function expectEndTag() { return false; } - + /** * The only allowed value in the one in the * "value" attribute. The default for this @@ -1039,7 +1040,7 @@ function setValue($value) { } return parent::setValue($value); } - + /** * Accessor for starting value. The default * value is "on". @@ -1070,7 +1071,7 @@ class SimpleTagGroup { function addWidget(&$widget) { $this->_widgets[] = &$widget; } - + /** * Accessor to widget set. * @return array All widgets. @@ -1089,7 +1090,7 @@ function &_getWidgets() { function getAttribute($label) { return false; } - + /** * Fetches the name for the widget from the first * member. @@ -1101,7 +1102,7 @@ function getName() { return $this->_widgets[0]->getName(); } } - + /** * Scans the widgets for one with the appropriate * ID field. @@ -1117,7 +1118,7 @@ function isId($id) { } return false; } - + /** * Scans the widgets for one with the appropriate * attached label. @@ -1133,7 +1134,7 @@ function isLabel($label) { } return false; } - + /** * Dispatches the value into the form encoded packet. * @param SimpleEncoding $encoding Form packet. @@ -1150,7 +1151,7 @@ function write(&$encoding) { * @subpackage WebTester */ class SimpleCheckboxGroup extends SimpleTagGroup { - + /** * Accessor for current selected widget or false * if none. @@ -1167,7 +1168,7 @@ function getValue() { } return $this->_coerceValues($values); } - + /** * Accessor for starting value that is active. * @return string/array Widget values or false if none. @@ -1183,7 +1184,7 @@ function getDefault() { } return $this->_coerceValues($values); } - + /** * Accessor for current set values. * @param string/array/boolean $values Either a single string, a @@ -1207,7 +1208,7 @@ function setValue($values) { } return true; } - + /** * Tests to see if a possible value set is legal. * @param string/array/boolean $values Either a single string, a @@ -1227,7 +1228,7 @@ function _valuesArePossible($values) { } return ($values == $matches); } - + /** * Converts the output to an appropriate format. This means * that no values is false, a single value is just that @@ -1245,7 +1246,7 @@ function _coerceValues($values) { return $values; } } - + /** * Converts false or string into array. The opposite of * the coercian method. @@ -1273,7 +1274,7 @@ function _makeArray($value) { * @subpackage WebTester */ class SimpleRadioGroup extends SimpleTagGroup { - + /** * Each tag is tried in turn until one is * successfully set. The others will be @@ -1295,7 +1296,7 @@ function setValue($value) { } return true; } - + /** * Tests to see if a value is allowed. * @param string Attempted value. @@ -1311,7 +1312,7 @@ function _valueIsPossible($value) { } return false; } - + /** * Accessor for current selected widget or false * if none. @@ -1328,7 +1329,7 @@ function getValue() { } return false; } - + /** * Accessor for starting value that is active. * @return string/boolean Value of first checked @@ -1352,7 +1353,7 @@ function getDefault() { * @subpackage WebTester */ class SimpleLabelTag extends SimpleTag { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -1361,7 +1362,7 @@ class SimpleLabelTag extends SimpleTag { function __construct($attributes) { parent::__construct('label', $attributes); } - + /** * Access for the ID to attach the label to. * @return string For attribute. @@ -1378,7 +1379,7 @@ function getFor() { * @subpackage WebTester */ class SimpleFormTag extends SimpleTag { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -1395,7 +1396,7 @@ function __construct($attributes) { * @subpackage WebTester */ class SimpleFrameTag extends SimpleTag { - + /** * Starts with a named tag with attributes only. * @param hash $attributes Attribute names and @@ -1404,7 +1405,7 @@ class SimpleFrameTag extends SimpleTag { function __construct($attributes) { parent::__construct('frame', $attributes); } - + /** * Tag contains no content. * @return boolean False. diff --git a/thirdparty/simpletest/url.php b/thirdparty/simpletest/url.php index 8bef380ab43..c70dca1bd8f 100644 --- a/thirdparty/simpletest/url.php +++ b/thirdparty/simpletest/url.php @@ -35,7 +35,7 @@ class SimpleUrl { var $_y; var $_target; var $_raw = false; - + /** * Constructor. Parses URL into sections. * @param string $url Incoming URL. @@ -57,7 +57,7 @@ function __construct($url = '') { $this->_fragment = (strncmp($url, "#", 1) == 0 ? substr($url, 1) : false); $this->_target = false; } - + /** * Extracts the X, Y coordinate pair from an image map. * @param string $url URL so far. The coordinates will be @@ -72,7 +72,7 @@ function _chompCoordinates(&$url) { } return array(false, false); } - + /** * Extracts the scheme part of an incoming URL. * @param string $url URL so far. The scheme will be @@ -87,7 +87,7 @@ function _chompScheme(&$url) { } return false; } - + /** * Extracts the username and password from the * incoming URL. The // prefix will be reattached @@ -114,7 +114,7 @@ function _chompLogin(&$url) { $url = $prefix . $url; return array(false, false); } - + /** * Extracts the host part of an incoming URL. * Includes the port number part. Will extract @@ -143,7 +143,7 @@ function _chompHost(&$url) { } return false; } - + /** * Extracts the path information from the incoming * URL. Strips this path from the URL. @@ -159,7 +159,7 @@ function _chompPath(&$url) { } return ''; } - + /** * Strips off the request data. * @param string $url URL so far. The request will be @@ -174,7 +174,7 @@ function _chompRequest(&$url) { } return ''; } - + /** * Breaks the request down into an object. * @param string $raw Raw request. @@ -193,7 +193,7 @@ function _parseRequest($raw) { } return $request; } - + /** * Accessor for protocol part. * @param string $default Value to use if not present. @@ -203,7 +203,7 @@ function _parseRequest($raw) { function getScheme($default = false) { return $this->_scheme ? $this->_scheme : $default; } - + /** * Accessor for user name. * @return string Username preceding host. @@ -212,7 +212,7 @@ function getScheme($default = false) { function getUsername() { return $this->_username; } - + /** * Accessor for password. * @return string Password preceding host. @@ -221,7 +221,7 @@ function getUsername() { function getPassword() { return $this->_password; } - + /** * Accessor for hostname and port. * @param string $default Value to use if not present. @@ -231,7 +231,7 @@ function getPassword() { function getHost($default = false) { return $this->_host ? $this->_host : $default; } - + /** * Accessor for top level domain. * @return string Last part of host. @@ -241,7 +241,7 @@ function getTld() { $path_parts = pathinfo($this->getHost()); return (isset($path_parts['extension']) ? $path_parts['extension'] : false); } - + /** * Accessor for port number. * @return integer TCP/IP port number. @@ -249,8 +249,8 @@ function getTld() { */ function getPort() { return $this->_port; - } - + } + /** * Accessor for path. * @return string Full path including leading slash if implied. @@ -262,7 +262,7 @@ function getPath() { } return $this->_path; } - + /** * Accessor for page if any. This may be a * directory name if ambiguious. @@ -275,7 +275,7 @@ function getPage() { } return $matches[1]; } - + /** * Gets the path to the page. * @return string Path less the page. @@ -287,7 +287,7 @@ function getBasePath() { } return $matches[1]; } - + /** * Accessor for fragment at end of URL after the "#". * @return string Part after "#". @@ -296,7 +296,7 @@ function getBasePath() { function getFragment() { return $this->_fragment; } - + /** * Sets image coordinates. Set to false to clear * them. @@ -312,7 +312,7 @@ function setCoordinates($x = false, $y = false) { $this->_x = (integer)$x; $this->_y = (integer)$y; } - + /** * Accessor for horizontal image coordinate. * @return integer X value. @@ -321,7 +321,7 @@ function setCoordinates($x = false, $y = false) { function getX() { return $this->_x; } - + /** * Accessor for vertical image coordinate. * @return integer Y value. @@ -330,7 +330,7 @@ function getX() { function getY() { return $this->_y; } - + /** * Accessor for current request parameters * in URL string form. Will return teh original request @@ -350,7 +350,7 @@ function getEncodedRequest() { } return ''; } - + /** * Adds an additional parameter to the request. * @param string $key Name of parameter. @@ -361,7 +361,7 @@ function addRequestParameter($key, $value) { $this->_raw = false; $this->_request->add($key, $value); } - + /** * Adds additional parameters to the request. * @param hash/SimpleFormEncoding $parameters Additional @@ -372,7 +372,7 @@ function addRequestParameters($parameters) { $this->_raw = false; $this->_request->merge($parameters); } - + /** * Clears down all parameters. * @access public @@ -381,7 +381,7 @@ function clearRequest() { $this->_raw = false; $this->_request = new SimpleGetEncoding(); } - + /** * Gets the frame target if present. Although * not strictly part of the URL specification it @@ -392,7 +392,7 @@ function clearRequest() { function getTarget() { return $this->_target; } - + /** * Attaches a frame target. * @param string $frame Name of frame. @@ -402,7 +402,7 @@ function setTarget($frame) { $this->_raw = false; $this->_target = $frame; } - + /** * Renders the URL back into a string. * @return string URL in canonical form. @@ -430,7 +430,7 @@ function asString() { $coords = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY(); return "$scheme$identity$host$port$path$encoded$fragment$coords"; } - + /** * Replaces unknown sections to turn a relative * URL into an absolute one. The base URL can @@ -462,7 +462,7 @@ function makeAbsolute($base) { $coords = $this->getX() === false ? '' : '?' . $this->getX() . ',' . $this->getY(); return new SimpleUrl("$scheme://$identity$host$port$path$encoded$fragment$coords"); } - + /** * Replaces unknown sections of the path with base parts * to return a complete absolute one. @@ -482,7 +482,7 @@ function _extractAbsolutePath($base) { } return $base->getPath(); } - + /** * Simple test to see if a path part is relative. * @param string $path Path to test. @@ -492,7 +492,7 @@ function _extractAbsolutePath($base) { function _isRelativePath($path) { return (substr($path, 0, 1) != '/'); } - + /** * Extracts the username and password for use in rendering * a URL. @@ -505,7 +505,7 @@ function getIdentity() { } return false; } - + /** * Replaces . and .. sections of the path. * @param string $path Unoptimised path. @@ -516,7 +516,7 @@ function normalisePath($path) { $path = preg_replace('|/\./|', '/', $path); return preg_replace('|/[^/]+/\.\./|', '/', $path); } - + /** * A pipe seperated list of all TLDs that result in two part * domain names. From 12a83d70aef7a36c5b5b403b86d4864402275eaa Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Thu, 27 Aug 2015 19:19:20 +1200 Subject: [PATCH 3/9] FIX: Removed PHP4 syntax from Diff.php Like SimpleTest, we should probably replace this for a new library, but for now this will help us achieve PHP7 support. --- core/Diff.php | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/core/Diff.php b/core/Diff.php index d76fd379e35..dc4a05070ab 100644 --- a/core/Diff.php +++ b/core/Diff.php @@ -14,12 +14,7 @@ // You may copy this code freely under the conditions of the GPL. // -// FIXME: possibly remove assert()'s for production version? - -// PHP3 does not have assert() -/** - */ -define('USE_ASSERTS', function_exists('assert')); +define('USE_ASSERTS', true); /** * @package framework @@ -52,7 +47,7 @@ public function nfinal() { class _DiffOp_Copy extends _DiffOp { var $type = 'copy'; - public function _DiffOp_Copy ($orig, $final = false) { + public function __construct ($orig, $final = false) { if (!is_array($final)) $final = $orig; $this->orig = $orig; @@ -72,7 +67,7 @@ public function reverse() { class _DiffOp_Delete extends _DiffOp { var $type = 'delete'; - public function _DiffOp_Delete ($lines) { + public function __construct ($lines) { $this->orig = $lines; $this->final = false; } @@ -90,7 +85,7 @@ public function reverse() { class _DiffOp_Add extends _DiffOp { var $type = 'add'; - public function _DiffOp_Add ($lines) { + public function __construct ($lines) { $this->final = $lines; $this->orig = false; } @@ -108,7 +103,7 @@ public function reverse() { class _DiffOp_Change extends _DiffOp { var $type = 'change'; - public function _DiffOp_Change ($orig, $final) { + public function __construct ($orig, $final) { $this->orig = $orig; $this->final = $final; } @@ -541,7 +536,7 @@ class Diff * (Typically these are lines from a file.) * @param $to_lines array An array of strings. */ - public function Diff($from_lines, $to_lines) { + public function __construct($from_lines, $to_lines) { $eng = new _DiffEngine; $this->edits = $eng->diff($from_lines, $to_lines); //$this->_check($from_lines, $to_lines); @@ -853,13 +848,13 @@ class MappedDiff * @param $mapped_to_lines array This array should * have the same number of elements as $to_lines. */ - public function MappedDiff($from_lines, $to_lines, + public function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) { assert(sizeof($from_lines) == sizeof($mapped_from_lines)); assert(sizeof($to_lines) == sizeof($mapped_to_lines)); - $this->Diff($mapped_from_lines, $mapped_to_lines); + parent::__construct($mapped_from_lines, $mapped_to_lines); $xi = $yi = 0; // Optimizing loop invariants: From 083799ec03899b8388352849cbdc42e4c74fbf4d Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Fri, 28 Aug 2015 09:07:55 +1200 Subject: [PATCH 4/9] FIX: Minimal data-model changes to support PHP7. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tidiest fix for this will be to update the namespace/naming of all field types to follow this pattern. I’ve broken out the minimum necessary to support PHP7 as its own commit, in case anyone needs to backport that (e.g. if someone wanted to patch a SS 3 system to get PHP7 support). Rather than introduce a new API for fieldtype namespace simplification, I’ve just used Injector. We may come up with a new configuration tool that is better, but this has the advantage of existing now, and as such I think is a good first step. --- _config/model.yml | 5 +++++ model/fieldtypes/Double.php | 5 ++++- model/fieldtypes/Float.php | 9 ++++++++- model/fieldtypes/ForeignKey.php | 5 ++++- model/fieldtypes/Int.php | 12 +++++++++++- model/fieldtypes/PrimaryKey.php | 5 ++++- tests/model/VersionedTest.php | 4 ++-- 7 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 _config/model.yml diff --git a/_config/model.yml b/_config/model.yml new file mode 100644 index 00000000000..2a70612b0a2 --- /dev/null +++ b/_config/model.yml @@ -0,0 +1,5 @@ +Injector: + Int: + class: SilverStripe\Model\FieldType\DBInt + Float: + class: SilverStripe\Model\FieldType\DBFloat diff --git a/model/fieldtypes/Double.php b/model/fieldtypes/Double.php index 5d94458652b..0ed535d49bc 100644 --- a/model/fieldtypes/Double.php +++ b/model/fieldtypes/Double.php @@ -1,10 +1,13 @@ defaultVal = is_float($defaultVal) ? $defaultVal : (float) 0; diff --git a/model/fieldtypes/ForeignKey.php b/model/fieldtypes/ForeignKey.php index 56ad99e7012..f75814614b2 100644 --- a/model/fieldtypes/ForeignKey.php +++ b/model/fieldtypes/ForeignKey.php @@ -1,4 +1,7 @@ defaultVal = is_int($defaultVal) ? $defaultVal : 0; @@ -64,3 +73,4 @@ public function prepValueForDB($value) { } + diff --git a/model/fieldtypes/PrimaryKey.php b/model/fieldtypes/PrimaryKey.php index 8b900dda004..d82404e2405 100644 --- a/model/fieldtypes/PrimaryKey.php +++ b/model/fieldtypes/PrimaryKey.php @@ -1,4 +1,7 @@ assertInstanceOf('Int', $obj->dbObject('Version')); + $this->assertInstanceOf('SilverStripe\\Model\\FieldType\\DBInt', $obj->dbObject('Version')); $obj2 = new VersionedTest_Subclass(); // Check that the Version column is added as a full-fledged column - $this->assertInstanceOf('Int', $obj2->dbObject('Version')); + $this->assertInstanceOf('SilverStripe\\Model\\FieldType\\DBInt', $obj2->dbObject('Version')); } public function testVersionedFieldsNotInCMS() { From 8518fc142556c3992d0a485c4b3e90e2095f4c0c Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Fri, 28 Aug 2015 09:09:11 +1200 Subject: [PATCH 5/9] FIX: Clarify PHP7-incompatible call styles. These call signatures have changed their meaning in PHP7. The new disambiguated form should work in all versions. --- model/connect/DBSchemaManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/connect/DBSchemaManager.php b/model/connect/DBSchemaManager.php index 372b3edf8a6..c1c3814144c 100644 --- a/model/connect/DBSchemaManager.php +++ b/model/connect/DBSchemaManager.php @@ -586,7 +586,7 @@ public function requireField($table, $field, $spec) { $spec['parts']['name'] = $field; $spec_orig['parts']['name'] = $field; //Convert the $spec array into a database-specific string - $spec = $this->$spec['type']($spec['parts'], true); + $spec = $this->{$spec['type']}($spec['parts'], true); } // Collations didn't come in until MySQL 4.1. Anything earlier will throw a syntax error if you try and use @@ -623,7 +623,7 @@ public function requireField($table, $field, $spec) { // Get the version of the field as we would create it. This is used for comparison purposes to see if the // existing field is different to what we now want if (is_array($spec_orig)) { - $spec_orig = $this->$spec_orig['type']($spec_orig['parts']); + $spec_orig = $this->{$spec_orig['type']}($spec_orig['parts']); } if ($newTable || $fieldValue == '') { From 52ca089d0bb01a8a588ecaecbf841f92e9cec050 Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Fri, 28 Aug 2015 09:43:22 +1200 Subject: [PATCH 6/9] NEW: Ensure php7 builds pass. SilverStripe 4 should work in php7, so we shouldn't accept its failure. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 412ab9e538d..820e2e467d6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,8 @@ matrix: env: DB=MYSQL PDO=1 - php: 5.6 env: DB=MYSQL BEHAT_TEST=1 JS_SANITY_CHECK=1 + - php: 7.0 + env: DB=MYSQL PDO=1 before_script: # Until http://pecl.php.net/package/imagick is working again From 262f487053f91fbd038c0163545e1d2176bb7852 Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Sat, 29 Aug 2015 16:20:00 +1200 Subject: [PATCH 7/9] MINOR: Avoid access-changing subclass in test. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using a subclass to change the visibility of protected items didn’t seem necessary in this case, if we add a reasonably logical getter method. --- core/Config.php | 7 +++++++ tests/core/ConfigTest.php | 28 ++++++++++++---------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/core/Config.php b/core/Config.php index 31662b645f0..86fc577ae35 100644 --- a/core/Config.php +++ b/core/Config.php @@ -796,6 +796,13 @@ public function clean($tag = null) { $this->indexing = array(); } } + + /** + * Return the numbers of items in the index + */ + public function getIndexCount() { + return count($this->indexing); + } } /** diff --git a/tests/core/ConfigTest.php b/tests/core/ConfigTest.php index f12b16f547b..58904e8455a 100644 --- a/tests/core/ConfigTest.php +++ b/tests/core/ConfigTest.php @@ -295,46 +295,42 @@ public function testCacheCleaning() { } public function testLRUDiscarding() { - $cache = new ConfigTest_Config_LRU(); + $cache = new Config_LRU(); for ($i = 0; $i < Config_LRU::SIZE*2; $i++) $cache->set($i, $i); $this->assertEquals( - Config_LRU::SIZE, count($cache->indexing), + Config_LRU::SIZE, $cache->getIndexCount(), 'Homogenous usage gives exact discarding' ); - $cache = new ConfigTest_Config_LRU(); + $cache = new Config_LRU(); for ($i = 0; $i < Config_LRU::SIZE; $i++) $cache->set($i, $i); for ($i = 0; $i < Config_LRU::SIZE; $i++) $cache->set(-1, -1); $this->assertLessThan( - Config_LRU::SIZE, count($cache->indexing), + Config_LRU::SIZE, $cache->getIndexCount(), 'Heterogenous usage gives sufficient discarding' ); } + public function testLRUCleaning() { - $cache = new ConfigTest_Config_LRU(); + $cache = new Config_LRU(); for ($i = 0; $i < Config_LRU::SIZE; $i++) $cache->set($i, $i); - $this->assertEquals(Config_LRU::SIZE, count($cache->indexing)); + $this->assertEquals(Config_LRU::SIZE, $cache->getIndexCount()); $cache->clean(); - $this->assertEquals(0, count($cache->indexing), 'Clean clears all items'); + $this->assertEquals(0, $cache->getIndexCount(), 'Clean clears all items'); $this->assertFalse($cache->get(1), 'Clean clears all items'); $cache->set(1, 1, array('Foo')); - $this->assertEquals(1, count($cache->indexing)); + $this->assertEquals(1, $cache->getIndexCount()); $cache->clean('Foo'); - $this->assertEquals(0, count($cache->indexing), 'Clean items with matching tag'); + $this->assertEquals(0, $cache->getIndexCount(), 'Clean items with matching tag'); $this->assertFalse($cache->get(1), 'Clean items with matching tag'); $cache->set(1, 1, array('Foo', 'Bar')); - $this->assertEquals(1, count($cache->indexing)); + $this->assertEquals(1, $cache->getIndexCount()); $cache->clean('Bar'); - $this->assertEquals(0, count($cache->indexing), 'Clean items with any single matching tag'); + $this->assertEquals(0, $cache->getIndexCount(), 'Clean items with any single matching tag'); $this->assertFalse($cache->get(1), 'Clean items with any single matching tag'); } } -class ConfigTest_Config_LRU extends Config_LRU implements TestOnly { - public $cache; - public $indexing; -} - class ConfigTest_Config_MemCache extends Config_MemCache implements TestOnly { public $cache; From aeccb8b8e05f1b26d5ee77075809d330fcedbb4a Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Sun, 30 Aug 2015 17:02:55 +1200 Subject: [PATCH 8/9] API: Move DBField subclasses into SilverStripe\Model\FieldType namespace API: Deprecate SS_Datetime. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DBField subclasses are have all been renamed to start with “DB” and be in the SilverStripe\Model\FieldType namespace. To keep DataObject definitions concise, the original short variations of their names are preserved as service definitions. Most of the field generation code doesn’t need to change, but where field classes are referenced directly, changes will be needed. SS_Datetime, which is commonly referenced outside the model system itself, has been preserved as a subclass of DBDatetime. This has been marked as deprecated and can be removed in SilverStripe 5. A few places that referred to $db and $casting values weren’t using the Injector to instantiate the relevant classes. This meant that the remapping we have created as part of moving classes into a namespace didn’t work. --- _config/model.yml | 52 ++- admin/code/LeftAndMain.php | 3 +- api/RSSFeed.php | 7 +- control/CookieJar.php | 4 +- dev/SapphireTest.php | 6 +- .../02_Developer_Guides/14_Files/02_Images.md | 4 +- docs/en/04_Changelogs/4.0.0.md | 56 +++- filesystem/AssetControlExtension.php | 8 +- filesystem/ImageManipulation.php | 4 +- filesystem/storage/DBFile.php | 15 +- forms/AssetField.php | 1 + forms/CurrencyField.php | 4 +- forms/DateField.php | 5 +- forms/DatetimeField.php | 3 + forms/InlineFormAction.php | 3 + forms/MoneyField.php | 6 +- forms/NullableField.php | 2 + forms/gridfield/GridField.php | 2 + forms/gridfield/GridFieldPrintButton.php | 4 +- model/DataDifferencer.php | 3 + model/DataObject.php | 20 +- .../Boolean.php => FieldType/DBBoolean.php} | 9 +- .../{fieldtypes => FieldType}/DBClassName.php | 9 +- .../DBComposite.php} | 13 +- .../Currency.php => FieldType/DBCurrency.php} | 9 +- .../Date.php => FieldType/DBDate.php} | 25 +- .../Datetime.php => FieldType/DBDatetime.php} | 19 +- .../Decimal.php => FieldType/DBDecimal.php} | 8 +- .../Double.php => FieldType/DBDouble.php} | 7 +- .../Enum.php => FieldType/DBEnum.php} | 10 +- model/{fieldtypes => FieldType}/DBField.php | 8 + .../Float.php => FieldType/DBFloat.php} | 1 - .../DBForeignKey.php} | 10 +- .../HTMLText.php => FieldType/DBHTMLText.php} | 13 +- .../DBHTMLVarchar.php} | 9 +- .../Int.php => FieldType/DBInt.php} | 1 - model/{fieldtypes => FieldType}/DBLocale.php | 7 +- .../Money.php => FieldType/DBMoney.php} | 11 +- .../DBMultiEnum.php} | 7 +- .../DBPercentage.php} | 5 +- .../DBPolymorphicForeignKey.php} | 8 +- .../DBPrimaryKey.php} | 9 +- .../DBString.php} | 7 +- .../Text.php => FieldType/DBText.php} | 13 +- .../Time.php => FieldType/DBTime.php} | 11 +- .../Varchar.php => FieldType/DBVarchar.php} | 10 +- .../Year.php => FieldType/DBYear.php} | 8 +- model/FieldType/SS_Datetime.php | 49 +++ model/ManyManyList.php | 4 +- security/Member.php | 7 +- security/PermissionCheckboxSetField.php | 3 + tests/core/ArrayDataTest.php | 6 +- tests/dev/CsvBulkLoaderTest.php | 2 + tests/dev/FixtureBlueprintTest.php | 2 +- tests/filesystem/AssetStoreTest.php | 1 + tests/forms/CurrencyFieldTest.php | 6 +- tests/forms/EnumFieldTest.php | 7 +- tests/forms/LookupFieldTest.php | 16 +- tests/forms/MoneyFieldTest.php | 7 +- tests/model/DBClassNameTest.php | 2 + ...iteDBFieldTest.php => DBCompositeTest.php} | 34 +- .../{CurrencyTest.php => DBCurrencyTest.php} | 7 +- tests/model/{DateTest.php => DBDateTest.php} | 14 +- tests/model/DBFieldTest.php | 16 +- .../{HTMLTextTest.php => DBHTMLTextTest.php} | 26 +- tests/model/DBLocaleTest.php | 9 +- .../model/{MoneyTest.php => DBMoneyTest.php} | 47 +-- ...ercentageTest.php => DBPercentageTest.php} | 9 +- .../{StringFieldTest.php => DBStringTest.php} | 14 +- tests/model/{TextTest.php => DBTextTest.php} | 18 +- tests/model/{YearTest.php => DBYearTest.php} | 9 +- tests/model/DataExtensionTest.php | 2 +- .../model/DataObjectSchemaGenerationTest.php | 2 + tests/model/DataObjectTest.php | 11 +- tests/model/DatetimeTest.php | 220 ------------- tests/model/DbDatetimeTest.php | 307 +++++++++++------- tests/model/ImageTest.php | 10 +- tests/model/LabelFieldTest.php | 2 +- tests/model/ManyManyListTest.php | 6 +- tests/model/VersionedTest.php | 22 +- tests/security/SecurityTest.php | 6 +- tests/view/ViewableDataTest.php | 2 +- view/SSViewer.php | 4 +- view/ViewableData.php | 9 +- 84 files changed, 837 insertions(+), 540 deletions(-) rename model/{fieldtypes/Boolean.php => FieldType/DBBoolean.php} (93%) rename model/{fieldtypes => FieldType}/DBClassName.php (97%) rename model/{fieldtypes/CompositeDBField.php => FieldType/DBComposite.php} (96%) rename model/{fieldtypes/Currency.php => FieldType/DBCurrency.php} (92%) rename model/{fieldtypes/Date.php => FieldType/DBDate.php} (95%) rename model/{fieldtypes/Datetime.php => FieldType/DBDatetime.php} (93%) rename model/{fieldtypes/Decimal.php => FieldType/DBDecimal.php} (95%) rename model/{fieldtypes/Double.php => FieldType/DBDouble.php} (80%) rename model/{fieldtypes/Enum.php => FieldType/DBEnum.php} (96%) rename model/{fieldtypes => FieldType}/DBField.php (98%) rename model/{fieldtypes/Float.php => FieldType/DBFloat.php} (99%) rename model/{fieldtypes/ForeignKey.php => FieldType/DBForeignKey.php} (92%) rename model/{fieldtypes/HTMLText.php => FieldType/DBHTMLText.php} (97%) rename model/{fieldtypes/HTMLVarchar.php => FieldType/DBHTMLVarchar.php} (87%) rename model/{fieldtypes/Int.php => FieldType/DBInt.php} (99%) rename model/{fieldtypes => FieldType}/DBLocale.php (94%) rename model/{fieldtypes/Money.php => FieldType/DBMoney.php} (97%) rename model/{fieldtypes/MultiEnum.php => FieldType/DBMultiEnum.php} (93%) rename model/{fieldtypes/Percentage.php => FieldType/DBPercentage.php} (91%) rename model/{fieldtypes/PolymorphicForeignKey.php => FieldType/DBPolymorphicForeignKey.php} (93%) rename model/{fieldtypes/PrimaryKey.php => FieldType/DBPrimaryKey.php} (91%) rename model/{fieldtypes/StringField.php => FieldType/DBString.php} (98%) rename model/{fieldtypes/Text.php => FieldType/DBText.php} (98%) rename model/{fieldtypes/Time.php => FieldType/DBTime.php} (94%) rename model/{fieldtypes/Varchar.php => FieldType/DBVarchar.php} (95%) rename model/{fieldtypes/Year.php => FieldType/DBYear.php} (91%) create mode 100644 model/FieldType/SS_Datetime.php rename tests/model/{CompositeDBFieldTest.php => DBCompositeTest.php} (74%) rename tests/model/{CurrencyTest.php => DBCurrencyTest.php} (90%) rename tests/model/{DateTest.php => DBDateTest.php} (96%) rename tests/model/{HTMLTextTest.php => DBHTMLTextTest.php} (92%) rename tests/model/{MoneyTest.php => DBMoneyTest.php} (90%) rename tests/model/{PercentageTest.php => DBPercentageTest.php} (82%) rename tests/model/{StringFieldTest.php => DBStringTest.php} (84%) rename tests/model/{TextTest.php => DBTextTest.php} (95%) rename tests/model/{YearTest.php => DBYearTest.php} (88%) delete mode 100644 tests/model/DatetimeTest.php diff --git a/_config/model.yml b/_config/model.yml index 2a70612b0a2..2ea94265c25 100644 --- a/_config/model.yml +++ b/_config/model.yml @@ -1,5 +1,53 @@ Injector: - Int: - class: SilverStripe\Model\FieldType\DBInt + Boolean: + class: SilverStripe\Model\FieldType\DBBoolean + Currency: + class: SilverStripe\Model\FieldType\DBCurrency + DBClassName: + class: SilverStripe\Model\FieldType\DBClassName + Date: + class: SilverStripe\Model\FieldType\DBDate + Datetime: + class: SilverStripe\Model\FieldType\DBDatetime + SS_Datetime: + class: SilverStripe\Model\FieldType\DBDatetime + Decimal: + class: SilverStripe\Model\FieldType\DBDecimal + Double: + class: SilverStripe\Model\FieldType\DBDouble + Enum: + class: SilverStripe\Model\FieldType\DBEnum + DBFile: + class: SilverStripe\Filesystem\Storage\DBFile Float: class: SilverStripe\Model\FieldType\DBFloat + ForeignKey: + class: SilverStripe\Model\FieldType\DBForeignKey + HTMLText: + class: SilverStripe\Model\FieldType\DBHTMLText + HTMLVarchar: + class: SilverStripe\Model\FieldType\DBHTMLVarchar + Int: + class: SilverStripe\Model\FieldType\DBInt + Locale: + class: SilverStripe\Model\FieldType\DBLocale + DBLocale: + class: SilverStripe\Model\FieldType\DBLocale + Money: + class: SilverStripe\Model\FieldType\DBMoney + MultiEnum: + class: SilverStripe\Model\FieldType\DBMultiEnum + Percentage: + class: SilverStripe\Model\FieldType\DBPercentage + PolymorphicForeignKey: + class: SilverStripe\Model\FieldType\DBPolymorphicForeignKey + PrimaryKey: + class: SilverStripe\Model\FieldType\DBPrimaryKey + Text: + class: SilverStripe\Model\FieldType\DBText + Time: + class: SilverStripe\Model\FieldType\DBTime + Varchar: + class: SilverStripe\Model\FieldType\DBVarchar + Year: + class: SilverStripe\Model\FieldType\DBYear diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 74f0e255017..43632419307 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -6,6 +6,7 @@ */ use SilverStripe\Forms\Schema\FormSchema; +use SilverStripe\Model\FieldType\DBField; /** * LeftAndMain is the parent class of all the two-pane views in the CMS. @@ -1824,7 +1825,7 @@ public function BaseCSSClasses() { * @return String */ public function Locale() { - return DBField::create_field('DBLocale', i18n::get_locale()); + return DBField::create_field('Locale', i18n::get_locale()); } public function providePermissions() { diff --git a/api/RSSFeed.php b/api/RSSFeed.php index 22d6d704ec2..26483d42928 100644 --- a/api/RSSFeed.php +++ b/api/RSSFeed.php @@ -1,4 +1,7 @@ setValue($value); return $obj; } else { - $obj = new $defaultClass($fieldName); - $obj->setValue($this->failover->XML_val($fieldName)); - return $obj; + return DBField::create_field($defaultClass, $this->failover->XML_val($fieldName), $fieldName); } } } diff --git a/control/CookieJar.php b/control/CookieJar.php index 2b2a80c5810..e60093ef793 100644 --- a/control/CookieJar.php +++ b/control/CookieJar.php @@ -1,5 +1,7 @@ Format('U') + (86400 * $expiry); + $expiry = $clear ? -1 : DBDatetime::now()->Format('U') + (86400 * $expiry); } //set the path up $path = $path ? $path : Director::baseURL(); diff --git a/dev/SapphireTest.php b/dev/SapphireTest.php index 288d142d455..179de3c35db 100644 --- a/dev/SapphireTest.php +++ b/dev/SapphireTest.php @@ -1,4 +1,8 @@ originalIsRunningTest = null; // Reset mocked datetime - SS_Datetime::clear_mock_now(); + DBDatetime::clear_mock_now(); // Stop the redirection that might have been requested in the test. // Note: Ideally a clean Controller should be created for each test. diff --git a/docs/en/02_Developer_Guides/14_Files/02_Images.md b/docs/en/02_Developer_Guides/14_Files/02_Images.md index ef98e56ef45..ead5221b5bf 100644 --- a/docs/en/02_Developer_Guides/14_Files/02_Images.md +++ b/docs/en/02_Developer_Guides/14_Files/02_Images.md @@ -133,7 +133,7 @@ You can also create your own functions by decorating the `Image` class. Image: extensions: - MyImage - DBFile: + SilverStripe\Filesystem\Storage\DBFile: extensions: - MyImage @@ -166,7 +166,7 @@ mysite/config/config.yml file: File: force_resample: true # DBFile can be configured independently - DBFile: + SilverStripe\Filesystem\Storage\DBFile: force_resample: true If you are intending to resample images with SilverStripe it is good practice diff --git a/docs/en/04_Changelogs/4.0.0.md b/docs/en/04_Changelogs/4.0.0.md index 570f9dc8b3f..011b015cc53 100644 --- a/docs/en/04_Changelogs/4.0.0.md +++ b/docs/en/04_Changelogs/4.0.0.md @@ -445,7 +445,7 @@ After: // in _config.php File::add_extension('MyImageExtension'); - DBFile::add_extension('MyImageExtension'); + SilverStripe\Filesystem\Storage\DBFile::add_extension('MyImageExtension'); There are a few differences in this new API: @@ -461,14 +461,14 @@ There are a few differences in this new API: ### Upgrading code that uses composite db fields. -`CompositeDBField` is now an abstract class, not an interface. In many cases, custom code that handled -saving of content into composite fields can be removed, as it is now handled by the base class. +The `CompositeDBField` interface has been replaced with an abstract class, `DBComposite`. In many cases, custom code +that handled saving of content into composite fields can be removed, as it is now handled by the base class. The below describes the minimum amount of effort required to implement a composite DB field. :::php 'Varchar(200)', @@ -712,4 +712,50 @@ Images inserted into `HTMLText` fields (through a WYSIWYG editor) need to be tra Instead of `` tags, the field will insert `[image]` shortcodes which point to the database identifier of the `Image` record rather than its path on the filesystem. The shortcode will be automatically replaced when the field is rendered. Newly inserted images will automatically receive the shortcode and ownership tracking, -and existing `` will continue to work. \ No newline at end of file +and existing `` will continue to work. + +### Upgrading references to DBField and subclasses + +A major change in 4.0 is the introduction of namespaced DBField subclasses. Now as a standard, all DBField subclasses have a `DB` prefix, are namespaced, and have an associative alias which omits the DB prefix. + +This means that for the most part, code that worked in 3.0 won't need to be changed, although if you have any hard class literals which reference the old classes, they will need to be updated to point to the new namespaced classes. + +An exception to this is any classes which once had the `SS_` prefix, which will now be instead prefixed with `DB`, and have an un-aliased prefix. For example `SS_Datetime` is now `DBDateTime`, and has the alias `DateTime` which may be used in config. + +For example: + + class MyObject extends DataObject { + private static $db = array( + 'Number' => 'Int', + 'Time' => 'SS_Datetime' + ); + + /** + * @param Int $val + * @return Varchar + */ + public function TextNumber() { + return new Varchar('TextNumber', 'Number is ' . $this->Number); + } + } + +Will become: + + use SilverStripe\Model\FieldType\DBVarchar; + + class MyObject extends DataObject { + private static $db = array( + 'Number' => 'Int', + 'Time' => 'Datetime' + ); + + /** + * @param Int $val + * @return Varchar + */ + public function TextNumber() { + return new DBVarchar('TextNumber', 'Number is ' . $this->Number); + } + } + +Note that string references to SS_Datetime passed to injector, or used in config values, will still work, and will refer to the updated class names. diff --git a/filesystem/AssetControlExtension.php b/filesystem/AssetControlExtension.php index b987a921db8..7dcd070a429 100644 --- a/filesystem/AssetControlExtension.php +++ b/filesystem/AssetControlExtension.php @@ -7,6 +7,7 @@ use Member; use Versioned; use SilverStripe\Filesystem\Storage\AssetStore; +use SilverStripe\Filesystem\Storage\DBFile; /** * This class provides the necessary business logic to ensure that any assets attached @@ -210,10 +211,9 @@ protected function findAssets(DataObject $record) // Search for dbfile instances $files = array(); foreach ($record->db() as $field => $db) { - // Extract assets from this database field - list($dbClass) = explode('(', $db); - if (!is_a($dbClass, 'DBFile', true)) { - continue; + $fieldObj = $record->$field; + if(!is_object($fieldObj) || !($record->$field instanceof DBFile)) { + continue; } // Omit variant and merge with set diff --git a/filesystem/ImageManipulation.php b/filesystem/ImageManipulation.php index c5256bcd75d..0324924465e 100644 --- a/filesystem/ImageManipulation.php +++ b/filesystem/ImageManipulation.php @@ -4,8 +4,8 @@ use Config; use Convert; -use DBField; -use DBFile; +use SilverStripe\Model\FieldType\DBField; +use SilverStripe\Filesystem\Storage\DBFile; use HTMLText; use Image_Backend; use Injector; diff --git a/filesystem/storage/DBFile.php b/filesystem/storage/DBFile.php index 4e2c602a558..1acd2359951 100644 --- a/filesystem/storage/DBFile.php +++ b/filesystem/storage/DBFile.php @@ -1,11 +1,20 @@ value = Config::inst()->get('Currency','currency_symbol') . number_format((double)preg_replace('/[^0-9.\-]/', '', $val), 2); + $this->value = Config::inst()->get('SilverStripe\Model\FieldType\DBCurrency','currency_symbol') . number_format((double)preg_replace('/[^0-9.\-]/', '', $val), 2); return $this; } /** @@ -44,7 +44,7 @@ public function performReadonlyTransformation() { } public function validate($validator) { - $currencySymbol = preg_quote(Config::inst()->get('Currency','currency_symbol')); + $currencySymbol = preg_quote(Config::inst()->get('SilverStripe\Model\FieldType\DBCurrency', 'currency_symbol')); $regex = '/^\s*(\-?'.$currencySymbol.'?|'.$currencySymbol.'\-?)?(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?\s*$/'; if(!empty ($this->value) && !preg_match($regex, $this->value)) { diff --git a/forms/DateField.php b/forms/DateField.php index ff2e5459d15..90065b7d723 100644 --- a/forms/DateField.php +++ b/forms/DateField.php @@ -1,4 +1,7 @@ valueObj->toString($this->getConfig('dateformat')) . ' ('._t('DateField.TODAY','today').')'); } else { - $df = new Date($this->name); + $df = new DBDate($this->name); $df->setValue($this->dataValue()); $val = Convert::raw2xml($this->valueObj->toString($this->getConfig('dateformat')) . ', ' . $df->Ago()); diff --git a/forms/DatetimeField.php b/forms/DatetimeField.php index cff9fdbdbfa..e57847ef7a7 100644 --- a/forms/DatetimeField.php +++ b/forms/DatetimeField.php @@ -1,4 +1,7 @@ fieldCurrency->setValue($val['Currency']); $this->fieldAmount->setValue($val['Amount']); - } elseif($val instanceof Money) { + } elseif($val instanceof DBMoney) { $this->fieldCurrency->setValue($val->getCurrency()); $this->fieldAmount->setValue($val->getAmount()); } diff --git a/forms/NullableField.php b/forms/NullableField.php index 0223601af7e..ad1b3adc7fa 100644 --- a/forms/NullableField.php +++ b/forms/NullableField.php @@ -1,5 +1,7 @@ $this->getTitle($gridField), "Header" => $header, "ItemRows" => $itemRows, - "Datetime" => SS_Datetime::now(), + "Datetime" => DBDatetime::now(), "Member" => Member::currentUser(), )); diff --git a/model/DataDifferencer.php b/model/DataDifferencer.php index 7973fd45ad0..17bc68599ba 100644 --- a/model/DataDifferencer.php +++ b/model/DataDifferencer.php @@ -1,4 +1,7 @@ get($class, 'db', Config::UNINHERITED) ?: array(); foreach($db as $fieldName => $fieldSpec) { $fieldClass = strtok($fieldSpec, '('); - if(is_subclass_of($fieldClass, 'CompositeDBField')) { + if(singleton($fieldClass) instanceof DBComposite) { $compositeFields[$fieldName] = $fieldSpec; } else { $dbFields[$fieldName] = $fieldSpec; @@ -312,7 +320,7 @@ protected static function cache_database_fields($class) { /** * Get all database columns explicitly defined on a class in {@link DataObject::$db} - * and {@link DataObject::$has_one}. Resolves instances of {@link CompositeDBField} + * and {@link DataObject::$has_one}. Resolves instances of {@link DBComposite} * into the actual database fields, rather than the name of the field which * might not equate a database column. * @@ -321,7 +329,7 @@ protected static function cache_database_fields($class) { * * Can be called directly on an object. E.g. Member::custom_database_fields() * - * @uses CompositeDBField->compositeDatabaseFields() + * @uses DBComposite->compositeDatabaseFields() * * @param string $class Class name to query from * @return array Map of fieldname to specification, similiar to {@link DataObject::$db}. @@ -1348,7 +1356,7 @@ protected function writeManipulation($baseTable, $now, $isNewRecord) { * @throws ValidationException Exception that can be caught and handled by the calling function */ public function write($showDebug = false, $forceInsert = false, $forceWrite = false, $writeComponents = false) { - $now = SS_Datetime::now()->Rfc2822(); + $now = DBDatetime::now()->Rfc2822(); // Execute pre-write tasks $this->preWrite(); @@ -2421,7 +2429,7 @@ public function getChangedFields($databaseFieldsOnly = false, $changeLevel = sel // Update the changed array with references to changed obj-fields foreach($this->record as $k => $v) { - // Prevents CompositeDBFields infinite looping on isChanged + // Prevents DBComposite infinite looping on isChanged if(is_array($databaseFieldsOnly) && !in_array($k, $databaseFieldsOnly)) { continue; } @@ -2504,7 +2512,7 @@ public function setField($fieldName, $val) { // Situation 1a: Composite fields should remain bound in case they are // later referenced to update the parent dataobject - if($val instanceof CompositeDBField) { + if($val instanceof DBComposite) { $val->bindTo($this); $this->record[$fieldName] = $val; } diff --git a/model/fieldtypes/Boolean.php b/model/FieldType/DBBoolean.php similarity index 93% rename from model/fieldtypes/Boolean.php rename to model/FieldType/DBBoolean.php index a60f338a6f3..209f05b777c 100644 --- a/model/fieldtypes/Boolean.php +++ b/model/FieldType/DBBoolean.php @@ -1,11 +1,18 @@ defaultVal = ($defaultVal) ? 1 : 0; diff --git a/model/fieldtypes/DBClassName.php b/model/FieldType/DBClassName.php similarity index 97% rename from model/fieldtypes/DBClassName.php rename to model/FieldType/DBClassName.php index cb6ca45324f..9c1ad7fb720 100644 --- a/model/fieldtypes/DBClassName.php +++ b/model/FieldType/DBClassName.php @@ -1,12 +1,19 @@ -* class Street extends CompositeDBField { +* class Street extends DBComposite { * private static $composite_db = return array( * "Number" => "Int", * "Name" => "Text" @@ -18,7 +25,7 @@ * @package framework * @subpackage model */ -abstract class CompositeDBField extends DBField { +abstract class DBComposite extends DBField { /** * Similiar to {@link DataObject::$db}, @@ -145,7 +152,7 @@ public function setValue($value, $record = null, $markChanged = true) { foreach($this->compositeDatabaseFields() as $field => $spec) { // Check value - if($value instanceof CompositeDBField) { + if($value instanceof DBComposite) { // Check if saving from another composite field $this->setField($field, $value->getField($field)); diff --git a/model/fieldtypes/Currency.php b/model/FieldType/DBCurrency.php similarity index 92% rename from model/fieldtypes/Currency.php rename to model/FieldType/DBCurrency.php index 30e95cab7c2..a02e031c114 100644 --- a/model/fieldtypes/Currency.php +++ b/model/FieldType/DBCurrency.php @@ -1,4 +1,9 @@ currency_symbol = $value; + DBCurrency::config()->currency_symbol = $value; } } diff --git a/model/fieldtypes/Date.php b/model/FieldType/DBDate.php similarity index 95% rename from model/fieldtypes/Date.php rename to model/FieldType/DBDate.php index f1ebacca385..11b716eb37d 100644 --- a/model/fieldtypes/Date.php +++ b/model/FieldType/DBDate.php @@ -1,4 +1,15 @@ value) { - $time = SS_Datetime::now()->Format('U'); + $time = DBDatetime::now()->Format('U'); if(strtotime($this->value) == $time || $time > strtotime($this->value)) { return _t( 'Date.TIMEDIFFAGO', @@ -253,7 +264,7 @@ public function Ago($includeSeconds = true, $significance = 2) { public function TimeDiff($includeSeconds = true, $significance = 2) { if(!$this->value) return false; - $time = SS_Datetime::now()->Format('U'); + $time = DBDatetime::now()->Format('U'); $ago = abs($time - strtotime($this->value)); if($ago < 60 && !$includeSeconds) { return _t('Date.LessThanMinuteAgo', 'less than a minute'); @@ -282,7 +293,7 @@ public function TimeDiff($includeSeconds = true, $significance = 2) { public function TimeDiffIn($format) { if(!$this->value) return false; - $time = SS_Datetime::now()->Format('U'); + $time = DBDatetime::now()->Format('U'); $ago = abs($time - strtotime($this->value)); switch($format) { @@ -323,7 +334,7 @@ public function requireField() { * @return boolean */ public function InPast() { - return strtotime($this->value) < SS_Datetime::now()->Format('U'); + return strtotime($this->value) < DBDatetime::now()->Format('U'); } /** @@ -331,7 +342,7 @@ public function InPast() { * @return boolean */ public function InFuture() { - return strtotime($this->value) > SS_Datetime::now()->Format('U'); + return strtotime($this->value) > DBDatetime::now()->Format('U'); } /** @@ -339,7 +350,7 @@ public function InFuture() { * @return boolean */ public function IsToday() { - return (date('Y-m-d', strtotime($this->value)) == SS_Datetime::now()->Format('Y-m-d')); + return (date('Y-m-d', strtotime($this->value)) == DBDatetime::now()->Format('Y-m-d')); } /** diff --git a/model/fieldtypes/Datetime.php b/model/FieldType/DBDatetime.php similarity index 93% rename from model/fieldtypes/Datetime.php rename to model/FieldType/DBDatetime.php index f2219890ece..c6716867acd 100644 --- a/model/fieldtypes/Datetime.php +++ b/model/FieldType/DBDatetime.php @@ -1,4 +1,15 @@ @@ -23,7 +34,7 @@ * @package framework * @subpackage model */ -class SS_Datetime extends Date implements TemplateGlobalProvider { +class DBDatetime extends DBDate implements TemplateGlobalProvider { public function setValue($value, $record = null, $markChanged = true) { if($value === false || $value === null || (is_string($value) && !strlen($value))) { @@ -185,7 +196,7 @@ public static function set_mock_now($datetime) { } elseif(is_string($datetime)) { self::$mock_now = DBField::create_field('SS_Datetime', $datetime); } else { - throw new Exception('SS_Datetime::set_mock_now(): Wrong format: ' . $datetime); + throw new Exception('DBDatetime::set_mock_now(): Wrong format: ' . $datetime); } } diff --git a/model/fieldtypes/Decimal.php b/model/FieldType/DBDecimal.php similarity index 95% rename from model/fieldtypes/Decimal.php rename to model/FieldType/DBDecimal.php index 519ef4bfeaf..8c7dfe0d5db 100644 --- a/model/fieldtypes/Decimal.php +++ b/model/FieldType/DBDecimal.php @@ -1,11 +1,17 @@ 'Int', diff --git a/model/fieldtypes/PrimaryKey.php b/model/FieldType/DBPrimaryKey.php similarity index 91% rename from model/fieldtypes/PrimaryKey.php rename to model/FieldType/DBPrimaryKey.php index d82404e2405..4e37100e142 100644 --- a/model/fieldtypes/PrimaryKey.php +++ b/model/FieldType/DBPrimaryKey.php @@ -1,6 +1,11 @@ "Text", diff --git a/model/fieldtypes/Time.php b/model/FieldType/DBTime.php similarity index 94% rename from model/fieldtypes/Time.php rename to model/FieldType/DBTime.php index 8d219b53382..3a278a6da74 100644 --- a/model/fieldtypes/Time.php +++ b/model/FieldType/DBTime.php @@ -1,4 +1,13 @@ "Text", diff --git a/model/fieldtypes/Year.php b/model/FieldType/DBYear.php similarity index 91% rename from model/fieldtypes/Year.php rename to model/FieldType/DBYear.php index 0c1a73878e3..2550e177086 100755 --- a/model/fieldtypes/Year.php +++ b/model/FieldType/DBYear.php @@ -1,4 +1,10 @@ 'year', 'precision'=>4, 'arrayValue'=>$this->arrayValue); diff --git a/model/FieldType/SS_Datetime.php b/model/FieldType/SS_Datetime.php new file mode 100644 index 00000000000..03dca3b78ee --- /dev/null +++ b/model/FieldType/SS_Datetime.php @@ -0,0 +1,49 @@ +extraFields as $field => $spec) { $obj = Object::create_from_string($spec); - if($obj instanceof CompositeDBField) { + if($obj instanceof DBComposite) { $this->_compositeExtraFields[$field] = array(); // append the composite field names to the select diff --git a/security/Member.php b/security/Member.php index fede154971d..3d71db9ee85 100644 --- a/security/Member.php +++ b/security/Member.php @@ -1,4 +1,7 @@ TempIDHash = $generator->randomToken('sha1'); $this->TempIDExpired = self::config()->temp_id_lifetime - ? date('Y-m-d H:i:s', strtotime(SS_Datetime::now()->getValue()) + self::config()->temp_id_lifetime) + ? date('Y-m-d H:i:s', strtotime(DBDatetime::now()->getValue()) + self::config()->temp_id_lifetime) : null; $this->write(); } @@ -706,7 +709,7 @@ public static function member_from_tempid($tempid) { // Exclude expired if(static::config()->temp_id_lifetime) { - $members = $members->filter('TempIDExpired:GreaterThan', SS_Datetime::now()->getValue()); + $members = $members->filter('TempIDExpired:GreaterThan', DBDatetime::now()->getValue()); } return $members->first(); diff --git a/security/PermissionCheckboxSetField.php b/security/PermissionCheckboxSetField.php index 5c629383811..a26bd96b3c7 100644 --- a/security/PermissionCheckboxSetField.php +++ b/security/PermissionCheckboxSetField.php @@ -1,4 +1,7 @@ new Varchar("A"), + "A" => new DBVarchar("A"), "B" => new stdClass(), )); - $this->assertEquals("Varchar", get_class($arrayData->A)); + $this->assertEquals('SilverStripe\Model\FieldType\DBVarchar', get_class($arrayData->A)); $this->assertEquals("ArrayData", get_class($arrayData->B)); } diff --git a/tests/dev/CsvBulkLoaderTest.php b/tests/dev/CsvBulkLoaderTest.php index 7b1d15a5bcc..d128b2c5c0e 100644 --- a/tests/dev/CsvBulkLoaderTest.php +++ b/tests/dev/CsvBulkLoaderTest.php @@ -1,5 +1,7 @@ 'SS_DateTime' + 'PublishDate' => 'Datetime' ); } diff --git a/tests/filesystem/AssetStoreTest.php b/tests/filesystem/AssetStoreTest.php index 4fc413c6464..7d2aa787dd3 100644 --- a/tests/filesystem/AssetStoreTest.php +++ b/tests/filesystem/AssetStoreTest.php @@ -10,6 +10,7 @@ use SilverStripe\Filesystem\Storage\AssetContainer; use SilverStripe\Filesystem\Storage\AssetStore; use SilverStripe\Filesystem\Storage\FlysystemGeneratedAssetHandler; +use SilverStripe\Filesystem\Storage\DBFile; class AssetStoreTest extends SapphireTest { diff --git a/tests/forms/CurrencyFieldTest.php b/tests/forms/CurrencyFieldTest.php index 7598dd05dc4..51e0df1efe9 100644 --- a/tests/forms/CurrencyFieldTest.php +++ b/tests/forms/CurrencyFieldTest.php @@ -60,7 +60,7 @@ public function testValidate() { ); //tests with updated currency symbol setting - Config::inst()->update('Currency', 'currency_symbol', '€'); + Config::inst()->update('SilverStripe\Model\FieldType\DBCurrency', 'currency_symbol', '€'); $f->setValue('123.45'); $this->assertTrue( @@ -164,7 +164,7 @@ public function testSetValue() { ); //update currency symbol via config - Config::inst()->update('Currency', 'currency_symbol', '€'); + Config::inst()->update('SilverStripe\Model\FieldType\DBCurrency', 'currency_symbol', '€'); $f->setValue('123.45'); $this->assertEquals( @@ -235,7 +235,7 @@ public function testDataValue() { ); //tests with updated currency symbol setting - Config::inst()->update('Currency', 'currency_symbol', '€'); + Config::inst()->update('SilverStripe\Model\FieldType\DBCurrency', 'currency_symbol', '€'); $f->setValue('€123.45'); $this->assertEquals( diff --git a/tests/forms/EnumFieldTest.php b/tests/forms/EnumFieldTest.php index be1de775413..cf94764b0cb 100644 --- a/tests/forms/EnumFieldTest.php +++ b/tests/forms/EnumFieldTest.php @@ -1,4 +1,7 @@ 'Value' ); - $enumField = new Enum('testField', $values); + $enumField = new DBEnum('testField', $values); $searchField = $enumField->scaffoldSearchField(); @@ -18,7 +21,7 @@ public function testAnyFieldIsPresentInSearchField() { } public function testEnumParsing() { - $enum = new Enum('testField', " + $enum = new DBEnum('testField', " Item1, Item2, Item 3, diff --git a/tests/forms/LookupFieldTest.php b/tests/forms/LookupFieldTest.php index 44981d98e8c..80606d155fd 100644 --- a/tests/forms/LookupFieldTest.php +++ b/tests/forms/LookupFieldTest.php @@ -16,7 +16,7 @@ public function testNullValueWithNumericArraySource() { $this->assertEquals( '(none)', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } @@ -26,7 +26,7 @@ public function testStringValueWithNumericArraySource() { $f->setValue(1); $this->assertEquals( 'one', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } @@ -37,7 +37,7 @@ public function testUnknownStringValueWithNumericArraySource() { $f->dontEscape = true; // simulates CMSMain->compareversions() $this->assertEquals( 'w00t', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } @@ -48,7 +48,7 @@ public function testArrayValueWithAssociativeArraySource() { $f->setValue(array('one','two')); $this->assertEquals('one val, two val' . '', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } @@ -59,7 +59,7 @@ public function testArrayValueWithNumericArraySource() { $f->setValue(array(1,2)); $this->assertEquals( 'one, two', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } @@ -79,7 +79,7 @@ public function testArrayValueWithSqlMapSource() { $member1->ID, $member2->ID ), - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } @@ -101,7 +101,7 @@ public function testWithMultiDimensionalSource() { $this->assertEquals( 'Carrots', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); $f->setValue(array( @@ -110,7 +110,7 @@ public function testWithMultiDimensionalSource() { $this->assertEquals( 'Carrots, Vegan', - $f->Field()->getValue() + trim($f->Field()->getValue()) ); } } diff --git a/tests/forms/MoneyFieldTest.php b/tests/forms/MoneyFieldTest.php index 5d4e44aaa5f..ac174e9becc 100644 --- a/tests/forms/MoneyFieldTest.php +++ b/tests/forms/MoneyFieldTest.php @@ -1,4 +1,7 @@ setAmount(123456.78); $m->setCurrency('EUR'); $f = new MoneyField('MyMoney', 'MyMoney', $m); @@ -28,7 +31,7 @@ public function testSetValueAsMoney() { $f = new MoneyField('MyMoney', 'MyMoney'); - $m = new Money(); + $m = new DBMoney(); $m->setAmount(123456.78); $m->setCurrency('EUR'); $f->setValue($m); diff --git a/tests/model/DBClassNameTest.php b/tests/model/DBClassNameTest.php index 3d52a597d9b..4308e518aa4 100644 --- a/tests/model/DBClassNameTest.php +++ b/tests/model/DBClassNameTest.php @@ -1,5 +1,7 @@ assertTrue($obj->hasDatabaseField('MyMoneyAmount')); $this->assertTrue($obj->hasDatabaseField('MyMoneyCurrency')); @@ -22,7 +26,7 @@ public function testHasDatabaseFieldOnDataObject() { $this->assertTrue($obj->dbObject('MyMoney')->hasField('Currency')); // Test getField accessor - $this->assertTrue($obj->MyMoney instanceof Money); + $this->assertTrue($obj->MyMoney instanceof DBMoney); $this->assertTrue($obj->MyMoney->hasField('Amount')); $obj->MyMoney->Amount = 100.00; $this->assertEquals(100.00, $obj->MyMoney->Amount); @@ -38,14 +42,14 @@ public function testHasDatabaseFieldOnDataObject() { * Test DataObject::composite_fields() and DataObject::is_composite_field() */ public function testCompositeFieldMetaDataFunctions() { - $this->assertEquals('Money', DataObject::is_composite_field('CompositeDBFieldTest_DataObject', 'MyMoney')); - $this->assertFalse(DataObject::is_composite_field('CompositeDBFieldTest_DataObject', 'Title')); + $this->assertEquals('Money', DataObject::is_composite_field('DBCompositeTest_DataObject', 'MyMoney')); + $this->assertFalse(DataObject::is_composite_field('DBCompositeTest_DataObject', 'Title')); $this->assertEquals( array( 'MyMoney' => 'Money', 'OverriddenMoney' => 'Money' ), - DataObject::composite_fields('CompositeDBFieldTest_DataObject') + DataObject::composite_fields('DBCompositeTest_DataObject') ); @@ -67,14 +71,14 @@ public function testCompositeFieldMetaDataFunctions() { * Tests that changes to the fields affect the underlying dataobject, and vice versa */ public function testFieldBinding() { - $object = new CompositeDBFieldTest_DataObject(); + $object = new DBCompositeTest_DataObject(); $object->MyMoney->Currency = 'NZD'; $object->MyMoney->Amount = 100.0; $this->assertEquals('NZD', $object->MyMoneyCurrency); $this->assertEquals(100.0, $object->MyMoneyAmount); $object->write(); - $object2 = CompositeDBFieldTest_DataObject::get()->byID($object->ID); + $object2 = DBCompositeTest_DataObject::get()->byID($object->ID); $this->assertEquals('NZD', $object2->MyMoney->Currency); $this->assertEquals(100.0, $object2->MyMoney->Amount); @@ -90,18 +94,18 @@ public function testFieldBinding() { * Ensures that composite fields are assigned to the correct tables */ public function testInheritedTables() { - $object1 = new CompositeDBFieldTest_DataObject(); + $object1 = new DBCompositeTest_DataObject(); $object2 = new SubclassedDBFieldObject(); - $this->assertEquals('CompositeDBFieldTest_DataObject', $object1->dbObject('MyMoney')->getTable()); - $this->assertEquals('CompositeDBFieldTest_DataObject', $object1->dbObject('OverriddenMoney')->getTable()); - $this->assertEquals('CompositeDBFieldTest_DataObject', $object2->dbObject('MyMoney')->getTable()); + $this->assertEquals('DBCompositeTest_DataObject', $object1->dbObject('MyMoney')->getTable()); + $this->assertEquals('DBCompositeTest_DataObject', $object1->dbObject('OverriddenMoney')->getTable()); + $this->assertEquals('DBCompositeTest_DataObject', $object2->dbObject('MyMoney')->getTable()); $this->assertEquals('SubclassedDBFieldObject', $object2->dbObject('OtherMoney')->getTable()); $this->assertEquals('SubclassedDBFieldObject', $object2->dbObject('OverriddenMoney')->getTable()); } } -class CompositeDBFieldTest_DataObject extends DataObject implements TestOnly { +class DBCompositeTest_DataObject extends DataObject implements TestOnly { private static $db = array( 'Title' => 'Text', 'MyMoney' => 'Money', @@ -109,7 +113,7 @@ class CompositeDBFieldTest_DataObject extends DataObject implements TestOnly { ); } -class SubclassedDBFieldObject extends CompositeDBFieldTest_DataObject { +class SubclassedDBFieldObject extends DBCompositeTest_DataObject { private static $db = array( 'OtherField' => 'Text', 'OtherMoney' => 'Money', diff --git a/tests/model/CurrencyTest.php b/tests/model/DBCurrencyTest.php similarity index 90% rename from tests/model/CurrencyTest.php rename to tests/model/DBCurrencyTest.php index 4d9bd726c18..acc01fa405e 100644 --- a/tests/model/CurrencyTest.php +++ b/tests/model/DBCurrencyTest.php @@ -1,9 +1,12 @@ $niceValues) { - $c = new Currency('MyField'); + $c = new DBCurrency('MyField'); $c->setValue($value); $this->assertEquals($niceValues[0], $c->Nice()); $this->assertEquals($niceValues[1], $c->Whole()); diff --git a/tests/model/DateTest.php b/tests/model/DBDateTest.php similarity index 96% rename from tests/model/DateTest.php rename to tests/model/DBDateTest.php index 59ee076a96f..8ec10ed3968 100644 --- a/tests/model/DateTest.php +++ b/tests/model/DBDateTest.php @@ -1,9 +1,13 @@ assertEquals( '1 month ago', @@ -211,11 +215,11 @@ public function testAgoInPast() { 'Approximate past match in singular' ); - SS_Datetime::clear_mock_now(); + DBDatetime::clear_mock_now(); } public function testAgoInFuture() { - SS_Datetime::set_mock_now('2000-12-31 00:00:00'); + DBDatetime::set_mock_now('2000-12-31 00:00:00'); $this->assertEquals( 'in 10 years', @@ -235,7 +239,7 @@ public function testAgoInFuture() { 'Approximate past match on minutes' ); - SS_Datetime::clear_mock_now(); + DBDatetime::clear_mock_now(); } public function testFormatFromSettings() { diff --git a/tests/model/DBFieldTest.php b/tests/model/DBFieldTest.php index 41d410f5e67..bf360f6a78c 100644 --- a/tests/model/DBFieldTest.php +++ b/tests/model/DBFieldTest.php @@ -1,5 +1,9 @@ assertEquals(123, singleton('Varchar')->prepValueForDB(123)); /* AllowEmpty Varchar behaviour */ - $varcharField = new Varchar("testfield", 50, array("nullifyEmpty"=>false)); + $varcharField = new DBVarchar("testfield", 50, array("nullifyEmpty"=>false)); $this->assertSame(0, $varcharField->prepValueForDB(0)); $this->assertSame(null, $varcharField->prepValueForDB(null)); $this->assertSame(null, $varcharField->prepValueForDB(false)); @@ -125,7 +129,7 @@ public function testPrepValueForDB() { $this->assertEquals(123, singleton('Text')->prepValueForDB(123)); /* AllowEmpty Text behaviour */ - $textField = new Text("testfield", array("nullifyEmpty"=>false)); + $textField = new DBText("testfield", array("nullifyEmpty"=>false)); $this->assertSame(0, $textField->prepValueForDB(0)); $this->assertSame(null, $textField->prepValueForDB(null)); $this->assertSame(null, $textField->prepValueForDB(false)); @@ -163,7 +167,7 @@ public function testPrepValueForDB() { } public function testExists() { - $varcharField = new Varchar("testfield"); + $varcharField = new DBVarchar("testfield"); $this->assertTrue($varcharField->getNullifyEmpty()); $varcharField->setValue('abc'); $this->assertTrue($varcharField->exists()); @@ -172,7 +176,7 @@ public function testExists() { $varcharField->setValue(null); $this->assertFalse($varcharField->exists()); - $varcharField = new Varchar("testfield", 50, array('nullifyEmpty'=>false)); + $varcharField = new DBVarchar("testfield", 50, array('nullifyEmpty'=>false)); $this->assertFalse($varcharField->getNullifyEmpty()); $varcharField->setValue('abc'); $this->assertTrue($varcharField->exists()); @@ -181,7 +185,7 @@ public function testExists() { $varcharField->setValue(null); $this->assertFalse($varcharField->exists()); - $textField = new Text("testfield"); + $textField = new DBText("testfield"); $this->assertTrue($textField->getNullifyEmpty()); $textField->setValue('abc'); $this->assertTrue($textField->exists()); @@ -190,7 +194,7 @@ public function testExists() { $textField->setValue(null); $this->assertFalse($textField->exists()); - $textField = new Text("testfield", array('nullifyEmpty'=>false)); + $textField = new DBText("testfield", array('nullifyEmpty'=>false)); $this->assertFalse($textField->getNullifyEmpty()); $textField->setValue('abc'); $this->assertTrue($textField->exists()); diff --git a/tests/model/HTMLTextTest.php b/tests/model/DBHTMLTextTest.php similarity index 92% rename from tests/model/HTMLTextTest.php rename to tests/model/DBHTMLTextTest.php index 6a0367384d6..08eab13bcac 100644 --- a/tests/model/HTMLTextTest.php +++ b/tests/model/DBHTMLTextTest.php @@ -1,9 +1,13 @@ LimitCharacters()} @@ -16,7 +20,7 @@ public function testLimitCharacters() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new HTMLText('Test'); + $textObj = new DBHTMLText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->LimitCharacters()); } @@ -37,7 +41,7 @@ public function testSummaryBasics() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new HTMLText('Test'); + $textObj = new DBHTMLText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->Summary()); } @@ -52,7 +56,7 @@ public function testSummaryLimits() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new HTMLText('Test'); + $textObj = new DBHTMLText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->Summary(5, 3, '...')); } @@ -67,7 +71,7 @@ public function testSummaryEndings() { $match = 'Cut it off, cut'; foreach($cases as $add) { - $textObj = new HTMLText(); + $textObj = new DBHTMLText(); $textObj->setValue($orig); $this->assertEquals($match.$add, $textObj->Summary(4, 0, $add)); } @@ -77,7 +81,7 @@ public function testSummaryFlexTooBigShouldNotCauseError() { $orig = '

Cut it off, cut it off

'; $match = 'Cut it off, cut'; - $textObj = new HTMLText(); + $textObj = new DBHTMLText(); $textObj->setValue($orig); $this->assertEquals($match, $textObj->Summary(4, 10, '')); } @@ -90,7 +94,7 @@ public function testSummaryInvalidHTML() { ); foreach($cases as $orig => $match) { - $textObj = new HTMLText(); + $textObj = new DBHTMLText(); $textObj->setValue($orig); $this->assertEquals($match, $textObj->Summary(4, 0, '')); } @@ -109,7 +113,7 @@ public function testFirstSentence() { ); foreach($cases as $orig => $match) { - $textObj = new HTMLText(); + $textObj = new DBHTMLText(); $textObj->setValue($orig); $this->assertEquals($match, $textObj->FirstSentence()); } @@ -144,7 +148,7 @@ public function testATT() { } function testExists() { - $h = new HTMLText; + $h = new DBHTMLText(); $h->setValue(""); $this->assertFalse($h->exists()); $h->setValue("

"); @@ -178,14 +182,14 @@ function testExists() { } function testWhitelist() { - $textObj = new HTMLText('Test', 'meta,link'); + $textObj = new DBHTMLText('Test', 'meta,link'); $this->assertEquals( '', $textObj->whitelistContent('

Remove

Remove Text'), 'Removes any elements not in whitelist excluding text elements' ); - $textObj = new HTMLText('Test', 'meta,link,text()'); + $textObj = new DBHTMLText('Test', 'meta,link,text()'); $this->assertEquals( 'Keep Text', $textObj->whitelistContent('

Remove

Keep Text'), diff --git a/tests/model/DBLocaleTest.php b/tests/model/DBLocaleTest.php index 65dcffa8bf8..fa6fa0b8b7c 100644 --- a/tests/model/DBLocaleTest.php +++ b/tests/model/DBLocaleTest.php @@ -1,21 +1,24 @@ assertEquals($l->Nice(), 'German'); } public function testNiceNative() { - $l = DBField::create_field('DBLocale', 'de_DE'); + $l = DBField::create_field('Locale', 'de_DE'); $this->assertEquals($l->Nice(true), 'Deutsch'); } public function testNativeName() { - $l = DBField::create_field('DBLocale', 'de_DE'); + $l = DBField::create_field('Locale', 'de_DE'); $this->assertEquals($l->getNativeName(), 'Deutsch'); } } diff --git a/tests/model/MoneyTest.php b/tests/model/DBMoneyTest.php similarity index 90% rename from tests/model/MoneyTest.php rename to tests/model/DBMoneyTest.php index 40d27c77de6..3b7f17fb8eb 100644 --- a/tests/model/MoneyTest.php +++ b/tests/model/DBMoneyTest.php @@ -1,4 +1,7 @@ objFromFixture('MoneyTest_DataObject', 'test1'); - $this->assertInstanceOf('Money', $obj->MyMoney); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBMoney', $obj->MyMoney); } public function testLoadFromFixture() { $obj = $this->objFromFixture('MoneyTest_DataObject', 'test1'); - $this->assertInstanceOf('Money', $obj->MyMoney); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBMoney', $obj->MyMoney); $this->assertEquals($obj->MyMoney->getCurrency(), 'EUR'); $this->assertEquals($obj->MyMoney->getAmount(), 1.23); } @@ -43,7 +46,7 @@ public function testDataObjectChangedFields() { $this->assertNotContains('MyMoney', array_keys($changed)); // With changes - $this->assertInstanceOf('Money', $obj->MyMoney); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBMoney', $obj->MyMoney); $obj->MyMoney->setAmount(99); $changed = $obj->getChangedFields(); $this->assertContains('MyMoney', array_keys($changed), 'Field is detected as changed'); @@ -53,13 +56,13 @@ public function testDataObjectChangedFields() { public function testCanOverwriteSettersWithNull() { $obj = new MoneyTest_DataObject(); - $m1 = new Money(); + $m1 = new DBMoney(); $m1->setAmount(987.65); $m1->setCurrency('USD'); $obj->MyMoney = $m1; $obj->write(); - $m2 = new Money(); + $m2 = new DBMoney(); $m2->setAmount(null); $m2->setCurrency(null); $obj->MyMoney = $m2; @@ -82,7 +85,7 @@ public function testGettingWrittenDataObject() { $obj = new MoneyTest_DataObject(); - $m = new Money(); + $m = new DBMoney(); $m->setAmount(987.65); $m->setCurrency('USD'); $obj->MyMoney = $m; @@ -104,7 +107,7 @@ public function testGettingWrittenDataObject() { } public function testToCurrency() { - $USD = new Money(); + $USD = new DBMoney(); $USD->setLocale('en_US'); $USD->setAmount(53292.18); $this->assertSame('$53,292.18', $USD->Nice()); @@ -112,7 +115,7 @@ public function testToCurrency() { } public function testGetSign() { - $SKR = new Money(); + $SKR = new DBMoney(); $SKR->setValue(array( 'Currency' => 'SKR', 'Amount' => 3.44 @@ -127,7 +130,7 @@ public function testGetSign() { } catch(Exception $e) { } - $EUR = new Money(); + $EUR = new DBMoney(); $EUR->setValue(array( 'Currency' => 'EUR', 'Amount' => 3.44 @@ -138,7 +141,7 @@ public function testGetSign() { public function testGetName() { - $m = new Money(); + $m = new DBMoney(); $m->setValue(array( 'Currency' => 'EUR', 'Amount' => 3.44 @@ -156,7 +159,7 @@ public function testGetName() } public function testGetShortName() { - $m = new Money(); + $m = new DBMoney(); $m->setValue(array( 'Currency' => 'EUR', 'Amount' => 3.44 @@ -176,7 +179,7 @@ public function testGetShortName() { } public function testSetValueAsArray() { - $m = new Money(); + $m = new DBMoney(); $m->setValue(array( 'Currency' => 'EUR', 'Amount' => 3.44 @@ -192,12 +195,12 @@ public function testSetValueAsArray() { } public function testSetValueAsMoney() { - $m1 = new Money(); + $m1 = new DBMoney(); $m1->setValue(array( 'Currency' => 'EUR', 'Amount' => 3.44 )); - $m2 = new Money(); + $m2 = new DBMoney(); $m2->setValue($m1); $this->assertEquals( $m2->getCurrency(), @@ -210,17 +213,17 @@ public function testSetValueAsMoney() { } public function testExists() { - $m1 = new Money(); + $m1 = new DBMoney(); $this->assertFalse($m1->exists()); - $m2 = new Money(); + $m2 = new DBMoney(); $m2->setValue(array( 'Currency' => 'EUR', 'Amount' => 3.44 )); $this->assertTrue($m2->exists()); - $m3 = new Money(); + $m3 = new DBMoney(); $m3->setValue(array( 'Currency' => 'EUR', 'Amount' => 0 @@ -231,9 +234,9 @@ public function testExists() { public function testLoadIntoDataObject() { $obj = new MoneyTest_DataObject(); - $this->assertInstanceOf('Money', $obj->obj('MyMoney')); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBMoney', $obj->obj('MyMoney')); - $m = new Money(); + $m = new DBMoney(); $m->setValue(array( 'Currency' => 'EUR', 'Amount' => 1.23 @@ -246,7 +249,7 @@ public function testLoadIntoDataObject() { public function testWriteToDataObject() { $obj = new MoneyTest_DataObject(); - $m = new Money(); + $m = new DBMoney(); $m->setValue(array( 'Currency' => 'EUR', 'Amount' => 1.23 @@ -280,7 +283,7 @@ public function testMoneyLazyLoading() { public function testHasAmount() { $obj = new MoneyTest_DataObject(); - $m = new Money(); + $m = new DBMoney(); $obj->MyMoney = $m; $m->setValue(array('Amount' => 1)); diff --git a/tests/model/PercentageTest.php b/tests/model/DBPercentageTest.php similarity index 82% rename from tests/model/PercentageTest.php rename to tests/model/DBPercentageTest.php index 0434ee10d76..ac2313f9590 100644 --- a/tests/model/PercentageTest.php +++ b/tests/model/DBPercentageTest.php @@ -1,9 +1,12 @@ $expected) { - $percentage = new Percentage('Probability'); + $percentage = new DBPercentage('Probability'); $percentage->setValue($original); $this->assertEquals($expected, $percentage->Nice()); } @@ -37,7 +40,7 @@ public function testCustomPrecision() { ); foreach($cases as $original => $expected) { - $percentage = new Percentage('Probability', 2); + $percentage = new DBPercentage('Probability', 2); $percentage->setValue($original); $this->assertEquals($expected, $percentage->Nice()); } diff --git a/tests/model/StringFieldTest.php b/tests/model/DBStringTest.php similarity index 84% rename from tests/model/StringFieldTest.php rename to tests/model/DBStringTest.php index 85b415bc41f..090c7af8704 100644 --- a/tests/model/StringFieldTest.php +++ b/tests/model/DBStringTest.php @@ -1,13 +1,17 @@ forTemplate() + * @covers DBString->forTemplate() */ public function testForTemplate() { $this->assertEquals( @@ -17,7 +21,7 @@ public function testForTemplate() { } /** - * @covers StringField->LowerCase() + * @covers DBString->LowerCase() */ public function testLowerCase() { $this->assertEquals( @@ -27,7 +31,7 @@ public function testLowerCase() { } /** - * @covers StringField->UpperCase() + * @covers DBString->UpperCase() */ public function testUpperCase() { $this->assertEquals( @@ -54,6 +58,6 @@ public function testExists() { } -class StringFieldTest_MyStringField extends StringField implements TestOnly { +class StringFieldTest_MyStringField extends DBString implements TestOnly { public function requireField() {} } diff --git a/tests/model/TextTest.php b/tests/model/DBTextTest.php similarity index 95% rename from tests/model/TextTest.php rename to tests/model/DBTextTest.php index 05bfd2b7c92..1cb4de3fbb4 100644 --- a/tests/model/TextTest.php +++ b/tests/model/DBTextTest.php @@ -1,9 +1,13 @@ LimitCharacters()} @@ -15,7 +19,7 @@ public function testLimitCharacters() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new Text('Test'); + $textObj = new DBText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->LimitCharacters()); } @@ -44,7 +48,7 @@ public function testLimitCharactersToClosestWord() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new Text('Test'); + $textObj = new DBText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->LimitCharactersToClosestWord(24)); } @@ -71,7 +75,7 @@ public function testLimitWordCount() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new Text('Test'); + $textObj = new DBText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->LimitWordCount(3)); } @@ -89,7 +93,7 @@ public function testLimitWordCountXML() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new Text('Test'); + $textObj = new DBText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->LimitWordCountXML(3)); } @@ -111,7 +115,7 @@ public function testLimitSentences() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new Text('Test'); + $textObj = new DBText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->LimitSentences(2)); } @@ -132,7 +136,7 @@ public function testFirstSentance() { ); foreach($cases as $originalValue => $expectedValue) { - $textObj = new Text('Test'); + $textObj = new DBText('Test'); $textObj->setValue($originalValue); $this->assertEquals($expectedValue, $textObj->FirstSentence()); } diff --git a/tests/model/YearTest.php b/tests/model/DBYearTest.php similarity index 88% rename from tests/model/YearTest.php rename to tests/model/DBYearTest.php index c659b7284b8..278c191d1a3 100755 --- a/tests/model/YearTest.php +++ b/tests/model/DBYearTest.php @@ -1,15 +1,18 @@ scaffoldFormField("YearTest"); $this->assertEquals("DropdownField", get_class($field)); @@ -25,7 +28,7 @@ public function testScaffoldFormFieldFirst() { } public function testScaffoldFormFieldLast() { - $year = new Year(); + $year = new DBYear(); $field = $year->scaffoldFormField("YearTest"); $source = $field->getSource(); diff --git a/tests/model/DataExtensionTest.php b/tests/model/DataExtensionTest.php index a2a8ccfdaae..3a36527316d 100644 --- a/tests/model/DataExtensionTest.php +++ b/tests/model/DataExtensionTest.php @@ -152,7 +152,7 @@ public function testPopulateDefaults() { public function testDbObjectOnExtendedFields() { $member = $this->objFromFixture('DataExtensionTest_Member', 'member1'); $this->assertNotNull($member->dbObject('Website')); - $this->assertInstanceOf('Varchar', $member->dbObject('Website')); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBVarchar', $member->dbObject('Website')); } public function testExtensionCanBeAppliedToDataObject() { diff --git a/tests/model/DataObjectSchemaGenerationTest.php b/tests/model/DataObjectSchemaGenerationTest.php index 9fcf328f98d..0d4e06e427b 100644 --- a/tests/model/DataObjectSchemaGenerationTest.php +++ b/tests/model/DataObjectSchemaGenerationTest.php @@ -1,5 +1,7 @@ dbObject('Favourite'); $favouriteValue = $favouriteDBObject->getValue(); - $this->assertInstanceOf('PolymorphicForeignKey', $favouriteDBObject); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBPolymorphicForeignKey', $favouriteDBObject); $this->assertEquals($favourite->ID, $favouriteValue->ID); $this->assertEquals($favourite->ClassName, $favouriteValue->ClassName); } @@ -1667,16 +1670,16 @@ public function testRelObject() { $captain = $this->objFromFixture('DataObjectTest_Player', 'captain1'); // Test traversal of a single has_one - $this->assertInstanceOf("Varchar", $captain->relObject('FavouriteTeam.Title')); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBVarchar', $captain->relObject('FavouriteTeam.Title')); $this->assertEquals("Team 1", $captain->relObject('FavouriteTeam.Title')->getValue()); // Test direct field access - $this->assertInstanceOf("Boolean", $captain->relObject('IsRetired')); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBBoolean', $captain->relObject('IsRetired')); $this->assertEquals(1, $captain->relObject('IsRetired')->getValue()); $player = $this->objFromFixture('DataObjectTest_Player', 'player2'); // Test that we can traverse more than once, and that arbitrary methods are okay - $this->assertInstanceOf("Varchar", $player->relObject('Teams.First.Title')); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBVarchar', $player->relObject('Teams.First.Title')); $this->assertEquals("Team 1", $player->relObject('Teams.First.Title')->getValue()); } diff --git a/tests/model/DatetimeTest.php b/tests/model/DatetimeTest.php deleted file mode 100644 index 20d323cad2f..00000000000 --- a/tests/model/DatetimeTest.php +++ /dev/null @@ -1,220 +0,0 @@ -assertEquals($systemDatetime->Date(), $nowDatetime->Date()); - } - - public function testNowWithMockDate() { - // Test setting - $mockDate = '2001-12-31 22:10:59'; - SS_Datetime::set_mock_now($mockDate); - $systemDatetime = DBField::create_field('SS_Datetime', date('Y-m-d H:i:s')); - $nowDatetime = SS_Datetime::now(); - $this->assertNotEquals($systemDatetime->Date(), $nowDatetime->Date()); - $this->assertEquals($nowDatetime->getValue(), $mockDate); - - // Test clearing - SS_Datetime::clear_mock_now(); - $systemDatetime = DBField::create_field('SS_Datetime', date('Y-m-d H:i:s')); - $nowDatetime = SS_Datetime::now(); - $this->assertEquals($systemDatetime->Date(), $nowDatetime->Date()); - } - - public function testSetNullAndZeroValues() { - $date = DBField::create_field('SS_Datetime', ''); - $this->assertNull($date->getValue(), 'Empty string evaluates to NULL'); - - $date = DBField::create_field('SS_Datetime', null); - $this->assertNull($date->getValue(), 'NULL is set as NULL'); - - $date = DBField::create_field('SS_Datetime', false); - $this->assertNull($date->getValue(), 'Boolean FALSE evaluates to NULL'); - - $date = DBField::create_field('SS_Datetime', '0'); - $this->assertEquals('1970-01-01 00:00:00', $date->getValue(), 'String zero is UNIX epoch time'); - - $date = DBField::create_field('SS_Datetime', 0); - $this->assertEquals('1970-01-01 00:00:00', $date->getValue(), 'Numeric zero is UNIX epoch time'); - } - - public function testExtendedDateTimes() { - $date = DBField::create_field('SS_Datetime', '1500-10-10 15:32:24'); - $this->assertEquals('10 Oct 1500 15 32 24', $date->Format('d M Y H i s')); - - $date = DBField::create_field('SS_Datetime', '3000-10-10 15:32:24'); - $this->assertEquals('10 Oct 3000 15 32 24', $date->Format('d M Y H i s')); - } - - public function testNice() { - $date = DBField::create_field('SS_Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('31/12/2001 10:10pm', $date->Nice()); - } - - public function testNice24() { - $date = DBField::create_field('SS_Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('31/12/2001 22:10', $date->Nice24()); - } - - public function testDate() { - $date = DBField::create_field('SS_Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('31/12/2001', $date->Date()); - } - - public function testTime() { - $date = DBField::create_field('SS_Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('10:10pm', $date->Time()); - } - - public function testTime24() { - $date = DBField::create_field('SS_Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('22:10', $date->Time24()); - } - - public function testURLDateTime(){ - $date = DBField::create_field('SS_Datetime', '2001-12-31 22:10:59'); - $this->assertEquals('2001-12-31%2022:10:59', $date->URLDateTime()); - } - - public function testAgoInPast() { - SS_Datetime::set_mock_now('2000-12-31 12:00:00'); - - $this->assertEquals( - '10 years ago', - DBField::create_field('SS_Datetime', '1990-12-31 12:00:00')->Ago(), - 'Exact past match on years' - ); - - $this->assertEquals( - '10 years ago', - DBField::create_field('SS_Datetime', '1990-12-30 12:00:00')->Ago(), - 'Approximate past match on years' - ); - - $this->assertEquals( - '1 year ago', - DBField::create_field('SS_Datetime', '1999-12-30 12:00:12')->Ago(true, 1), - 'Approximate past match in singular, significance=1' - ); - - $this->assertEquals( - '12 months ago', - DBField::create_field('SS_Datetime', '1999-12-30 12:00:12')->Ago(), - 'Approximate past match in singular' - ); - - $this->assertEquals( - '50 mins ago', - DBField::create_field('SS_Datetime', '2000-12-31 11:10:11')->Ago(), - 'Approximate past match on minutes' - ); - - $this->assertEquals( - '59 secs ago', - DBField::create_field('SS_Datetime', '2000-12-31 11:59:01')->Ago(), - 'Approximate past match on seconds' - ); - - $this->assertEquals( - 'less than a minute ago', - DBField::create_field('SS_Datetime', '2000-12-31 11:59:01')->Ago(false), - 'Approximate past match on seconds with $includeSeconds=false' - ); - - $this->assertEquals( - '1 min ago', - DBField::create_field('SS_Datetime', '2000-12-31 11:58:50')->Ago(false), - 'Test between 1 and 2 minutes with includeSeconds=false' - ); - - $this->assertEquals( - '70 secs ago', - DBField::create_field('SS_Datetime', '2000-12-31 11:58:50')->Ago(true), - 'Test between 1 and 2 minutes with includeSeconds=true' - ); - - $this->assertEquals( - '4 mins ago', - DBField::create_field('SS_Datetime', '2000-12-31 11:55:50')->Ago(), - 'Past match on minutes' - ); - - $this->assertEquals( - '1 hour ago', - DBField::create_field('SS_Datetime', '2000-12-31 10:50:58')->Ago(true, 1), - 'Past match on hours, significance=1' - ); - - $this->assertEquals( - '3 hours ago', - DBField::create_field('SS_Datetime', '2000-12-31 08:50:58')->Ago(), - 'Past match on hours' - ); - - SS_Datetime::clear_mock_now(); - } - - public function testAgoInFuture() { - SS_Datetime::set_mock_now('2000-12-31 00:00:00'); - - $this->assertEquals( - 'in 10 years', - DBField::create_field('SS_Datetime', '2010-12-31 12:00:00')->Ago(), - 'Exact past match on years' - ); - - $this->assertEquals( - 'in 1 hour', - DBField::create_field('SS_Datetime', '2000-12-31 1:01:05')->Ago(true, 1), - 'Approximate past match on minutes, significance=1' - ); - - $this->assertEquals( - 'in 61 mins', - DBField::create_field('SS_Datetime', '2000-12-31 1:01:05')->Ago(), - 'Approximate past match on minutes' - ); - - SS_Datetime::clear_mock_now(); - } - - public function testFormatFromSettings() { - - $memberID = $this->logInWithPermission(); - $member = DataObject::get_by_id('Member', $memberID); - $member->DateFormat = 'dd/MM/YYYY'; - $member->TimeFormat = 'hh:mm:ss'; - $member->write(); - - $fixtures = array( - '2000-12-31 10:11:01' => '31/12/2000 10:11:01', - '2000-12-31 1:11:01' => '31/12/2000 01:11:01', - '12/12/2000 1:11:01' => '12/12/2000 01:11:01', - '2000-12-31' => '31/12/2000 12:00:00', - '2014-04-01 10:11:01' => '01/04/2014 10:11:01', - '10:11:01' => date('d/m/Y').' 10:11:01' - ); - - foreach($fixtures as $from => $to) { - $date = DBField::create_field('SS_Datetime', $from); - // With member - $this->assertEquals($to, $date->FormatFromSettings($member)); - // Without member - $this->assertEquals($to, $date->FormatFromSettings()); - } - } - -} diff --git a/tests/model/DbDatetimeTest.php b/tests/model/DbDatetimeTest.php index 22b832321e8..8a08f9bdabb 100644 --- a/tests/model/DbDatetimeTest.php +++ b/tests/model/DbDatetimeTest.php @@ -1,145 +1,224 @@ -assertEquals($systemDatetime->Date(), $nowDatetime->Date()); + } -class DbDatetimeTest extends FunctionalTest { + public function testNowWithMockDate() { + // Test setting + $mockDate = '2001-12-31 22:10:59'; + DBDatetime::set_mock_now($mockDate); + $systemDatetime = DBField::create_field('Datetime', date('Y-m-d H:i:s')); + $nowDatetime = DBDatetime::now(); + $this->assertNotEquals($systemDatetime->Date(), $nowDatetime->Date()); + $this->assertEquals($nowDatetime->getValue(), $mockDate); + + // Test clearing + DBDatetime::clear_mock_now(); + $systemDatetime = DBField::create_field('Datetime', date('Y-m-d H:i:s')); + $nowDatetime = DBDatetime::now(); + $this->assertEquals($systemDatetime->Date(), $nowDatetime->Date()); + } - protected static $fixture_file = 'DbDatetimeTest.yml'; + public function testSetNullAndZeroValues() { + $date = DBField::create_field('Datetime', ''); + $this->assertNull($date->getValue(), 'Empty string evaluates to NULL'); - protected $extraDataObjects = array('DbDatetimeTest_Team'); + $date = DBField::create_field('Datetime', null); + $this->assertNull($date->getValue(), 'NULL is set as NULL'); - protected $offset; + $date = DBField::create_field('Datetime', false); + $this->assertNull($date->getValue(), 'Boolean FALSE evaluates to NULL'); - protected $adapter; + $date = DBField::create_field('Datetime', '0'); + $this->assertEquals('1970-01-01 00:00:00', $date->getValue(), 'String zero is UNIX epoch time'); - /** - * Check if dates match more or less. This takes into the account the db query - * can overflow to the next second giving offset readings. - */ - private function matchesRoughly($date1, $date2, $comment = '', $offset) { - $allowedDifference = 5 + abs($offset); // seconds + $date = DBField::create_field('Datetime', 0); + $this->assertEquals('1970-01-01 00:00:00', $date->getValue(), 'Numeric zero is UNIX epoch time'); + } - $time1 = is_numeric($date1) ? $date1 : strtotime($date1); - $time2 = is_numeric($date2) ? $date2 : strtotime($date2); + public function testExtendedDateTimes() { + $date = DBField::create_field('Datetime', '1500-10-10 15:32:24'); + $this->assertEquals('10 Oct 1500 15 32 24', $date->Format('d M Y H i s')); - $this->assertTrue(abs($time1-$time2)<$allowedDifference, - $comment . " (times differ by " . abs($time1-$time2) . " seconds)"); + $date = DBField::create_field('Datetime', '3000-10-10 15:32:24'); + $this->assertEquals('10 Oct 3000 15 32 24', $date->Format('d M Y H i s')); } - private function getDbNow() { - $query = 'SELECT ' . $this->adapter->formattedDatetimeClause('now', '%U'); - return DB::query($query)->value(); + public function testNice() { + $date = DBField::create_field('Datetime', '2001-12-31 22:10:59'); + $this->assertEquals('31/12/2001 10:10pm', $date->Nice()); } - /** - * Needs to be run within a test*() context. - * - * @return Int Offset in seconds - */ - private function checkPreconditions() { - // number of seconds of php and db time are out of sync - $offset = time() - strtotime(DB::query('SELECT ' . DB::get_conn()->now())->value()); - $threshold = 5; // seconds - - if($offset > 5) { - $this->markTestSkipped('The time of the database is out of sync with the webserver by ' - . abs($offset) . ' seconds.'); - } - - if(method_exists($this->adapter, 'supportsTimezoneOverride') && !$this->adapter->supportsTimezoneOverride()) { - $this->markTestSkipped("Database doesn't support timezone overrides"); - } - - return $offset; + public function testNice24() { + $date = DBField::create_field('Datetime', '2001-12-31 22:10:59'); + $this->assertEquals('31/12/2001 22:10', $date->Nice24()); } - public function setUp() { - parent::setUp(); - $this->adapter = DB::get_conn(); + public function testDate() { + $date = DBField::create_field('Datetime', '2001-12-31 22:10:59'); + $this->assertEquals('31/12/2001', $date->Date()); } - public function testCorrectNow() { - $offset = $this->checkPreconditions(); - - $clause = $this->adapter->formattedDatetimeClause('now', '%U'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->assertRegExp('/^\d*$/', (string) $result); - $this->assertTrue($result>0); + public function testTime() { + $date = DBField::create_field('Datetime', '2001-12-31 22:10:59'); + $this->assertEquals('10:10pm', $date->Time()); } - public function testDbDatetimeFormat() { - $offset = $this->checkPreconditions(); - - $clause = $this->adapter->formattedDatetimeClause('1973-10-14 10:30:00', '%H:%i, %d/%m/%Y'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, date('H:i, d/m/Y', strtotime('1973-10-14 10:30:00')), 'nice literal time', - $offset); + public function testTime24() { + $date = DBField::create_field('Datetime', '2001-12-31 22:10:59'); + $this->assertEquals('22:10', $date->Time24()); + } - $clause = $this->adapter->formattedDatetimeClause('now', '%d'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, date('d', $this->getDbNow()), 'todays day', $offset); + public function testURLDateTime(){ + $date = DBField::create_field('Datetime', '2001-12-31 22:10:59'); + $this->assertEquals('2001-12-31%2022:10:59', $date->URLDateTime()); + } - $clause = $this->adapter->formattedDatetimeClause('"Created"', '%U') . ' AS test FROM "DbDateTimeTest_Team"'; - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created), - 'fixture ->Created as timestamp', $offset); + public function testAgoInPast() { + DBDatetime::set_mock_now('2000-12-31 12:00:00'); + + $this->assertEquals( + '10 years ago', + DBField::create_field('Datetime', '1990-12-31 12:00:00')->Ago(), + 'Exact past match on years' + ); + + $this->assertEquals( + '10 years ago', + DBField::create_field('Datetime', '1990-12-30 12:00:00')->Ago(), + 'Approximate past match on years' + ); + + $this->assertEquals( + '1 year ago', + DBField::create_field('Datetime', '1999-12-30 12:00:12')->Ago(true, 1), + 'Approximate past match in singular, significance=1' + ); + + $this->assertEquals( + '12 months ago', + DBField::create_field('Datetime', '1999-12-30 12:00:12')->Ago(), + 'Approximate past match in singular' + ); + + $this->assertEquals( + '50 mins ago', + DBField::create_field('Datetime', '2000-12-31 11:10:11')->Ago(), + 'Approximate past match on minutes' + ); + + $this->assertEquals( + '59 secs ago', + DBField::create_field('Datetime', '2000-12-31 11:59:01')->Ago(), + 'Approximate past match on seconds' + ); + + $this->assertEquals( + 'less than a minute ago', + DBField::create_field('Datetime', '2000-12-31 11:59:01')->Ago(false), + 'Approximate past match on seconds with $includeSeconds=false' + ); + + $this->assertEquals( + '1 min ago', + DBField::create_field('Datetime', '2000-12-31 11:58:50')->Ago(false), + 'Test between 1 and 2 minutes with includeSeconds=false' + ); + + $this->assertEquals( + '70 secs ago', + DBField::create_field('Datetime', '2000-12-31 11:58:50')->Ago(true), + 'Test between 1 and 2 minutes with includeSeconds=true' + ); + + $this->assertEquals( + '4 mins ago', + DBField::create_field('Datetime', '2000-12-31 11:55:50')->Ago(), + 'Past match on minutes' + ); + + $this->assertEquals( + '1 hour ago', + DBField::create_field('Datetime', '2000-12-31 10:50:58')->Ago(true, 1), + 'Past match on hours, significance=1' + ); + + $this->assertEquals( + '3 hours ago', + DBField::create_field('Datetime', '2000-12-31 08:50:58')->Ago(), + 'Past match on hours' + ); + + DBDatetime::clear_mock_now(); } - public function testDbDatetimeInterval() { - $offset = $this->checkPreconditions(); + public function testAgoInFuture() { + DBDatetime::set_mock_now('2000-12-31 00:00:00'); - $clause = $this->adapter->datetimeIntervalClause('1973-10-14 10:30:00', '+18 Years'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, '1991-10-14 10:30:00', 'add 18 years', $offset); + $this->assertEquals( + 'in 10 years', + DBField::create_field('Datetime', '2010-12-31 12:00:00')->Ago(), + 'Exact past match on years' + ); - $clause = $this->adapter->datetimeIntervalClause('now', '+1 Day'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime('+1 Day', $this->getDbNow())), 'tomorrow', - $offset); + $this->assertEquals( + 'in 1 hour', + DBField::create_field('Datetime', '2000-12-31 1:01:05')->Ago(true, 1), + 'Approximate past match on minutes, significance=1' + ); - $query = new SQLSelect(); - $query->setSelect(array()); - $query->selectField($this->adapter->datetimeIntervalClause('"Created"', '-15 Minutes'), 'test') - ->setFrom('"DbDateTimeTest_Team"') - ->setLimit(1); + $this->assertEquals( + 'in 61 mins', + DBField::create_field('Datetime', '2000-12-31 1:01:05')->Ago(), + 'Approximate past match on minutes' + ); - $result = $query->execute()->value(); - $this->matchesRoughly($result, - date('Y-m-d H:i:s', strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created) - 900), - '15 Minutes before creating fixture', $offset); + DBDatetime::clear_mock_now(); } - public function testDbDatetimeDifference() { - $offset = $this->checkPreconditions(); - - $clause = $this->adapter->datetimeDifferenceClause('1974-10-14 10:30:00', '1973-10-14 10:30:00'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result/86400, 365, '1974 - 1973 = 365 * 86400 sec', $offset); - - $clause = $this->adapter->datetimeDifferenceClause(date('Y-m-d H:i:s', strtotime('-15 seconds')), 'now'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, -15, '15 seconds ago - now', $offset); - - $clause = $this->adapter->datetimeDifferenceClause('now', - $this->adapter->datetimeIntervalClause('now', '+45 Minutes')); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, -45 * 60, 'now - 45 minutes ahead', $offset); - - $query = new SQLSelect(); - $query->setSelect(array()); - $query->selectField($this->adapter->datetimeDifferenceClause('"LastEdited"', '"Created"'), 'test') - ->setFrom('"DbDateTimeTest_Team"') - ->setLimit(1); - - $result = $query->execute()->value(); - $lastedited = Dataobject::get_one('DbDateTimeTest_Team')->LastEdited; - $created = Dataobject::get_one('DbDateTimeTest_Team')->Created; - $this->matchesRoughly($result, strtotime($lastedited) - strtotime($created), - 'age of HomePage record in seconds since unix epoc', $offset); + public function testFormatFromSettings() { + + $memberID = $this->logInWithPermission(); + $member = DataObject::get_by_id('Member', $memberID); + $member->DateFormat = 'dd/MM/YYYY'; + $member->TimeFormat = 'hh:mm:ss'; + $member->write(); + + $fixtures = array( + '2000-12-31 10:11:01' => '31/12/2000 10:11:01', + '2000-12-31 1:11:01' => '31/12/2000 01:11:01', + '12/12/2000 1:11:01' => '12/12/2000 01:11:01', + '2000-12-31' => '31/12/2000 12:00:00', + '2014-04-01 10:11:01' => '01/04/2014 10:11:01', + '10:11:01' => date('d/m/Y').' 10:11:01' + ); + + foreach($fixtures as $from => $to) { + $date = DBField::create_field('Datetime', $from); + // With member + $this->assertEquals($to, $date->FormatFromSettings($member)); + // Without member + $this->assertEquals($to, $date->FormatFromSettings()); + } } } - -class DbDateTimeTest_Team extends DataObject implements TestOnly { - private static $db = array( - 'Title' => 'Varchar' - ); -} diff --git a/tests/model/ImageTest.php b/tests/model/ImageTest.php index 2b882484f56..ef23289cd93 100644 --- a/tests/model/ImageTest.php +++ b/tests/model/ImageTest.php @@ -46,7 +46,7 @@ public function tearDown() { } public function testGetTagWithTitle() { - Config::inst()->update('DBFile', 'force_resample', false); + Config::inst()->update('SilverStripe\Filesystem\Storage\DBFile', 'force_resample', false); $image = $this->objFromFixture('Image', 'imageWithTitle'); $expected = 'This is a image Title'; @@ -56,7 +56,7 @@ public function testGetTagWithTitle() { } public function testGetTagWithoutTitle() { - Config::inst()->update('DBFile', 'force_resample', false); + Config::inst()->update('SilverStripe\Filesystem\Storage\DBFile', 'force_resample', false); $image = $this->objFromFixture('Image', 'imageWithoutTitle'); $expected = 'test image'; @@ -66,7 +66,7 @@ public function testGetTagWithoutTitle() { } public function testGetTagWithoutTitleContainingDots() { - Config::inst()->update('DBFile', 'force_resample', false); + Config::inst()->update('SilverStripe\Filesystem\Storage\DBFile', 'force_resample', false); $image = $this->objFromFixture('Image', 'imageWithoutTitleContainingDots'); $expected = 'test.image.with.dots'; @@ -156,7 +156,7 @@ public function testForceResample() { $imageLQR = $imageLQ->Resampled(); // Test resampled file is served when force_resample = true - Config::inst()->update('DBFile', 'force_resample', true); + Config::inst()->update('SilverStripe\Filesystem\Storage\DBFile', 'force_resample', true); $this->assertLessThan($imageHQ->getAbsoluteSize(), $imageHQR->getAbsoluteSize(), 'Resampled image is smaller than original'); $this->assertEquals($imageHQ->getURL(), $imageHQR->getSourceURL(), 'Path to a resampled image was returned by getURL()'); @@ -165,7 +165,7 @@ public function testForceResample() { $this->assertNotEquals($imageLQ->getURL(), $imageLQR->getSourceURL(), 'Path to the original image file was returned by getURL()'); // Test original file is served when force_resample = false - Config::inst()->update('DBFile', 'force_resample', false); + Config::inst()->update('SilverStripe\Filesystem\Storage\DBFile', 'force_resample', false); $this->assertNotEquals($imageHQ->getURL(), $imageHQR->getSourceURL(), 'Path to the original image file was returned by getURL()'); } diff --git a/tests/model/LabelFieldTest.php b/tests/model/LabelFieldTest.php index 630ecd04e30..e291c8f9c6e 100644 --- a/tests/model/LabelFieldTest.php +++ b/tests/model/LabelFieldTest.php @@ -8,6 +8,6 @@ class LabelFieldTest extends SapphireTest { public function testFieldHasNoNameAttribute() { $field = new LabelField('MyName', 'MyTitle'); - $this->assertEquals($field->Field(), ''); + $this->assertEquals(trim($field->Field()), ''); } } diff --git a/tests/model/ManyManyListTest.php b/tests/model/ManyManyListTest.php index 1ff7de4bcf2..eaa60c3f2d3 100644 --- a/tests/model/ManyManyListTest.php +++ b/tests/model/ManyManyListTest.php @@ -1,5 +1,7 @@ write(); - $money = new Money(); + $money = new DBMoney(); $money->setAmount(100); $money->setCurrency('USD'); @@ -53,7 +55,7 @@ public function testAddCompositedExtraFields() { $check = $obj->Clients()->First(); $this->assertEquals('Foo', $check->Reference, 'Basic scalar fields should exist'); - $this->assertInstanceOf('Money', $check->Worth, 'Composite fields should exist on the record'); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBMoney', $check->Worth, 'Composite fields should exist on the record'); $this->assertEquals(100, $check->Worth->getAmount()); } diff --git a/tests/model/VersionedTest.php b/tests/model/VersionedTest.php index 7de5ef33ba7..9941b5c59b2 100644 --- a/tests/model/VersionedTest.php +++ b/tests/model/VersionedTest.php @@ -1,5 +1,7 @@ Title = 'Archived page'; $testPage->Content = 'This is the content from 2005'; @@ -540,19 +542,19 @@ public function testArchiveVersion() { $testPage->write(); // In 2007 we updated it - SS_Datetime::set_mock_now('2007-01-01 00:00:00'); + DBDatetime::set_mock_now('2007-01-01 00:00:00'); $testPage->Content = "It's 2007 already!"; $testPage->ExtraField = '2007'; $testPage->write(); // In 2009 we updated it again - SS_Datetime::set_mock_now('2009-01-01 00:00:00'); + DBDatetime::set_mock_now('2009-01-01 00:00:00'); $testPage->Content = "I'm enjoying 2009"; $testPage->ExtraField = '2009'; $testPage->write(); // End mock, back to the present day:) - SS_Datetime::clear_mock_now(); + DBDatetime::clear_mock_now(); // Test 1 - 2006 Content singleton('VersionedTest_Subclass')->flushCache(true); @@ -583,7 +585,7 @@ public function testArchiveVersion() { public function testAllVersions() { // In 2005 this file was created - SS_Datetime::set_mock_now('2005-01-01 00:00:00'); + DBDatetime::set_mock_now('2005-01-01 00:00:00'); $testPage = new VersionedTest_Subclass(); $testPage->Title = 'Archived page'; $testPage->Content = 'This is the content from 2005'; @@ -591,7 +593,7 @@ public function testAllVersions() $testPage->write(); // In 2007 we updated it - SS_Datetime::set_mock_now('2007-01-01 00:00:00'); + DBDatetime::set_mock_now('2007-01-01 00:00:00'); $testPage->Content = "It's 2007 already!"; $testPage->ExtraField = '2007'; $testPage->write(); @@ -612,13 +614,13 @@ public function testAllVersions() $this->assertEquals($extraFields, array('2005', '2007'), 'Version fields returned'); // In 2009 we updated it again - SS_Datetime::set_mock_now('2009-01-01 00:00:00'); + DBDatetime::set_mock_now('2009-01-01 00:00:00'); $testPage->Content = "I'm enjoying 2009"; $testPage->ExtraField = '2009'; $testPage->write(); // End mock, back to the present day:) - SS_Datetime::clear_mock_now(); + DBDatetime::clear_mock_now(); $versions = Versioned::get_all_versions('VersionedTest_Subclass', $testPage->ID); $content = array(); @@ -637,7 +639,7 @@ public function testAllVersions() } public function testArchiveRelatedDataWithoutVersioned() { - SS_Datetime::set_mock_now('2009-01-01 00:00:00'); + DBDatetime::set_mock_now('2009-01-01 00:00:00'); $relatedData = new VersionedTest_RelatedWithoutVersion(); $relatedData->Name = 'Related Data'; @@ -649,7 +651,7 @@ public function testArchiveRelatedDataWithoutVersioned() { $testData->Related()->add($relatedData); $id = $testData->write(); - SS_Datetime::set_mock_now('2010-01-01 00:00:00'); + DBDatetime::set_mock_now('2010-01-01 00:00:00'); $testData->Content = 'After Content'; $testData->write(); diff --git a/tests/security/SecurityTest.php b/tests/security/SecurityTest.php index 15be5b652d1..b980db321cf 100644 --- a/tests/security/SecurityTest.php +++ b/tests/security/SecurityTest.php @@ -1,4 +1,8 @@ objFromFixture('Member', 'test'); $admin->FailedLoginCount = 99; - $admin->LockedOutUntil = SS_Datetime::now()->Format('Y-m-d H:i:s'); + $admin->LockedOutUntil = DBDatetime::now()->Format('Y-m-d H:i:s'); $admin->write(); $this->assertNull($admin->AutoLoginHash, 'Hash is empty before lost password'); diff --git a/tests/view/ViewableDataTest.php b/tests/view/ViewableDataTest.php index 1e153fd1390..75791419c25 100644 --- a/tests/view/ViewableDataTest.php +++ b/tests/view/ViewableDataTest.php @@ -153,7 +153,7 @@ public function testObjWithCachedStringValueReturnsValidObject() { // Casted data should be the string wrapped in a DBField-object. $this->assertNotEmpty($castedData, 'Casted data was empty.'); - $this->assertInstanceOf('DBField', $castedData, 'Casted data should be instance of DBField.'); + $this->assertInstanceOf('SilverStripe\Model\FieldType\DBField', $castedData, 'Casted data should be instance of DBField.'); $this->assertEquals($uncastedData, $castedData->getValue(), 'Casted and uncasted strings are not equal.'); } diff --git a/view/SSViewer.php b/view/SSViewer.php index fc42381aecb..1856b6d17f7 100644 --- a/view/SSViewer.php +++ b/view/SSViewer.php @@ -1,5 +1,7 @@ get('ViewableData', 'default_cast', Config::FIRST_SET); - $obj = new $casting($property); + $obj = Injector::inst()->get($casting, false, array($property)); $obj->setValue($res['value']); $res['obj'] = $obj; diff --git a/view/ViewableData.php b/view/ViewableData.php index 62f0b29689b..2c2c79f09b6 100644 --- a/view/ViewableData.php +++ b/view/ViewableData.php @@ -1,4 +1,7 @@ castingClass($field) ?: $this->config()->default_cast; - return Config::inst()->get($class, 'escape_type', Config::FIRST_SET); + // TODO: It would be quicker not to instantiate the object, but to merely + // get its class from the Injector + return Injector::inst()->get($class, true)->config()->escape_type; } /** From f5af0c85bade63174d282162a6c99fb37461b433 Mon Sep 17 00:00:00 2001 From: Sam Minnee Date: Fri, 28 Aug 2015 16:42:43 +1200 Subject: [PATCH 9/9] =?UTF-8?q?FIX:=20Don=E2=80=99t=20use=20SplFixedArray?= =?UTF-8?q?=20in=20PHP=207.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PHP 7 seems to suffer a segfault when using SplFixedArray. Since LRU is deprecated anyway, I’m not too fussed about getting to the bottom of this issue, however, if it turns out that SplFixedArray is corrected in PHP 7.0.0 stable or a future patch release, we could update this check. --- core/Config.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/Config.php b/core/Config.php index 86fc577ae35..e2e8fabbc41 100644 --- a/core/Config.php +++ b/core/Config.php @@ -703,8 +703,8 @@ class Config_LRU { public function __construct() { Deprecation::notice('4.0', 'Please use Config_MemCache instead', Deprecation::SCOPE_CLASS); - if (version_compare(PHP_VERSION, '5.3.7', '<')) { - // SplFixedArray causes seg faults before PHP 5.3.7 + if (version_compare(PHP_VERSION, '5.3.7', '<') || version_compare(PHP_VERSION, '6.99.99', '>')) { + // SplFixedArray causes seg faults before PHP 5.3.7, and also in 7.0.0-RC1 $this->cache = array(); } else {