diff options
Diffstat (limited to 'vendors/simpletest/web_tester.php')
| -rw-r--r-- | vendors/simpletest/web_tester.php | 1541 | 
1 files changed, 1541 insertions, 0 deletions
diff --git a/vendors/simpletest/web_tester.php b/vendors/simpletest/web_tester.php new file mode 100644 index 000000000..40b161291 --- /dev/null +++ b/vendors/simpletest/web_tester.php @@ -0,0 +1,1541 @@ +<?php +/** + *  Base include file for SimpleTest. + *  @package    SimpleTest + *  @subpackage WebTester + *  @version    $Id: web_tester.php 1723 2008-04-08 00:34:10Z lastcraft $ + */ + +/**#@+ + *  include other SimpleTest class files + */ +require_once(dirname(__FILE__) . '/test_case.php'); +require_once(dirname(__FILE__) . '/browser.php'); +require_once(dirname(__FILE__) . '/page.php'); +require_once(dirname(__FILE__) . '/expectation.php'); +/**#@-*/ + +/** + *    Test for an HTML widget value match. + *    @package SimpleTest + *    @subpackage WebTester + */ +class FieldExpectation extends SimpleExpectation { +    var $_value; +     +    /** +     *    Sets the field value to compare against. +     *    @param mixed $value     Test value to match. Can be an +     *                            expectation for say pattern matching. +     *    @param string $message  Optiona message override. Can use %s as +     *                            a placeholder for the original message. +     *    @access public +     */ +    function FieldExpectation($value, $message = '%s') { +        $this->SimpleExpectation($message); +        if (is_array($value)) { +            sort($value); +        } +        $this->_value = $value; +    } +     +    /** +     *    Tests the expectation. True if it matches +     *    a string value or an array value in any order. +     *    @param mixed $compare        Comparison value. False for +     *                                 an unset field. +     *    @return boolean              True if correct. +     *    @access public +     */ +    function test($compare) { +        if ($this->_value === false) { +            return ($compare === false); +        } +        if ($this->_isSingle($this->_value)) { +            return $this->_testSingle($compare); +        } +        if (is_array($this->_value)) { +            return $this->_testMultiple($compare); +        } +        return false; +    } +     +    /** +     *    Tests for valid field comparisons with a single option. +     *    @param mixed $value       Value to type check. +     *    @return boolean           True if integer, string or float. +     *    @access private +     */ +    function _isSingle($value) { +        return is_string($value) || is_integer($value) || is_float($value); +    } +     +    /** +     *    String comparison for simple field with a single option. +     *    @param mixed $compare    String to test against. +     *    @returns boolean         True if matching. +     *    @access private +     */ +    function _testSingle($compare) { +        if (is_array($compare) && count($compare) == 1) { +            $compare = $compare[0]; +        } +        if (! $this->_isSingle($compare)) { +            return false; +        } +        return ($this->_value == $compare); +    } +     +    /** +     *    List comparison for multivalue field. +     *    @param mixed $compare    List in any order to test against. +     *    @returns boolean         True if matching. +     *    @access private +     */ +    function _testMultiple($compare) { +        if (is_string($compare)) { +            $compare = array($compare); +        } +        if (! is_array($compare)) { +            return false; +        } +        sort($compare); +        return ($this->_value === $compare); +    } +     +    /** +     *    Returns a human readable test message. +     *    @param mixed $compare      Comparison value. +     *    @return string             Description of success +     *                               or failure. +     *    @access public +     */ +    function testMessage($compare) { +        $dumper = &$this->_getDumper(); +        if (is_array($compare)) { +            sort($compare); +        } +        if ($this->test($compare)) { +            return "Field expectation [" . $dumper->describeValue($this->_value) . "]"; +        } else { +            return "Field expectation [" . $dumper->describeValue($this->_value) . +                    "] fails with [" . +                    $dumper->describeValue($compare) . "] " . +                    $dumper->describeDifference($this->_value, $compare); +        } +    } +} + +/** + *    Test for a specific HTTP header within a header block. + *    @package SimpleTest + *    @subpackage WebTester + */ +class HttpHeaderExpectation extends SimpleExpectation { +    var $_expected_header; +    var $_expected_value; +     +    /** +     *    Sets the field and value to compare against. +     *    @param string $header   Case insenstive trimmed header name. +     *    @param mixed $value     Optional value to compare. If not +     *                            given then any value will match. If +     *                            an expectation object then that will +     *                            be used instead. +     *    @param string $message  Optiona message override. Can use %s as +     *                            a placeholder for the original message. +     */ +    function HttpHeaderExpectation($header, $value = false, $message = '%s') { +        $this->SimpleExpectation($message); +        $this->_expected_header = $this->_normaliseHeader($header); +        $this->_expected_value = $value; +    } +     +    /** +     *    Accessor for aggregated object. +     *    @return mixed        Expectation set in constructor. +     *    @access protected +     */ +    function _getExpectation() { +        return $this->_expected_value; +    } +     +    /** +     *    Removes whitespace at ends and case variations. +     *    @param string $header    Name of header. +     *    @param string            Trimmed and lowecased header +     *                             name. +     *    @access private +     */ +    function _normaliseHeader($header) { +        return strtolower(trim($header)); +    } +     +    /** +     *    Tests the expectation. True if it matches +     *    a string value or an array value in any order. +     *    @param mixed $compare   Raw header block to search. +     *    @return boolean         True if header present. +     *    @access public +     */ +    function test($compare) { +        return is_string($this->_findHeader($compare)); +    } +     +    /** +     *    Searches the incoming result. Will extract the matching +     *    line as text. +     *    @param mixed $compare   Raw header block to search. +     *    @return string          Matching header line. +     *    @access protected +     */ +    function _findHeader($compare) { +        $lines = split("\r\n", $compare); +        foreach ($lines as $line) { +            if ($this->_testHeaderLine($line)) { +                return $line; +            } +        } +        return false; +    } +     +    /** +     *    Compares a single header line against the expectation. +     *    @param string $line      A single line to compare. +     *    @return boolean          True if matched. +     *    @access private +     */ +    function _testHeaderLine($line) { +        if (count($parsed = split(':', $line, 2)) < 2) { +            return false; +        } +        list($header, $value) = $parsed; +        if ($this->_normaliseHeader($header) != $this->_expected_header) { +            return false; +        } +        return $this->_testHeaderValue($value, $this->_expected_value); +    } +     +    /** +     *    Tests the value part of the header. +     *    @param string $value        Value to test. +     *    @param mixed $expected      Value to test against. +     *    @return boolean             True if matched. +     *    @access protected +     */ +    function _testHeaderValue($value, $expected) { +        if ($expected === false) { +            return true; +        } +        if (SimpleExpectation::isExpectation($expected)) { +            return $expected->test(trim($value)); +        } +        return (trim($value) == trim($expected)); +    } +     +    /** +     *    Returns a human readable test message. +     *    @param mixed $compare      Raw header block to search. +     *    @return string             Description of success +     *                               or failure. +     *    @access public +     */ +    function testMessage($compare) { +        if (SimpleExpectation::isExpectation($this->_expected_value)) { +            $message = $this->_expected_value->overlayMessage($compare, $this->_getDumper()); +        } else { +            $message = $this->_expected_header . +                    ($this->_expected_value ? ': ' . $this->_expected_value : ''); +        } +        if (is_string($line = $this->_findHeader($compare))) { +            return "Searching for header [$message] found [$line]"; +        } else { +            return "Failed to find header [$message]"; +        } +    } +} +     +/** + *    Test for a specific HTTP header within a header block that + *    should not be found. + *    @package SimpleTest + *    @subpackage WebTester + */ +class NoHttpHeaderExpectation extends HttpHeaderExpectation { +    var $_expected_header; +    var $_expected_value; +     +    /** +     *    Sets the field and value to compare against. +     *    @param string $unwanted   Case insenstive trimmed header name. +     *    @param string $message    Optiona message override. Can use %s as +     *                              a placeholder for the original message. +     */ +    function NoHttpHeaderExpectation($unwanted, $message = '%s') { +        $this->HttpHeaderExpectation($unwanted, false, $message); +    } +     +    /** +     *    Tests that the unwanted header is not found. +     *    @param mixed $compare   Raw header block to search. +     *    @return boolean         True if header present. +     *    @access public +     */ +    function test($compare) { +        return ($this->_findHeader($compare) === false); +    } +     +    /** +     *    Returns a human readable test message. +     *    @param mixed $compare      Raw header block to search. +     *    @return string             Description of success +     *                               or failure. +     *    @access public +     */ +    function testMessage($compare) { +        $expectation = $this->_getExpectation(); +        if (is_string($line = $this->_findHeader($compare))) { +            return "Found unwanted header [$expectation] with [$line]"; +        } else { +            return "Did not find unwanted header [$expectation]"; +        } +    } +} + +/** + *    Test for a text substring. + *    @package SimpleTest + *    @subpackage UnitTester + */ +class TextExpectation extends SimpleExpectation { +    var $_substring; +     +    /** +     *    Sets the value to compare against. +     *    @param string $substring  Text to search for. +     *    @param string $message    Customised message on failure. +     *    @access public +     */ +    function TextExpectation($substring, $message = '%s') { +        $this->SimpleExpectation($message); +        $this->_substring = $substring; +    } +     +    /** +     *    Accessor for the substring. +     *    @return string       Text to match. +     *    @access protected +     */ +    function _getSubstring() { +        return $this->_substring; +    } +     +    /** +     *    Tests the expectation. True if the text contains the +     *    substring. +     *    @param string $compare        Comparison value. +     *    @return boolean               True if correct. +     *    @access public +     */ +    function test($compare) { +        return (strpos($compare, $this->_substring) !== false); +    } +     +    /** +     *    Returns a human readable test message. +     *    @param mixed $compare      Comparison value. +     *    @return string             Description of success +     *                               or failure. +     *    @access public +     */ +    function testMessage($compare) { +        if ($this->test($compare)) { +            return $this->_describeTextMatch($this->_getSubstring(), $compare); +        } else { +            $dumper = &$this->_getDumper(); +            return "Text [" . $this->_getSubstring() . +                    "] not detected in [" . +                    $dumper->describeValue($compare) . "]"; +        } +    } +     +    /** +     *    Describes a pattern match including the string +     *    found and it's position. +     *    @param string $substring      Text to search for. +     *    @param string $subject        Subject to search. +     *    @access protected +     */ +    function _describeTextMatch($substring, $subject) { +        $position = strpos($subject, $substring); +        $dumper = &$this->_getDumper(); +        return "Text [$substring] detected at character [$position] in [" . +                $dumper->describeValue($subject) . "] in region [" . +                $dumper->clipString($subject, 100, $position) . "]"; +    } +} + +/** + *    Fail if a substring is detected within the + *    comparison text. + *    @package SimpleTest + *    @subpackage UnitTester + */ +class NoTextExpectation extends TextExpectation { +     +    /** +     *    Sets the reject pattern +     *    @param string $substring  Text to search for. +     *    @param string $message    Customised message on failure. +     *    @access public +     */ +    function NoTextExpectation($substring, $message = '%s') { +        $this->TextExpectation($substring, $message); +    } +     +    /** +     *    Tests the expectation. False if the substring appears +     *    in the text. +     *    @param string $compare        Comparison value. +     *    @return boolean               True if correct. +     *    @access public +     */ +    function test($compare) { +        return ! parent::test($compare); +    } +     +    /** +     *    Returns a human readable test message. +     *    @param string $compare      Comparison value. +     *    @return string              Description of success +     *                                or failure. +     *    @access public +     */ +    function testMessage($compare) { +        if ($this->test($compare)) { +            $dumper = &$this->_getDumper(); +            return "Text [" . $this->_getSubstring() . +                    "] not detected in [" . +                    $dumper->describeValue($compare) . "]"; +        } else { +            return $this->_describeTextMatch($this->_getSubstring(), $compare); +        } +    } +} + +/** + *    Test case for testing of web pages. Allows + *    fetching of pages, parsing of HTML and + *    submitting forms. + *    @package SimpleTest + *    @subpackage WebTester + */ +class WebTestCase extends SimpleTestCase { +    var $_browser; +    var $_ignore_errors = false; +     +    /** +     *    Creates an empty test case. Should be subclassed +     *    with test methods for a functional test case. +     *    @param string $label     Name of test case. Will use +     *                             the class name if none specified. +     *    @access public +     */ +    function WebTestCase($label = false) { +        $this->SimpleTestCase($label); +    } +     +    /** +     *    Announces the start of the test. +     *    @param string $method    Test method just started. +     *    @access public +     */ +    function before($method) { +        parent::before($method); +        $this->setBrowser($this->createBrowser()); +    } + +    /** +     *    Announces the end of the test. Includes private clean up. +     *    @param string $method    Test method just finished. +     *    @access public +     */ +    function after($method) { +        $this->unsetBrowser(); +        parent::after($method); +    } +     +    /** +     *    Gets a current browser reference for setting +     *    special expectations or for detailed +     *    examination of page fetches. +     *    @return SimpleBrowser     Current test browser object. +     *    @access public +     */ +    function &getBrowser() { +        return $this->_browser; +    } +     +    /** +     *    Gets a current browser reference for setting +     *    special expectations or for detailed +     *    examination of page fetches. +     *    @param SimpleBrowser $browser    New test browser object. +     *    @access public +     */ +    function setBrowser(&$browser) { +        return $this->_browser = &$browser; +    } +         +    /** +     *    Clears the current browser reference to help the +     *    PHP garbage collector. +     *    @access public +     */ +    function unsetBrowser() { +        unset($this->_browser); +    } +     +    /** +     *    Creates a new default web browser object. +     *    Will be cleared at the end of the test method. +     *    @return TestBrowser           New browser. +     *    @access public +     */ +    function &createBrowser() { +        $browser = &new SimpleBrowser(); +        return $browser; +    } +     +    /** +     *    Gets the last response error. +     *    @return string    Last low level HTTP error. +     *    @access public +     */ +    function getTransportError() { +        return $this->_browser->getTransportError(); +    } +         +    /** +     *    Accessor for the currently selected URL. +     *    @return string        Current location or false if +     *                          no page yet fetched. +     *    @access public +     */ +    function getUrl() { +        return $this->_browser->getUrl(); +    } +     +    /** +     *    Dumps the current request for debugging. +     *    @access public +     */ +    function showRequest() { +        $this->dump($this->_browser->getRequest()); +    } +     +    /** +     *    Dumps the current HTTP headers for debugging. +     *    @access public +     */ +    function showHeaders() { +        $this->dump($this->_browser->getHeaders()); +    } +     +    /** +     *    Dumps the current HTML source for debugging. +     *    @access public +     */ +    function showSource() { +        $this->dump($this->_browser->getContent()); +    } +     +    /** +     *    Dumps the visible text only for debugging. +     *    @access public +     */ +    function showText() { +        $this->dump(wordwrap($this->_browser->getContentAsText(), 80)); +    } +     +    /** +     *    Simulates the closing and reopening of the browser. +     *    Temporary cookies will be discarded and timed +     *    cookies will be expired if later than the +     *    specified time. +     *    @param string/integer $date Time when session restarted. +     *                                If ommitted then all persistent +     *                                cookies are kept. Time is either +     *                                Cookie format string or timestamp. +     *    @access public +     */ +    function restart($date = false) { +        if ($date === false) { +            $date = time(); +        } +        $this->_browser->restart($date); +    } +     +    /** +     *    Moves cookie expiry times back into the past. +     *    Useful for testing timeouts and expiries. +     *    @param integer $interval    Amount to age in seconds. +     *    @access public +     */ +    function ageCookies($interval) { +        $this->_browser->ageCookies($interval); +    } +     +    /** +     *    Disables frames support. Frames will not be fetched +     *    and the frameset page will be used instead. +     *    @access public +     */ +    function ignoreFrames() { +        $this->_browser->ignoreFrames(); +    } +     +    /** +     *    Switches off cookie sending and recieving. +     *    @access public +     */ +    function ignoreCookies() { +        $this->_browser->ignoreCookies(); +    } +     +    /** +     *    Skips errors for the next request only. You might +     *    want to confirm that a page is unreachable for +     *    example. +     *    @access public +     */ +    function ignoreErrors() { +        $this->_ignore_errors = true; +    } +     +    /** +     *    Issues a fail if there is a transport error anywhere +     *    in the current frameset. Only one such error is +     *    reported. +     *    @param string/boolean $result   HTML or failure. +     *    @return string/boolean $result  Passes through result. +     *    @access private +     */ +    function _failOnError($result) { +        if (! $this->_ignore_errors) { +            if ($error = $this->_browser->getTransportError()) { +                $this->fail($error); +            } +        } +        $this->_ignore_errors = false; +        return $result; +    } + +    /** +     *    Adds a header to every fetch. +     *    @param string $header       Header line to add to every +     *                                request until cleared. +     *    @access public +     */ +    function addHeader($header) { +        $this->_browser->addHeader($header); +    } +     +    /** +     *    Sets the maximum number of redirects before +     *    the web page is loaded regardless. +     *    @param integer $max        Maximum hops. +     *    @access public +     */ +    function setMaximumRedirects($max) { +        if (! $this->_browser) { +            trigger_error( +                    'Can only set maximum redirects in a test method, setUp() or tearDown()'); +        } +        $this->_browser->setMaximumRedirects($max); +    } +     +    /** +     *    Sets the socket timeout for opening a connection and +     *    receiving at least one byte of information. +     *    @param integer $timeout      Maximum time in seconds. +     *    @access public +     */ +    function setConnectionTimeout($timeout) { +        $this->_browser->setConnectionTimeout($timeout); +    } +     +    /** +     *    Sets proxy to use on all requests for when +     *    testing from behind a firewall. Set URL +     *    to false to disable. +     *    @param string $proxy        Proxy URL. +     *    @param string $username     Proxy username for authentication. +     *    @param string $password     Proxy password for authentication. +     *    @access public +     */ +    function useProxy($proxy, $username = false, $password = false) { +        $this->_browser->useProxy($proxy, $username, $password); +    } +     +    /** +     *    Fetches a page into the page buffer. If +     *    there is no base for the URL then the +     *    current base URL is used. After the fetch +     *    the base URL reflects the new location. +     *    @param string $url          URL to fetch. +     *    @param hash $parameters     Optional additional GET data. +     *    @return boolean/string      Raw page on success. +     *    @access public +     */ +    function get($url, $parameters = false) { +        return $this->_failOnError($this->_browser->get($url, $parameters)); +    } +     +    /** +     *    Fetches a page by POST into the page buffer. +     *    If there is no base for the URL then the +     *    current base URL is used. After the fetch +     *    the base URL reflects the new location. +     *    @param string $url          URL to fetch. +     *    @param hash $parameters     Optional additional GET data. +     *    @return boolean/string      Raw page on success. +     *    @access public +     */ +    function post($url, $parameters = false) { +        return $this->_failOnError($this->_browser->post($url, $parameters)); +    } +     +    /** +     *    Does a HTTP HEAD fetch, fetching only the page +     *    headers. The current base URL is unchanged by this. +     *    @param string $url          URL to fetch. +     *    @param hash $parameters     Optional additional GET data. +     *    @return boolean             True on success. +     *    @access public +     */ +    function head($url, $parameters = false) { +        return $this->_failOnError($this->_browser->head($url, $parameters)); +    } +     +    /** +     *    Equivalent to hitting the retry button on the +     *    browser. Will attempt to repeat the page fetch. +     *    @return boolean     True if fetch succeeded. +     *    @access public +     */ +    function retry() { +        return $this->_failOnError($this->_browser->retry()); +    } +     +    /** +     *    Equivalent to hitting the back button on the +     *    browser. +     *    @return boolean     True if history entry and +     *                        fetch succeeded. +     *    @access public +     */ +    function back() { +        return $this->_failOnError($this->_browser->back()); +    } +     +    /** +     *    Equivalent to hitting the forward button on the +     *    browser. +     *    @return boolean     True if history entry and +     *                        fetch succeeded. +     *    @access public +     */ +    function forward() { +        return $this->_failOnError($this->_browser->forward()); +    } +     +    /** +     *    Retries a request after setting the authentication +     *    for the current realm. +     *    @param string $username    Username for realm. +     *    @param string $password    Password for realm. +     *    @return boolean/string     HTML on successful fetch. Note +     *                               that authentication may still have +     *                               failed. +     *    @access public +     */ +    function authenticate($username, $password) { +        return $this->_failOnError( +                $this->_browser->authenticate($username, $password)); +    } +     +    /** +     *    Gets the cookie value for the current browser context. +     *    @param string $name          Name of cookie. +     *    @return string               Value of cookie or false if unset. +     *    @access public +     */ +    function getCookie($name) { +        return $this->_browser->getCurrentCookieValue($name); +    } +     +    /** +     *    Sets a cookie in the current browser. +     *    @param string $name          Name of cookie. +     *    @param string $value         Cookie value. +     *    @param string $host          Host upon which the cookie is valid. +     *    @param string $path          Cookie path if not host wide. +     *    @param string $expiry        Expiry date. +     *    @access public +     */ +    function setCookie($name, $value, $host = false, $path = '/', $expiry = false) { +        $this->_browser->setCookie($name, $value, $host, $path, $expiry); +    } +     +    /** +     *    Accessor for current frame focus. Will be +     *    false if no frame has focus. +     *    @return integer/string/boolean    Label if any, otherwise +     *                                      the position in the frameset +     *                                      or false if none. +     *    @access public +     */ +    function getFrameFocus() { +        return $this->_browser->getFrameFocus(); +    } +     +    /** +     *    Sets the focus by index. The integer index starts from 1. +     *    @param integer $choice    Chosen frame. +     *    @return boolean           True if frame exists. +     *    @access public +     */ +    function setFrameFocusByIndex($choice) { +        return $this->_browser->setFrameFocusByIndex($choice); +    } +     +    /** +     *    Sets the focus by name. +     *    @param string $name    Chosen frame. +     *    @return boolean        True if frame exists. +     *    @access public +     */ +    function setFrameFocus($name) { +        return $this->_browser->setFrameFocus($name); +    } +     +    /** +     *    Clears the frame focus. All frames will be searched +     *    for content. +     *    @access public +     */ +    function clearFrameFocus() { +        return $this->_browser->clearFrameFocus(); +    } +     +    /** +     *    Clicks a visible text item. Will first try buttons, +     *    then links and then images. +     *    @param string $label        Visible text or alt text. +     *    @return string/boolean      Raw page or false. +     *    @access public +     */ +    function click($label) { +        return $this->_failOnError($this->_browser->click($label)); +    } +     +    /** +     *    Checks for a click target. +     *    @param string $label        Visible text or alt text. +     *    @return boolean             True if click target. +     *    @access public +     */     +    function assertClickable($label, $message = '%s') { +        return $this->assertTrue( +                $this->_browser->isClickable($label), +                sprintf($message, "Click target [$label] should exist")); +    } +     +    /** +     *    Clicks the submit button by label. The owning +     *    form will be submitted by this. +     *    @param string $label    Button label. An unlabeled +     *                            button can be triggered by 'Submit'. +     *    @param hash $additional Additional form values. +     *    @return boolean/string  Page on success, else false. +     *    @access public +     */ +    function clickSubmit($label = 'Submit', $additional = false) { +        return $this->_failOnError( +                $this->_browser->clickSubmit($label, $additional)); +    } +     +    /** +     *    Clicks the submit button by name attribute. The owning +     *    form will be submitted by this. +     *    @param string $name     Name attribute of button. +     *    @param hash $additional Additional form values. +     *    @return boolean/string  Page on success. +     *    @access public +     */ +    function clickSubmitByName($name, $additional = false) { +        return $this->_failOnError( +                $this->_browser->clickSubmitByName($name, $additional)); +    } +     +    /** +     *    Clicks the submit button by ID attribute. The owning +     *    form will be submitted by this. +     *    @param string $id       ID attribute of button. +     *    @param hash $additional Additional form values. +     *    @return boolean/string  Page on success. +     *    @access public +     */ +    function clickSubmitById($id, $additional = false) { +        return $this->_failOnError( +                $this->_browser->clickSubmitById($id, $additional)); +    } +     +    /** +     *    Checks for a valid button label. +     *    @param string $label        Visible text. +     *    @return boolean             True if click target. +     *    @access public +     */     +    function assertSubmit($label, $message = '%s') { +        return $this->assertTrue( +                $this->_browser->isSubmit($label), +                sprintf($message, "Submit button [$label] should exist")); +    } +     +    /** +     *    Clicks the submit image by some kind of label. Usually +     *    the alt tag or the nearest equivalent. The owning +     *    form will be submitted by this. Clicking outside of +     *    the boundary of the coordinates will result in +     *    a failure. +     *    @param string $label    Alt attribute of button. +     *    @param integer $x       X-coordinate of imaginary click. +     *    @param integer $y       Y-coordinate of imaginary click. +     *    @param hash $additional Additional form values. +     *    @return boolean/string  Page on success. +     *    @access public +     */ +    function clickImage($label, $x = 1, $y = 1, $additional = false) { +        return $this->_failOnError( +                $this->_browser->clickImage($label, $x, $y, $additional)); +    } +     +    /** +     *    Clicks the submit image by the name. Usually +     *    the alt tag or the nearest equivalent. The owning +     *    form will be submitted by this. Clicking outside of +     *    the boundary of the coordinates will result in +     *    a failure. +     *    @param string $name     Name attribute of button. +     *    @param integer $x       X-coordinate of imaginary click. +     *    @param integer $y       Y-coordinate of imaginary click. +     *    @param hash $additional Additional form values. +     *    @return boolean/string  Page on success. +     *    @access public +     */ +    function clickImageByName($name, $x = 1, $y = 1, $additional = false) { +        return $this->_failOnError( +                $this->_browser->clickImageByName($name, $x, $y, $additional)); +    } +     +    /** +     *    Clicks the submit image by ID attribute. The owning +     *    form will be submitted by this. Clicking outside of +     *    the boundary of the coordinates will result in +     *    a failure. +     *    @param integer/string $id   ID attribute of button. +     *    @param integer $x           X-coordinate of imaginary click. +     *    @param integer $y           Y-coordinate of imaginary click. +     *    @param hash $additional     Additional form values. +     *    @return boolean/string      Page on success. +     *    @access public +     */ +    function clickImageById($id, $x = 1, $y = 1, $additional = false) { +        return $this->_failOnError( +                $this->_browser->clickImageById($id, $x, $y, $additional)); +    } +     +    /** +     *    Checks for a valid image with atht alt text or title. +     *    @param string $label        Visible text. +     *    @return boolean             True if click target. +     *    @access public +     */     +    function assertImage($label, $message = '%s') { +        return $this->assertTrue( +                $this->_browser->isImage($label), +                sprintf($message, "Image with text [$label] should exist")); +    } +     +    /** +     *    Submits a form by the ID. +     *    @param string $id       Form ID. No button information +     *                            is submitted this way. +     *    @return boolean/string  Page on success. +     *    @access public +     */ +    function submitFormById($id) { +        return $this->_failOnError($this->_browser->submitFormById($id)); +    } +     +    /** +     *    Follows a link by name. Will click the first link +     *    found with this link text by default, or a later +     *    one if an index is given. Match is case insensitive +     *    with normalised space. +     *    @param string $label     Text between the anchor tags. +     *    @param integer $index    Link position counting from zero. +     *    @return boolean/string   Page on success. +     *    @access public +     */ +    function clickLink($label, $index = 0) { +        return $this->_failOnError($this->_browser->clickLink($label, $index)); +    } +     +    /** +     *    Follows a link by id attribute. +     *    @param string $id        ID attribute value. +     *    @return boolean/string   Page on success. +     *    @access public +     */ +    function clickLinkById($id) { +        return $this->_failOnError($this->_browser->clickLinkById($id)); +    } +     +    /** +     *    Tests for the presence of a link label. Match is +     *    case insensitive with normalised space. +     *    @param string $label     Text between the anchor tags. +     *    @param mixed $expected   Expected URL or expectation object. +     *    @param string $message   Message to display. Default +     *                             can be embedded with %s. +     *    @return boolean          True if link present. +     *    @access public +     */ +    function assertLink($label, $expected = true, $message = '%s') { +        $url = $this->_browser->getLink($label); +        if ($expected === true || ($expected !== true && $url === false)) { +            return $this->assertTrue($url !== false, sprintf($message, "Link [$label] should exist")); +        } +        if (! SimpleExpectation::isExpectation($expected)) { +            $expected = new IdenticalExpectation($expected); +        } +        return $this->assert($expected, $url->asString(), sprintf($message, "Link [$label] should match")); +    } + +    /** +     *    Tests for the non-presence of a link label. Match is +     *    case insensitive with normalised space. +     *    @param string/integer $label    Text between the anchor tags +     *                                    or ID attribute. +     *    @param string $message          Message to display. Default +     *                                    can be embedded with %s. +     *    @return boolean                 True if link missing. +     *    @access public +     */ +    function assertNoLink($label, $message = '%s') { +        return $this->assertTrue( +                $this->_browser->getLink($label) === false, +                sprintf($message, "Link [$label] should not exist")); +    } +     +    /** +     *    Tests for the presence of a link id attribute. +     *    @param string $id        Id attribute value. +     *    @param mixed $expected   Expected URL or expectation object. +     *    @param string $message   Message to display. Default +     *                             can be embedded with %s. +     *    @return boolean          True if link present. +     *    @access public +     */ +    function assertLinkById($id, $expected = true, $message = '%s') { +        $url = $this->_browser->getLinkById($id); +        if ($expected === true) { +            return $this->assertTrue($url !== false, sprintf($message, "Link ID [$id] should exist")); +        } +        if (! SimpleExpectation::isExpectation($expected)) { +            $expected = new IdenticalExpectation($expected); +        } +        return $this->assert($expected, $url->asString(), sprintf($message, "Link ID [$id] should match")); +    } + +    /** +     *    Tests for the non-presence of a link label. Match is +     *    case insensitive with normalised space. +     *    @param string $id        Id attribute value. +     *    @param string $message   Message to display. Default +     *                             can be embedded with %s. +     *    @return boolean          True if link missing. +     *    @access public +     */ +    function assertNoLinkById($id, $message = '%s') { +        return $this->assertTrue( +                $this->_browser->getLinkById($id) === false, +                sprintf($message, "Link ID [$id] should not exist")); +    } +     +    /** +     *    Sets all form fields with that label, or name if there +     *    is no label attached. +     *    @param string $name    Name of field in forms. +     *    @param string $value   New value of field. +     *    @return boolean        True if field exists, otherwise false. +     *    @access public +     */ +    function setField($label, $value, $position=false) { +        return $this->_browser->setField($label, $value, $position); +    } +     +    /** +     *    Sets all form fields with that name. +     *    @param string $name    Name of field in forms. +     *    @param string $value   New value of field. +     *    @return boolean        True if field exists, otherwise false. +     *    @access public +     */ +    function setFieldByName($name, $value, $position=false) { +        return $this->_browser->setFieldByName($name, $value, $position); +    } +         +    /** +     *    Sets all form fields with that id. +     *    @param string/integer $id   Id of field in forms. +     *    @param string $value        New value of field. +     *    @return boolean             True if field exists, otherwise false. +     *    @access public +     */ +    function setFieldById($id, $value) { +        return $this->_browser->setFieldById($id, $value); +    } +     +    /** +     *    Confirms that the form element is currently set +     *    to the expected value. A missing form will always +     *    fail. If no value is given then only the existence +     *    of the field is checked. +     *    @param string $name       Name of field in forms. +     *    @param mixed $expected    Expected string/array value or +     *                              false for unset fields. +     *    @param string $message    Message to display. Default +     *                              can be embedded with %s. +     *    @return boolean           True if pass. +     *    @access public +     */ +    function assertField($label, $expected = true, $message = '%s') { +        $value = $this->_browser->getField($label); +        return $this->_assertFieldValue($label, $value, $expected, $message); +    } +     +    /** +     *    Confirms that the form element is currently set +     *    to the expected value. A missing form element will always +     *    fail. If no value is given then only the existence +     *    of the field is checked. +     *    @param string $name       Name of field in forms. +     *    @param mixed $expected    Expected string/array value or +     *                              false for unset fields. +     *    @param string $message    Message to display. Default +     *                              can be embedded with %s. +     *    @return boolean           True if pass. +     *    @access public +     */ +    function assertFieldByName($name, $expected = true, $message = '%s') { +        $value = $this->_browser->getFieldByName($name); +        return $this->_assertFieldValue($name, $value, $expected, $message); +    } +         +    /** +     *    Confirms that the form element is currently set +     *    to the expected value. A missing form will always +     *    fail. If no ID is given then only the existence +     *    of the field is checked. +     *    @param string/integer $id  Name of field in forms. +     *    @param mixed $expected     Expected string/array value or +     *                               false for unset fields. +     *    @param string $message     Message to display. Default +     *                               can be embedded with %s. +     *    @return boolean            True if pass. +     *    @access public +     */ +    function assertFieldById($id, $expected = true, $message = '%s') { +        $value = $this->_browser->getFieldById($id); +        return $this->_assertFieldValue($id, $value, $expected, $message); +    } +     +    /** +     *    Tests the field value against the expectation. +     *    @param string $identifier      Name, ID or label. +     *    @param mixed $value            Current field value. +     *    @param mixed $expected         Expected value to match. +     *    @param string $message         Failure message. +     *    @return boolean                True if pass +     *    @access protected +     */ +    function _assertFieldValue($identifier, $value, $expected, $message) { +        if ($expected === true) { +            return $this->assertTrue( +                    isset($value), +                    sprintf($message, "Field [$identifier] should exist")); +        } +        if (! SimpleExpectation::isExpectation($expected)) { +            $identifier = str_replace('%', '%%', $identifier); +            $expected = new FieldExpectation( +                    $expected, +                    "Field [$identifier] should match with [%s]"); +        } +        return $this->assert($expected, $value, $message); +    } +     +    /** +     *    Checks the response code against a list +     *    of possible values. +     *    @param array $responses    Possible responses for a pass. +     *    @param string $message     Message to display. Default +     *                               can be embedded with %s. +     *    @return boolean            True if pass. +     *    @access public +     */ +    function assertResponse($responses, $message = '%s') { +        $responses = (is_array($responses) ? $responses : array($responses)); +        $code = $this->_browser->getResponseCode(); +        $message = sprintf($message, "Expecting response in [" . +                implode(", ", $responses) . "] got [$code]"); +        return $this->assertTrue(in_array($code, $responses), $message); +    } +     +    /** +     *    Checks the mime type against a list +     *    of possible values. +     *    @param array $types      Possible mime types for a pass. +     *    @param string $message   Message to display. +     *    @return boolean          True if pass. +     *    @access public +     */ +    function assertMime($types, $message = '%s') { +        $types = (is_array($types) ? $types : array($types)); +        $type = $this->_browser->getMimeType(); +        $message = sprintf($message, "Expecting mime type in [" . +                implode(", ", $types) . "] got [$type]"); +        return $this->assertTrue(in_array($type, $types), $message); +    } +     +    /** +     *    Attempt to match the authentication type within +     *    the security realm we are currently matching. +     *    @param string $authentication   Usually basic. +     *    @param string $message          Message to display. +     *    @return boolean                 True if pass. +     *    @access public +     */ +    function assertAuthentication($authentication = false, $message = '%s') { +        if (! $authentication) { +            $message = sprintf($message, "Expected any authentication type, got [" . +                    $this->_browser->getAuthentication() . "]"); +            return $this->assertTrue( +                    $this->_browser->getAuthentication(), +                    $message); +        } else { +            $message = sprintf($message, "Expected authentication [$authentication] got [" . +                    $this->_browser->getAuthentication() . "]"); +            return $this->assertTrue( +                    strtolower($this->_browser->getAuthentication()) == strtolower($authentication), +                    $message); +        } +    } +     +    /** +     *    Checks that no authentication is necessary to view +     *    the desired page. +     *    @param string $message     Message to display. +     *    @return boolean            True if pass. +     *    @access public +     */ +    function assertNoAuthentication($message = '%s') { +        $message = sprintf($message, "Expected no authentication type, got [" . +                $this->_browser->getAuthentication() . "]"); +        return $this->assertFalse($this->_browser->getAuthentication(), $message); +    } +     +    /** +     *    Attempts to match the current security realm. +     *    @param string $realm     Name of security realm. +     *    @param string $message   Message to display. +     *    @return boolean          True if pass. +     *    @access public +     */ +    function assertRealm($realm, $message = '%s') { +        if (! SimpleExpectation::isExpectation($realm)) { +            $realm = new EqualExpectation($realm); +        } +        return $this->assert( +                $realm, +                $this->_browser->getRealm(), +                "Expected realm -> $message"); +    } +     +    /** +     *    Checks each header line for the required value. If no +     *    value is given then only an existence check is made. +     *    @param string $header    Case insensitive header name. +     *    @param mixed $value      Case sensitive trimmed string to +     *                             match against. An expectation object +     *                             can be used for pattern matching. +     *    @return boolean          True if pass. +     *    @access public +     */ +    function assertHeader($header, $value = false, $message = '%s') { +        return $this->assert( +                new HttpHeaderExpectation($header, $value), +                $this->_browser->getHeaders(), +                $message); +    } +         +    /** +     *    @deprecated +     */ +    function assertHeaderPattern($header, $pattern, $message = '%s') { +        return $this->assert( +                new HttpHeaderExpectation($header, new PatternExpectation($pattern)), +                $this->_browser->getHeaders(), +                $message); +    } + +    /** +     *    Confirms that the header type has not been received. +     *    Only the landing page is checked. If you want to check +     *    redirect pages, then you should limit redirects so +     *    as to capture the page you want. +     *    @param string $header    Case insensitive header name. +     *    @return boolean          True if pass. +     *    @access public +     */ +    function assertNoHeader($header, $message = '%s') { +        return $this->assert( +                new NoHttpHeaderExpectation($header), +                $this->_browser->getHeaders(), +                $message); +    } +         +    /** +     *    @deprecated +     */ +    function assertNoUnwantedHeader($header, $message = '%s') { +        return $this->assertNoHeader($header, $message); +    } +     +    /** +     *    Tests the text between the title tags. +     *    @param string/SimpleExpectation $title    Expected title. +     *    @param string $message                    Message to display. +     *    @return boolean                           True if pass. +     *    @access public +     */ +    function assertTitle($title = false, $message = '%s') { +        if (! SimpleExpectation::isExpectation($title)) { +            $title = new EqualExpectation($title); +        } +        return $this->assert($title, $this->_browser->getTitle(), $message); +    } +     +    /** +     *    Will trigger a pass if the text is found in the plain +     *    text form of the page. +     *    @param string $text       Text to look for. +     *    @param string $message    Message to display. +     *    @return boolean           True if pass. +     *    @access public +     */ +    function assertText($text, $message = '%s') { +        return $this->assert( +                new TextExpectation($text), +                $this->_browser->getContentAsText(), +                $message); +    } +     +    /** +     *    @deprecated +     */ +    function assertWantedText($text, $message = '%s') { +        return $this->assertText($text, $message); +    } +     +    /** +     *    Will trigger a pass if the text is not found in the plain +     *    text form of the page. +     *    @param string $text       Text to look for. +     *    @param string $message    Message to display. +     *    @return boolean           True if pass. +     *    @access public +     */ +    function assertNoText($text, $message = '%s') { +        return $this->assert( +                new NoTextExpectation($text), +                $this->_browser->getContentAsText(), +                $message); +    } +     +    /** +     *    @deprecated +     */ +    function assertNoUnwantedText($text, $message = '%s') { +        return $this->assertNoText($text, $message); +    } +     +    /** +     *    Will trigger a pass if the Perl regex pattern +     *    is found in the raw content. +     *    @param string $pattern    Perl regex to look for including +     *                              the regex delimiters. +     *    @param string $message    Message to display. +     *    @return boolean           True if pass. +     *    @access public +     */ +    function assertPattern($pattern, $message = '%s') { +        return $this->assert( +                new PatternExpectation($pattern), +                $this->_browser->getContent(), +                $message); +    } +     +    /** +     *    @deprecated +     */ +    function assertWantedPattern($pattern, $message = '%s') { +        return $this->assertPattern($pattern, $message); +    } +     +    /** +     *    Will trigger a pass if the perl regex pattern +     *    is not present in raw content. +     *    @param string $pattern    Perl regex to look for including +     *                              the regex delimiters. +     *    @param string $message    Message to display. +     *    @return boolean           True if pass. +     *    @access public +     */ +    function assertNoPattern($pattern, $message = '%s') { +        return $this->assert( +                new NoPatternExpectation($pattern), +                $this->_browser->getContent(), +                $message); +    } +     +    /** +     *    @deprecated +     */ +    function assertNoUnwantedPattern($pattern, $message = '%s') { +        return $this->assertNoPattern($pattern, $message); +    } +     +    /** +     *    Checks that a cookie is set for the current page +     *    and optionally checks the value. +     *    @param string $name        Name of cookie to test. +     *    @param string $expected    Expected value as a string or +     *                               false if any value will do. +     *    @param string $message     Message to display. +     *    @return boolean            True if pass. +     *    @access public +     */ +    function assertCookie($name, $expected = false, $message = '%s') { +        $value = $this->getCookie($name); +        if (! $expected) { +            return $this->assertTrue( +                    $value, +                    sprintf($message, "Expecting cookie [$name]")); +        } +        if (! SimpleExpectation::isExpectation($expected)) { +            $expected = new EqualExpectation($expected); +        } +        return $this->assert($expected, $value, "Expecting cookie [$name] -> $message"); +    } +     +    /** +     *    Checks that no cookie is present or that it has +     *    been successfully cleared. +     *    @param string $name        Name of cookie to test. +     *    @param string $message     Message to display. +     *    @return boolean            True if pass. +     *    @access public +     */ +    function assertNoCookie($name, $message = '%s') { +        return $this->assertTrue( +                $this->getCookie($name) === false, +                sprintf($message, "Not expecting cookie [$name]")); +    } + +    /** +     *    Called from within the test methods to register +     *    passes and failures. +     *    @param boolean $result    Pass on true. +     *    @param string $message    Message to display describing +     *                              the test state. +     *    @return boolean           True on pass +     *    @access public +     */ +    function assertTrue($result, $message = false) { +        return $this->assert(new TrueExpectation(), $result, $message); +    } + +    /** +     *    Will be true on false and vice versa. False +     *    is the PHP definition of false, so that null, +     *    empty strings, zero and an empty array all count +     *    as false. +     *    @param boolean $result    Pass on false. +     *    @param string $message    Message to display. +     *    @return boolean           True on pass +     *    @access public +     */ +    function assertFalse($result, $message = '%s') { +        return $this->assert(new FalseExpectation(), $result, $message); +    } +     +    /** +     *    Will trigger a pass if the two parameters have +     *    the same value only. Otherwise a fail. This +     *    is for testing hand extracted text, etc. +     *    @param mixed $first          Value to compare. +     *    @param mixed $second         Value to compare. +     *    @param string $message       Message to display. +     *    @return boolean              True on pass +     *    @access public +     */ +    function assertEqual($first, $second, $message = '%s') { +        return $this->assert( +                new EqualExpectation($first), +                $second, +                $message); +    } +     +    /** +     *    Will trigger a pass if the two parameters have +     *    a different value. Otherwise a fail. This +     *    is for testing hand extracted text, etc. +     *    @param mixed $first           Value to compare. +     *    @param mixed $second          Value to compare. +     *    @param string $message        Message to display. +     *    @return boolean               True on pass +     *    @access public +     */ +    function assertNotEqual($first, $second, $message = '%s') { +        return $this->assert( +                new NotEqualExpectation($first), +                $second, +                $message); +    } + +    /** +     *    Uses a stack trace to find the line of an assertion. +     *    @return string           Line number of first assert* +     *                             method embedded in format string. +     *    @access public +     */ +    function getAssertionLine() { +        $trace = new SimpleStackTrace(array('assert', 'click', 'pass', 'fail')); +        return $trace->traceMethod(); +    } +} +?>
\ No newline at end of file  | 
