You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by ch...@apache.org on 2008/06/06 16:56:03 UTC
svn commit: r663970 [5/25] - in /incubator/shindig/trunk/php: ./ test/
test/PHPUnit/ test/PHPUnit/Extensions/ test/PHPUnit/Extensions/Database/
test/PHPUnit/Extensions/Database/Constraint/
test/PHPUnit/Extensions/Database/DB/ test/PHPUnit/Extensions/Da...
Added: incubator/shindig/trunk/php/test/PHPUnit/Extensions/SeleniumTestCase.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/test/PHPUnit/Extensions/SeleniumTestCase.php?rev=663970&view=auto
==============================================================================
--- incubator/shindig/trunk/php/test/PHPUnit/Extensions/SeleniumTestCase.php (added)
+++ incubator/shindig/trunk/php/test/PHPUnit/Extensions/SeleniumTestCase.php Fri Jun 6 07:55:55 2008
@@ -0,0 +1,1739 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb...@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id: SeleniumTestCase.php 2111 2008-01-15 09:55:15Z sb $
+ * @link http://www.phpunit.de/
+ * @since File available since Release 3.0.0
+ */
+
+require_once '../PHPUnit/Framework.php';
+require_once '../PHPUnit/Util/Log/Database.php';
+require_once '../PHPUnit/Util/Filter.php';
+require_once '../PHPUnit/Util/Test.php';
+require_once '../PHPUnit/Util/XML.php';
+
+PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
+
+/**
+ * TestCase class that uses Selenium to provide
+ * the functionality required for web testing.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: 3.2.9
+ * @link http://www.phpunit.de/
+ * @since Class available since Release 3.0.0
+ */
+abstract class PHPUnit_Extensions_SeleniumTestCase extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @var array
+ * @access public
+ * @static
+ */
+ public static $browsers = array();
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $browser;
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $browserName;
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $browserUrl;
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $host = 'localhost';
+
+ /**
+ * @var integer
+ * @access protected
+ */
+ protected $port = 4444;
+
+ /**
+ * @var integer
+ * @access protected
+ */
+ protected $timeout = 30000;
+
+ /**
+ * @var array
+ * @access protected
+ */
+ protected static $sessionId = array();
+
+ /**
+ * @var integer
+ * @access protected
+ */
+ protected $sleep = 0;
+
+ /**
+ * @var boolean
+ * @access protected
+ */
+ protected $autoStop = TRUE;
+
+ /**
+ * @var boolean
+ * @access protected
+ */
+ protected $collectCodeCoverageInformation = FALSE;
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $coverageScriptUrl = '';
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $testId;
+
+ /**
+ * @var boolean
+ * @access protected
+ */
+ protected $inDefaultAssertions = FALSE;
+
+ /**
+ * @param string $name
+ * @param array $browser
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function __construct($name = NULL, array $data = array(), array $browser = array())
+ {
+ parent::__construct($name, $data);
+
+ if (isset($browser['name'])) {
+ if (!is_string($browser['name'])) {
+ throw new InvalidArgumentException;
+ }
+ } else {
+ $browser['name'] = '';
+ }
+
+ if (isset($browser['browser'])) {
+ if (!is_string($browser['browser'])) {
+ throw new InvalidArgumentException;
+ }
+ } else {
+ $browser['browser'] = '';
+ }
+
+ if (isset($browser['host'])) {
+ if (!is_string($browser['host'])) {
+ throw new InvalidArgumentException;
+ }
+ } else {
+ $browser['host'] = 'localhost';
+ }
+
+ if (isset($browser['port'])) {
+ if (!is_int($browser['port'])) {
+ throw new InvalidArgumentException;
+ }
+ } else {
+ $browser['port'] = 4444;
+ }
+
+ if (isset($browser['timeout'])) {
+ if (!is_int($browser['timeout'])) {
+ throw new InvalidArgumentException;
+ }
+ } else {
+ $browser['timeout'] = 30000;
+ }
+
+ $this->browserName = $browser['name'];
+ $this->browser = $browser['browser'];
+ $this->host = $browser['host'];
+ $this->port = $browser['port'];
+ $this->timeout = $browser['timeout'];
+ }
+
+ /**
+ * @param string $className
+ * @return PHPUnit_Framework_TestSuite
+ * @access public
+ */
+ public static function suite($className)
+ {
+ $suite = new PHPUnit_Framework_TestSuite;
+ $suite->setName($className);
+
+ $class = new ReflectionClass($className);
+ $classGroups = PHPUnit_Util_Test::getGroups($class);
+ $staticProperties = $class->getStaticProperties();
+
+ // Create tests from Selenese/HTML files.
+ if (isset($staticProperties['seleneseDirectory']) &&
+ is_dir($staticProperties['seleneseDirectory'])) {
+ $files = new PHPUnit_Util_FilterIterator(
+ new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator(
+ $staticProperties['seleneseDirectory']
+ )
+ ),
+ '.htm'
+ );
+
+ // Create tests from Selenese/HTML files for multiple browsers.
+ if (!empty($staticProperties['browsers'])) {
+ foreach ($staticProperties['browsers'] as $browser) {
+ $browserSuite = new PHPUnit_Framework_TestSuite;
+ $browserSuite->setName($className . ': ' . $browser['name']);
+
+ foreach ($files as $file) {
+ $browserSuite->addTest(
+ new $className((string)$file, array(), $browser)
+ );
+ }
+
+ $suite->addTest($browserSuite, $classGroups);
+ }
+ }
+
+ // Create tests from Selenese/HTML files for single browser.
+ else {
+ foreach ($files as $file) {
+ $suite->addTest(new $className((string)$file), $classGroups);
+ }
+ }
+ }
+
+ // Create tests from test methods for multiple browsers.
+ if (!empty($staticProperties['browsers'])) {
+ foreach ($staticProperties['browsers'] as $browser) {
+ $browserSuite = new PHPUnit_Framework_TestSuite;
+ $browserSuite->setName($className . ': ' . $browser['name']);
+
+ foreach ($class->getMethods() as $method) {
+ if (PHPUnit_Framework_TestSuite::isPublicTestMethod($method)) {
+ $name = $method->getName();
+ $data = PHPUnit_Util_Test::getProvidedData($className, $name);
+ $groups = PHPUnit_Util_Test::getGroups($method, $classGroups);
+
+ // Test method with @dataProvider.
+ if (is_array($data) || $data instanceof Iterator) {
+ $dataSuite = new PHPUnit_Framework_TestSuite(
+ $className . '::' . $name
+ );
+
+ foreach ($data as $_data) {
+ $dataSuite->addTest(
+ new $className($name, $_data, $browser),
+ $groups
+ );
+ }
+
+ $browserSuite->addTest($dataSuite);
+ }
+
+ // Test method without @dataProvider.
+ else {
+ $browserSuite->addTest(
+ new $className($name, array(), $browser), $groups
+ );
+ }
+ }
+ }
+
+ $suite->addTest($browserSuite);
+ }
+ }
+
+ // Create tests from test methods for single browser.
+ else {
+ foreach ($class->getMethods() as $method) {
+ if (PHPUnit_Framework_TestSuite::isPublicTestMethod($method)) {
+ $name = $method->getName();
+ $data = PHPUnit_Util_Test::getProvidedData($className, $name);
+ $groups = PHPUnit_Util_Test::getGroups($method, $classGroups);
+
+ // Test method with @dataProvider.
+ if (is_array($data) || $data instanceof Iterator) {
+ $dataSuite = new PHPUnit_Framework_TestSuite(
+ $className . '::' . $name
+ );
+
+ foreach ($data as $_data) {
+ $dataSuite->addTest(
+ new $className($name, $_data),
+ $groups
+ );
+ }
+
+ $suite->addTest($dataSuite);
+ }
+
+ // Test method without @dataProvider.
+ else {
+ $suite->addTest(
+ new $className($name), $groups
+ );
+ }
+ }
+ }
+ }
+
+ return $suite;
+ }
+
+ /**
+ * Runs the test case and collects the results in a TestResult object.
+ * If no TestResult object is passed a new one will be created.
+ *
+ * @param PHPUnit_Framework_TestResult $result
+ * @return PHPUnit_Framework_TestResult
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function run(PHPUnit_Framework_TestResult $result = NULL)
+ {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ $this->collectCodeCoverageInformation = $result->getCollectCodeCoverageInformation();
+
+ $result->run($this);
+
+ if ($this->collectCodeCoverageInformation) {
+ $result->appendCodeCoverageInformation(
+ $this, $this->getCodeCoverage()
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * @access protected
+ */
+ protected function runTest()
+ {
+ $this->start();
+
+ if (!is_file($this->name)) {
+ parent::runTest();
+ } else {
+ $this->runSelenese($this->name);
+ }
+
+ if ($this->autoStop) {
+ try {
+ $this->stop();
+ }
+
+ catch (RuntimeException $e) {
+ }
+ }
+ }
+
+ /**
+ * If you want to override tearDown() make sure to either call stop() or
+ * parent::tearDown(). Otherwise the Selenium RC session will not be
+ * closed upon test failure.
+ *
+ * @access protected
+ */
+ protected function tearDown()
+ {
+ if ($this->autoStop) {
+ try {
+ $this->stop();
+ }
+
+ catch (RuntimeException $e) {
+ }
+ }
+ }
+
+ /**
+ * Returns a string representation of the test case.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString()
+ {
+ $buffer = parent::toString();
+
+ if (!empty($this->browserName)) {
+ $buffer .= ' with browser ' . $this->browserName;
+ }
+
+ return $buffer;
+ }
+
+ /**
+ * @return string
+ * @access public
+ */
+ public function start()
+ {
+ if (!isset(self::$sessionId[$this->host][$this->port][$this->browser])) {
+ self::$sessionId[$this->host][$this->port][$this->browser] = $this->getString(
+ 'getNewBrowserSession',
+ array($this->browser, $this->browserUrl)
+ );
+
+ $this->doCommand('setTimeout', array($this->timeout));
+ }
+
+
+ $this->testId = md5(uniqid(rand(), TRUE));
+
+ return self::$sessionId[$this->host][$this->port][$this->browser];
+ }
+
+ /**
+ * @access public
+ */
+ public function stop()
+ {
+ if (!isset(self::$sessionId[$this->host][$this->port][$this->browser])) {
+ return;
+ }
+
+ $this->doCommand('testComplete');
+
+ unset(self::$sessionId[$this->host][$this->port][$this->browser]);
+ }
+
+ /**
+ * @param boolean $autoStop
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setAutoStop($autoStop)
+ {
+ if (!is_bool($autoStop)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->autoStop = $autoStop;
+ }
+
+ /**
+ * @param string $browser
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setBrowser($browser)
+ {
+ if (!is_string($browser)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->browser = $browser;
+ }
+
+ /**
+ * @param string $browserUrl
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setBrowserUrl($browserUrl)
+ {
+ if (!is_string($browserUrl)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->browserUrl = $browserUrl;
+ }
+
+ /**
+ * @param string $host
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setHost($host)
+ {
+ if (!is_string($host)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->host = $host;
+ }
+
+ /**
+ * @param integer $port
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setPort($port)
+ {
+ if (!is_int($port)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->port = $port;
+ }
+
+ /**
+ * @param integer $timeout
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setTimeout($timeout)
+ {
+ if (!is_int($timeout)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->timeout = $timeout;
+ }
+
+ /**
+ * @param integer $seconds
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function setSleep($seconds)
+ {
+ if (!is_int($seconds)) {
+ throw new InvalidArgumentException;
+ }
+
+ $this->sleep = $seconds;
+ }
+
+ /**
+ * Runs a test from a Selenese (HTML) specification.
+ *
+ * @param string $filename
+ * @access public
+ */
+ public function runSelenese($filename)
+ {
+ $document = PHPUnit_Util_XML::load($filename, TRUE);
+ $xpath = new DOMXPath($document);
+ $rows = $xpath->query('body/table/tbody/tr');
+
+ foreach ($rows as $row)
+ {
+ $action = NULL;
+ $arguments = array();
+ $columns = $xpath->query('td', $row);
+
+ foreach ($columns as $column)
+ {
+ if ($action === NULL) {
+ $action = $column->nodeValue;
+ } else {
+ $arguments[] = $column->nodeValue;
+ }
+ }
+
+ $this->__call($action, $arguments);
+ }
+ }
+
+ /**
+ * This method implements the Selenium RC protocol.
+ *
+ * @param string $command
+ * @param array $arguments
+ * @return mixed
+ * @access public
+ * @method unknown addLocationStrategy()
+ * @method unknown addSelection()
+ * @method unknown allowNativeXpath()
+ * @method unknown altKeyDown()
+ * @method unknown altKeyUp()
+ * @method unknown answerOnNextPrompt()
+ * @method unknown assignId()
+ * @method unknown captureScreenshot()
+ * @method unknown check()
+ * @method unknown chooseCancelOnNextConfirmation()
+ * @method unknown click()
+ * @method unknown clickAndWait()
+ * @method unknown clickAt()
+ * @method unknown close()
+ * @method unknown controlKeyDown()
+ * @method unknown controlKeyUp()
+ * @method unknown createCookie()
+ * @method unknown deleteCookie()
+ * @method unknown doubleClick()
+ * @method unknown doubleClickAt()
+ * @method unknown dragAndDrop()
+ * @method unknown dragAndDropToObject()
+ * @method unknown dragDrop()
+ * @method unknown fireEvent()
+ * @method string getAlert()
+ * @method array getAllButtons()
+ * @method array getAllFields()
+ * @method array getAllLinks()
+ * @method array getAllWindowIds()
+ * @method array getAllWindowNames()
+ * @method array getAllWindowTitles()
+ * @method string getAttribute()
+ * @method array getAttributeFromAllWindows()
+ * @method string getBodyText()
+ * @method string getConfirmation()
+ * @method string getCookie()
+ * @method integer getCursorPosition()
+ * @method integer getElementHeight()
+ * @method integer getElementIndex()
+ * @method integer getElementPositionLeft()
+ * @method integer getElementPositionTop()
+ * @method integer getElementWidth()
+ * @method string getEval()
+ * @method string getExpression()
+ * @method string getHtmlSource()
+ * @method string getLocation()
+ * @method string getLogMessages()
+ * @method integer getMouseSpeed()
+ * @method string getPrompt()
+ * @method array getSelectOptions()
+ * @method string getSelectedId()
+ * @method array getSelectedIds()
+ * @method string getSelectedIndex()
+ * @method array getSelectedIndexes()
+ * @method string getSelectedLabel()
+ * @method array getSelectedLabels()
+ * @method string getSelectedValue()
+ * @method array getSelectedValues()
+ * @method unknown getSpeed()
+ * @method string getTable()
+ * @method string getText()
+ * @method string getTitle()
+ * @method string getValue()
+ * @method boolean getWhetherThisFrameMatchFrameExpression()
+ * @method boolean getWhetherThisWindowMatchWindowExpression()
+ * @method integer getXpathCount()
+ * @method unknown goBack()
+ * @method unknown highlight()
+ * @method boolean isAlertPresent()
+ * @method boolean isChecked()
+ * @method boolean isConfirmationPresent()
+ * @method boolean isEditable()
+ * @method boolean isElementPresent()
+ * @method boolean isOrdered()
+ * @method boolean isPromptPresent()
+ * @method boolean isSomethingSelected()
+ * @method boolean isTextPresent()
+ * @method boolean isVisible()
+ * @method unknown keyDown()
+ * @method unknown keyPress()
+ * @method unknown keyUp()
+ * @method unknown metaKeyDown()
+ * @method unknown metaKeyUp()
+ * @method unknown mouseDown()
+ * @method unknown mouseDownAt()
+ * @method unknown mouseMove()
+ * @method unknown mouseMoveAt()
+ * @method unknown mouseOut()
+ * @method unknown mouseOver()
+ * @method unknown mouseUp()
+ * @method unknown mouseUpAt()
+ * @method unknown open()
+ * @method unknown openWindow()
+ * @method unknown refresh()
+ * @method unknown removeAllSelections()
+ * @method unknown removeSelection()
+ * @method unknown select()
+ * @method unknown selectFrame()
+ * @method unknown selectWindow()
+ * @method unknown setContext()
+ * @method unknown setCursorPosition()
+ * @method unknown setMouseSpeed()
+ * @method unknown setSpeed()
+ * @method unknown shiftKeyDown()
+ * @method unknown shiftKeyUp()
+ * @method unknown submit()
+ * @method unknown type()
+ * @method unknown typeKeys()
+ * @method unknown uncheck()
+ * @method unknown waitForCondition()
+ * @method unknown waitForPageToLoad()
+ * @method unknown waitForPopUp()
+ * @method unknown windowFocus()
+ * @method unknown windowMaximize()
+ */
+ public function __call($command, $arguments)
+ {
+ switch ($command) {
+ case 'addLocationStrategy':
+ case 'addSelection':
+ case 'allowNativeXpath':
+ case 'altKeyDown':
+ case 'altKeyUp':
+ case 'answerOnNextPrompt':
+ case 'assignId':
+ case 'captureScreenshot':
+ case 'check':
+ case 'chooseCancelOnNextConfirmation':
+ case 'click':
+ case 'clickAt':
+ case 'close':
+ case 'controlKeyDown':
+ case 'controlKeyUp':
+ case 'createCookie':
+ case 'deleteCookie':
+ case 'doubleClick':
+ case 'doubleClickAt':
+ case 'dragAndDrop':
+ case 'dragAndDropToObject':
+ case 'dragDrop':
+ case 'fireEvent':
+ case 'goBack':
+ case 'highlight':
+ case 'keyDown':
+ case 'keyPress':
+ case 'keyUp':
+ case 'metaKeyDown':
+ case 'metaKeyUp':
+ case 'mouseDown':
+ case 'mouseDownAt':
+ case 'mouseMove':
+ case 'mouseMoveAt':
+ case 'mouseOut':
+ case 'mouseOver':
+ case 'mouseUp':
+ case 'mouseUpAt':
+ case 'open':
+ case 'openWindow':
+ case 'refresh':
+ case 'removeAllSelections':
+ case 'removeSelection':
+ case 'select':
+ case 'selectFrame':
+ case 'selectWindow':
+ case 'setContext':
+ case 'setCursorPosition':
+ case 'setMouseSpeed':
+ case 'setSpeed':
+ case 'shiftKeyDown':
+ case 'shiftKeyUp':
+ case 'submit':
+ case 'type':
+ case 'typeKeys':
+ case 'uncheck':
+ case 'windowFocus':
+ case 'windowMaximize': {
+ // Pre-Command Actions
+ switch ($command) {
+ case 'open':
+ case 'openWindow': {
+ if ($this->collectCodeCoverageInformation) {
+ $this->deleteCookie('PHPUNIT_SELENIUM_TEST_ID', '/');
+
+ $this->createCookie(
+ 'PHPUNIT_SELENIUM_TEST_ID=' . $this->testId,
+ 'path=/'
+ );
+ }
+ }
+ break;
+ }
+
+ $this->doCommand($command, $arguments);
+
+ // Post-Command Actions
+ switch ($command) {
+ case 'addLocationStrategy':
+ case 'allowNativeXpath':
+ case 'assignId':
+ case 'captureScreenshot': {
+ // intentionally empty
+ }
+ break;
+
+ default: {
+ if ($this->sleep > 0) {
+ sleep($this->sleep);
+ }
+
+ $this->runDefaultAssertions($command);
+ }
+ }
+ }
+ break;
+
+ case 'getWhetherThisFrameMatchFrameExpression':
+ case 'getWhetherThisWindowMatchWindowExpression':
+ case 'isAlertPresent':
+ case 'isChecked':
+ case 'isConfirmationPresent':
+ case 'isEditable':
+ case 'isElementPresent':
+ case 'isOrdered':
+ case 'isPromptPresent':
+ case 'isSomethingSelected':
+ case 'isTextPresent':
+ case 'isVisible': {
+ return $this->getBoolean($command, $arguments);
+ }
+ break;
+
+ case 'getCursorPosition':
+ case 'getElementHeight':
+ case 'getElementIndex':
+ case 'getElementPositionLeft':
+ case 'getElementPositionTop':
+ case 'getElementWidth':
+ case 'getMouseSpeed':
+ case 'getSpeed':
+ case 'getXpathCount': {
+ return $this->getNumber($command, $arguments);
+ }
+ break;
+
+ case 'getAlert':
+ case 'getAttribute':
+ case 'getBodyText':
+ case 'getConfirmation':
+ case 'getCookie':
+ case 'getEval':
+ case 'getExpression':
+ case 'getHtmlSource':
+ case 'getLocation':
+ case 'getLogMessages':
+ case 'getPrompt':
+ case 'getSelectedId':
+ case 'getSelectedIndex':
+ case 'getSelectedLabel':
+ case 'getSelectedValue':
+ case 'getTable':
+ case 'getText':
+ case 'getTitle':
+ case 'getValue': {
+ return $this->getString($command, $arguments);
+ }
+ break;
+
+ case 'getAllButtons':
+ case 'getAllFields':
+ case 'getAllLinks':
+ case 'getAllWindowIds':
+ case 'getAllWindowNames':
+ case 'getAllWindowTitles':
+ case 'getAttributeFromAllWindows':
+ case 'getSelectedIds':
+ case 'getSelectedIndexes':
+ case 'getSelectedLabels':
+ case 'getSelectedValues':
+ case 'getSelectOptions': {
+ return $this->getStringArray($command, $arguments);
+ }
+ break;
+
+ case 'clickAndWait': {
+ $this->doCommand('click', $arguments);
+ $this->doCommand('waitForPageToLoad', array($this->timeout));
+
+ if ($this->sleep > 0) {
+ sleep($this->sleep);
+ }
+
+ $this->runDefaultAssertions($command);
+ }
+ break;
+
+ case 'waitForCondition':
+ case 'waitForPopUp': {
+ if (count($arguments) == 1) {
+ $arguments[] = $this->timeout;
+ }
+
+ $this->doCommand($command, $arguments);
+ $this->runDefaultAssertions($command);
+ }
+ break;
+
+ case 'waitForPageToLoad': {
+ if (empty($arguments)) {
+ $arguments[] = $this->timeout;
+ }
+
+ $this->doCommand($command, $arguments);
+ $this->runDefaultAssertions($command);
+ }
+ break;
+
+ default: {
+ $this->stop();
+
+ throw new BadMethodCallException(
+ "Method $command not defined."
+ );
+ }
+ }
+ }
+
+ /**
+ * Asserts that an alert is present.
+ *
+ * @param string $message
+ * @access public
+ */
+ public function assertAlertPresent($message = 'No alert present.')
+ {
+ $this->assertTrue($this->isAlertPresent(), $message);
+ }
+
+ /**
+ * Asserts that no alert is present.
+ *
+ * @param string $message
+ * @access public
+ */
+ public function assertNoAlertPresent($message = 'Alert present.')
+ {
+ $this->assertFalse($this->isAlertPresent(), $message);
+ }
+
+ /**
+ * Asserts that an option is checked.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertChecked($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" not checked.',
+ $locator
+ );
+ }
+
+ $this->assertTrue($this->isChecked($locator), $message);
+ }
+
+ /**
+ * Asserts that an option is not checked.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertNotChecked($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" checked.',
+ $locator
+ );
+ }
+
+ $this->assertFalse($this->isChecked($locator), $message);
+ }
+
+ /**
+ * Assert that a confirmation is present.
+ *
+ * @param string $message
+ * @access public
+ */
+ public function assertConfirmationPresent($message = 'No confirmation present.')
+ {
+ $this->assertTrue($this->isConfirmationPresent(), $message);
+ }
+
+ /**
+ * Assert that no confirmation is present.
+ *
+ * @param string $message
+ * @access public
+ */
+ public function assertNoConfirmationPresent($message = 'Confirmation present.')
+ {
+ $this->assertFalse($this->isConfirmationPresent(), $message);
+ }
+
+ /**
+ * Asserts that an input field is editable.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertEditable($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" not editable.',
+ $locator
+ );
+ }
+
+ $this->assertTrue($this->isEditable($locator), $message);
+ }
+
+ /**
+ * Asserts that an input field is not editable.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertNotEditable($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" editable.',
+ $locator
+ );
+ }
+
+ $this->assertFalse($this->isEditable($locator), $message);
+ }
+
+ /**
+ * Asserts that an element's value is equal to a given string.
+ *
+ * @param string $locator
+ * @param string $text
+ * @param string $message
+ * @access public
+ */
+ public function assertElementValueEquals($locator, $text, $message = '')
+ {
+ $this->assertEquals($text, $this->getValue($locator), $message);
+ }
+
+ /**
+ * Asserts that an element's value is not equal to a given string.
+ *
+ * @param string $locator
+ * @param string $text
+ * @param string $message
+ * @access public
+ */
+ public function assertElementValueNotEquals($locator, $text, $message = '')
+ {
+ $this->assertNotEquals($text, $this->getValue($locator), $message);
+ }
+
+ /**
+ * Asserts that an element contains a given string.
+ *
+ * @param string $locator
+ * @param string $text
+ * @param string $message
+ * @access public
+ */
+ public function assertElementContainsText($locator, $text, $message = '')
+ {
+ $this->assertContains($text, $this->getValue($locator), $message);
+ }
+
+ /**
+ * Asserts that an element does not contain a given string.
+ *
+ * @param string $locator
+ * @param string $text
+ * @param string $message
+ * @access public
+ */
+ public function assertElementNotContainsText($locator, $text, $message = '')
+ {
+ $this->assertNotContains($text, $this->getValue($locator), $message);
+ }
+
+ /**
+ * Asserts than an element is present.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertElementPresent($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Element "%s" not present.',
+ $locator
+ );
+ }
+
+ $this->assertTrue($this->isElementPresent($locator), $message);
+ }
+
+ /**
+ * Asserts than an element is not present.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertElementNotPresent($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Element "%s" present.',
+ $locator
+ );
+ }
+
+ $this->assertFalse($this->isElementPresent($locator), $message);
+ }
+
+ /**
+ * Asserts that the location is equal to a specified one.
+ *
+ * @param string $location
+ * @param string $message
+ * @access public
+ */
+ public function assertLocationEquals($location, $message = '')
+ {
+ $this->assertEquals($location, $this->getLocation(), $message);
+ }
+
+ /**
+ * Asserts that the location is not equal to a specified one.
+ *
+ * @param string $location
+ * @param string $message
+ * @access public
+ */
+ public function assertLocationNotEquals($location, $message = '')
+ {
+ $this->assertNotEquals($location, $this->getLocation(), $message);
+ }
+
+ /**
+ * Asserts than a prompt is present.
+ *
+ * @param string $message
+ * @access public
+ */
+ public function assertPromptPresent($message = 'No prompt present.')
+ {
+ $this->assertTrue($this->isPromptPresent(), $message);
+ }
+
+ /**
+ * Asserts than no prompt is present.
+ *
+ * @param string $message
+ * @access public
+ */
+ public function assertNoPromptPresent($message = 'Prompt present.')
+ {
+ $this->assertFalse($this->isPromptPresent(), $message);
+ }
+
+ /**
+ * Asserts that a select element has a specific option.
+ *
+ * @param string $selectLocator
+ * @param string $option
+ * @param string $message
+ * @access public
+ * @since Method available since Release 3.2.0
+ */
+ public function assertSelectHasOption($selectLocator, $option, $message = '')
+ {
+ $this->assertContains($option, $this->getSelectOptions($selectLocator), $message);
+ }
+
+ /**
+ * Asserts that a select element does not have a specific option.
+ *
+ * @param string $selectLocator
+ * @param string $option
+ * @param string $message
+ * @access public
+ * @since Method available since Release 3.2.0
+ */
+ public function assertSelectNotHasOption($selectLocator, $option, $message = '')
+ {
+ $this->assertNotContains($option, $this->getSelectOptions($selectLocator), $message);
+ }
+
+ /**
+ * Asserts that a specific label is selected.
+ *
+ * @param string $selectLocator
+ * @param string $value
+ * @param string $message
+ * @access public
+ * @since Method available since Release 3.2.0
+ */
+ public function assertSelected($selectLocator, $option, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Label "%s" not selected in "%s".',
+ $option,
+ $selectLocator
+ );
+ }
+
+ $this->assertEquals(
+ $option,
+ $this->getSelectedLabel($selectLocator),
+ $message
+ );
+ }
+
+ /**
+ * Asserts that a specific label is not selected.
+ *
+ * @param string $selectLocator
+ * @param string $value
+ * @param string $message
+ * @access public
+ * @since Method available since Release 3.2.0
+ */
+ public function assertNotSelected($selectLocator, $option, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Label "%s" selected in "%s".',
+ $option,
+ $selectLocator
+ );
+ }
+
+ $this->assertNotEquals(
+ $option,
+ $this->getSelectedLabel($selectLocator),
+ $message
+ );
+ }
+
+ /**
+ * Asserts that a specific value is selected.
+ *
+ * @param string $selectLocator
+ * @param string $value
+ * @param string $message
+ * @access public
+ */
+ public function assertIsSelected($selectLocator, $value, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Value "%s" not selected in "%s".',
+ $value,
+ $selectLocator
+ );
+ }
+
+ $this->assertEquals(
+ $value, $this->getSelectedValue($selectLocator),
+ $message
+ );
+ }
+
+ /**
+ * Asserts that a specific value is not selected.
+ *
+ * @param string $selectLocator
+ * @param string $value
+ * @param string $message
+ * @access public
+ */
+ public function assertIsNotSelected($selectLocator, $value, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Value "%s" selected in "%s".',
+ $value,
+ $selectLocator
+ );
+ }
+
+ $this->assertNotEquals(
+ $value,
+ $this->getSelectedValue($selectLocator),
+ $message
+ );
+ }
+
+ /**
+ * Asserts that something is selected.
+ *
+ * @param string $selectLocator
+ * @param string $message
+ * @access public
+ */
+ public function assertSomethingSelected($selectLocator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Nothing selected from "%s".',
+ $selectLocator
+ );
+ }
+
+ $this->assertTrue($this->isSomethingSelected($selectLocator), $message);
+ }
+
+ /**
+ * Asserts that nothing is selected.
+ *
+ * @param string $selectLocator
+ * @param string $message
+ * @access public
+ */
+ public function assertNothingSelected($selectLocator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ 'Something selected from "%s".',
+ $selectLocator
+ );
+ }
+
+ $this->assertFalse($this->isSomethingSelected($selectLocator), $message);
+ }
+
+ /**
+ * Asserts that a given text is present.
+ *
+ * @param string $pattern
+ * @param string $message
+ * @access public
+ */
+ public function assertTextPresent($pattern, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" not present.',
+ $pattern
+ );
+ }
+
+ $this->assertTrue($this->isTextPresent($pattern), $message);
+ }
+
+ /**
+ * Asserts that a given text is not present.
+ *
+ * @param string $pattern
+ * @param string $message
+ * @access public
+ */
+ public function assertTextNotPresent($pattern, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" present.',
+ $pattern
+ );
+ }
+
+ $this->assertFalse($this->isTextPresent($pattern), $message);
+ }
+
+ /**
+ * Asserts that the title is equal to a given string.
+ *
+ * @param string $title
+ * @param string $message
+ * @access public
+ */
+ public function assertTitleEquals($title, $message = '')
+ {
+ $this->assertEquals($title, $this->getTitle(), $message);
+ }
+
+ /**
+ * Asserts that the title is not equal to a given string.
+ *
+ * @param string $title
+ * @param string $message
+ * @access public
+ */
+ public function assertTitleNotEquals($title, $message = '')
+ {
+ $this->assertNotEquals($title, $this->getTitle(), $message);
+ }
+
+ /**
+ * Asserts that something is visible.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertVisible($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" not visible.',
+ $locator
+ );
+ }
+
+ $this->assertTrue($this->isVisible($locator), $message);
+ }
+
+ /**
+ * Asserts that something is not visible.
+ *
+ * @param string $locator
+ * @param string $message
+ * @access public
+ */
+ public function assertNotVisible($locator, $message = '')
+ {
+ if ($message == '') {
+ $message = sprintf(
+ '"%s" visible.',
+ $locator
+ );
+ }
+
+ $this->assertFalse($this->isVisible($locator), $message);
+ }
+
+ /**
+ * Template Method that is called after Selenium actions.
+ *
+ * @param string $action
+ * @access protected
+ * @since Method available since Release 3.1.0
+ */
+ protected function defaultAssertions($action)
+ {
+ }
+
+ /**
+ * Send a command to the Selenium RC server.
+ *
+ * @param string $command
+ * @param array $arguments
+ * @return string
+ * @access protected
+ * @author Shin Ohno <ga...@gmail.com>
+ * @author Bjoern Schotte <sc...@mayflower.de>
+ * @since Method available since Release 3.1.0
+ */
+ protected function doCommand($command, array $arguments = array())
+ {
+ $url = sprintf(
+ 'http://%s:%s/selenium-server/driver/?cmd=%s',
+ $this->host,
+ $this->port,
+ urlencode($command)
+ );
+
+ for ($i = 0; $i < count($arguments); $i++) {
+ $argNum = strval($i + 1);
+ $url .= sprintf('&%s=%s', $argNum, urlencode(trim($arguments[$i])));
+ }
+
+ if (isset(self::$sessionId[$this->host][$this->port][$this->browser])) {
+ $url .= sprintf('&%s=%s', 'sessionId', self::$sessionId[$this->host][$this->port][$this->browser]);
+ }
+
+ if (!$handle = @fopen($url, 'r')) {
+ throw new RuntimeException(
+ 'Could not connect to the Selenium RC server.'
+ );
+ }
+
+ stream_set_blocking($handle, 1);
+ stream_set_timeout($handle, 0, $this->timeout);
+
+ $info = stream_get_meta_data($handle);
+ $response = '';
+
+ while ((!feof($handle)) && (!$info['timed_out'])) {
+ $response .= fgets($handle, 4096);
+ $info = stream_get_meta_data($handle);
+ }
+
+ fclose($handle);
+
+ if (!preg_match('/^OK/', $response)) {
+ $this->stop();
+
+ throw new RuntimeException(
+ 'The response from the Selenium RC server is invalid: ' . $response
+ );
+ }
+
+ return $response;
+ }
+
+ /**
+ * Send a command to the Selenium RC server and treat the result
+ * as a boolean.
+ *
+ * @param string $command
+ * @param array $arguments
+ * @return boolean
+ * @access protected
+ * @author Shin Ohno <ga...@gmail.com>
+ * @author Bjoern Schotte <sc...@mayflower.de>
+ * @since Method available since Release 3.1.0
+ */
+ protected function getBoolean($command, array $arguments)
+ {
+ $result = $this->getString($command, $arguments);
+
+ switch ($result) {
+ case 'true': return TRUE;
+
+ case 'false': return FALSE;
+
+ default: {
+ $this->stop();
+
+ throw new RuntimeException(
+ 'Result is neither "true" nor "false": ' . PHPUnit_Util_Type::toString($result, TRUE)
+ );
+ }
+ }
+ }
+
+ /**
+ * Send a command to the Selenium RC server and treat the result
+ * as a number.
+ *
+ * @param string $command
+ * @param array $arguments
+ * @return numeric
+ * @access protected
+ * @author Shin Ohno <ga...@gmail.com>
+ * @author Bjoern Schotte <sc...@mayflower.de>
+ * @since Method available since Release 3.1.0
+ */
+ protected function getNumber($command, array $arguments)
+ {
+ $result = $this->getString($command, $arguments);
+
+ if (!is_numeric($result)) {
+ $this->stop();
+
+ throw new RuntimeException(
+ 'Result is not numeric: ' . PHPUnit_Util_Type::toString($result, TRUE)
+ );
+ }
+
+ return $result;
+ }
+
+ /**
+ * Send a command to the Selenium RC server and treat the result
+ * as a string.
+ *
+ * @param string $command
+ * @param array $arguments
+ * @return string
+ * @access protected
+ * @author Shin Ohno <ga...@gmail.com>
+ * @author Bjoern Schotte <sc...@mayflower.de>
+ * @since Method available since Release 3.1.0
+ */
+ protected function getString($command, array $arguments)
+ {
+ try {
+ $result = $this->doCommand($command, $arguments);
+ }
+
+ catch (RuntimeException $e) {
+ $this->stop();
+
+ throw $e;
+ }
+
+ return (strlen($result) > 3) ? substr($result, 3) : '';
+ }
+
+ /**
+ * Send a command to the Selenium RC server and treat the result
+ * as an array of strings.
+ *
+ * @param string $command
+ * @param array $arguments
+ * @return array
+ * @access protected
+ * @author Shin Ohno <ga...@gmail.com>
+ * @author Bjoern Schotte <sc...@mayflower.de>
+ * @since Method available since Release 3.1.0
+ */
+ protected function getStringArray($command, array $arguments)
+ {
+ $csv = $this->getString($command, $arguments);
+ $token = '';
+ $tokens = array();
+ $letters = preg_split('//', $csv, -1, PREG_SPLIT_NO_EMPTY);
+ $count = count($letters);
+
+ for ($i = 0; $i < $count; $i++) {
+ $letter = $letters[$i];
+
+ switch($letter) {
+ case '\\': {
+ $letter = $letters[++$i];
+ $token .= $letter;
+ }
+ break;
+
+ case ',': {
+ $tokens[] = $token;
+ $token = '';
+ }
+ break;
+
+ default: {
+ $token .= $letter;
+ }
+ }
+ }
+
+ $tokens[] = $token;
+
+ return $tokens;
+ }
+
+ /**
+ * @return array
+ * @access protected
+ * @since Method available since Release 3.2.0
+ */
+ protected function getCodeCoverage()
+ {
+ if (!empty($this->coverageScriptUrl)) {
+ $url = sprintf(
+ '%s?PHPUNIT_SELENIUM_TEST_ID=%s',
+ $this->coverageScriptUrl,
+ $this->testId
+ );
+
+ return $this->matchLocalAndRemotePaths(
+ eval('return ' . file_get_contents($url) . ';')
+ );
+ } else {
+ return array();
+ }
+ }
+
+ /**
+ * @param array $coverage
+ * @return array
+ * @access protected
+ * @author Mattis Stordalen Flister <ma...@xait.no>
+ * @since Method available since Release 3.2.9
+ */
+ protected function matchLocalAndRemotePaths(array &$coverage) {
+ $coverageWithLocalPaths = array();
+
+ foreach($coverage as $originalRemotePath => $value) {
+ $remotePath = $originalRemotePath;
+ $separator = $this->findDirectorySeparator($remotePath);
+
+ while (!($localpath = PHPUnit_Util_Filesystem::fileExistsInIncludePath($remotePath)) &&
+ strpos($remotePath, $separator) !== FALSE) {
+ $remotePath = substr($remotePath, strpos($remotePath, $separator) + 1);
+ }
+
+ if ($localpath && md5_file($localpath) == $value['md5']) {
+ $coverageWithLocalPaths[$localpath] = $value;
+ unset($coverageWithLocalPaths[$localpath]['md5']);
+ }
+ }
+
+ return $coverageWithLocalPaths;
+ }
+
+ /**
+ * @param string $path
+ * @return string
+ * @access protected
+ * @author Mattis Stordalen Flister <ma...@xait.no>
+ * @since Method available since Release 3.2.9
+ */
+ protected function findDirectorySeparator($path) {
+ if (strpos($path, '/') !== FALSE) {
+ return '/';
+ }
+
+ return '\\';
+ }
+
+ /**
+ * @param string $path
+ * @return array
+ * @access protected
+ * @author Mattis Stordalen Flister <ma...@xait.no>
+ * @since Method available since Release 3.2.9
+ */
+ protected function explodeDirectories($path) {
+ return explode($this->findDirectorySeparator($path), dirname($path));
+ }
+
+ /**
+ * @param string $action
+ * @access private
+ * @since Method available since Release 3.2.0
+ */
+ private function runDefaultAssertions($action)
+ {
+ if (!$this->inDefaultAssertions) {
+ $this->inDefaultAssertions = TRUE;
+ $this->defaultAssertions($action);
+ $this->inDefaultAssertions = FALSE;
+ }
+ }
+}
+?>
Added: incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestDecorator.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestDecorator.php?rev=663970&view=auto
==============================================================================
--- incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestDecorator.php (added)
+++ incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestDecorator.php Fri Jun 6 07:55:55 2008
@@ -0,0 +1,166 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb...@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id: TestDecorator.php 1985 2007-12-26 18:11:55Z sb $
+ * @link http://www.phpunit.de/
+ * @since File available since Release 2.0.0
+ */
+
+require_once '../PHPUnit/Framework.php';
+require_once '../PHPUnit/Util/Filter.php';
+
+PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
+
+/**
+ * A Decorator for Tests.
+ *
+ * Use TestDecorator as the base class for defining new
+ * test decorators. Test decorator subclasses can be introduced
+ * to add behaviour before or after a test is run.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: 3.2.9
+ * @link http://www.phpunit.de/
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit_Extensions_TestDecorator extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
+{
+ /**
+ * The Test to be decorated.
+ *
+ * @var object
+ * @access protected
+ */
+ protected $test = NULL;
+
+ /**
+ * Constructor.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @access public
+ */
+ public function __construct(PHPUnit_Framework_Test $test)
+ {
+ $this->test = $test;
+ }
+
+ /**
+ * Returns a string representation of the test.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString()
+ {
+ return $this->test->toString();
+ }
+
+ /**
+ * Runs the test and collects the
+ * result in a TestResult.
+ *
+ * @param PHPUnit_Framework_TestResult $result
+ * @access public
+ */
+ public function basicRun(PHPUnit_Framework_TestResult $result)
+ {
+ $this->test->run($result);
+ }
+
+ /**
+ * Counts the number of test cases that
+ * will be run by this test.
+ *
+ * @return integer
+ * @access public
+ */
+ public function count()
+ {
+ return count($this->test);
+ }
+
+ /**
+ * Creates a default TestResult object.
+ *
+ * @return PHPUnit_Framework_TestResult
+ * @access protected
+ */
+ protected function createResult()
+ {
+ return new PHPUnit_Framework_TestResult;
+ }
+
+ /**
+ * Returns the test to be run.
+ *
+ * @return PHPUnit_Framework_Test
+ * @access public
+ */
+ public function getTest()
+ {
+ return $this->test;
+ }
+
+ /**
+ * Runs the decorated test and collects the
+ * result in a TestResult.
+ *
+ * @param PHPUnit_Framework_TestResult $result
+ * @return PHPUnit_Framework_TestResult
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function run(PHPUnit_Framework_TestResult $result = NULL)
+ {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ $this->basicRun($result);
+
+ return $result;
+ }
+}
+?>
Added: incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestSetup.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestSetup.php?rev=663970&view=auto
==============================================================================
--- incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestSetup.php (added)
+++ incubator/shindig/trunk/php/test/PHPUnit/Extensions/TestSetup.php Fri Jun 6 07:55:55 2008
@@ -0,0 +1,152 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb...@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id: TestSetup.php 2154 2008-01-17 11:19:53Z sb $
+ * @link http://www.phpunit.de/
+ * @since File available since Release 2.0.0
+ */
+
+require_once '../PHPUnit/Framework.php';
+require_once '../PHPUnit/Extensions/TestDecorator.php';
+require_once '../PHPUnit/Util/Filter.php';
+
+PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
+
+trigger_error(
+ "Class PHPUnit_Extensions_TestSetup is deprecated. ".
+ "It will be removed in PHPUnit 3.3. ".
+ "Please use the new functionality in PHPUnit_Framework_TestSuite instead."
+);
+
+/**
+ * A Decorator to set up and tear down additional fixture state.
+ * Subclass TestSetup and insert it into your tests when you want
+ * to set up additional state once before the tests are run.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: 3.2.9
+ * @link http://www.phpunit.de/
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit_Extensions_TestSetup extends PHPUnit_Extensions_TestDecorator
+{
+ /**
+ * Runs the decorated test and collects the
+ * result in a TestResult.
+ *
+ * @param PHPUnit_Framework_TestResult $result
+ * @return PHPUnit_Framework_TestResult
+ * @throws InvalidArgumentException
+ * @access public
+ */
+ public function run(PHPUnit_Framework_TestResult $result = NULL)
+ {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ $this->setUp();
+ $this->copyFixtureToTest();
+ $this->basicRun($result);
+ $this->tearDown();
+
+ return $result;
+ }
+
+ /**
+ * Copies the fixture set up by setUp() to the test.
+ *
+ * @access private
+ * @since Method available since Release 2.3.0
+ */
+ private function copyFixtureToTest()
+ {
+ $object = new ReflectionClass($this);
+
+ foreach ($object->getProperties() as $attribute) {
+ $name = $attribute->getName();
+
+ if ($name != 'test') {
+ $this->doCopyFixtureToTest($this->test, $name, $this->$name);
+ }
+ }
+ }
+
+ /**
+ * @access private
+ * @since Method available since Release 2.3.0
+ */
+ private function doCopyFixtureToTest($object, $name, &$value)
+ {
+ if ($object instanceof PHPUnit_Framework_TestSuite) {
+ foreach ($object->tests() as $test) {
+ $this->doCopyFixtureToTest($test, $name, $value);
+ }
+ } else {
+ $object->$name =& $value;
+ }
+ }
+
+ /**
+ * Sets up the fixture. Override to set up additional fixture
+ * state.
+ *
+ * @access protected
+ */
+ protected function setUp()
+ {
+ }
+
+ /**
+ * Tears down the fixture. Override to tear down the additional
+ * fixture state.
+ *
+ * @access protected
+ */
+ protected function tearDown()
+ {
+ }
+}
+?>
Added: incubator/shindig/trunk/php/test/PHPUnit/Framework.php
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/test/PHPUnit/Framework.php?rev=663970&view=auto
==============================================================================
--- incubator/shindig/trunk/php/test/PHPUnit/Framework.php (added)
+++ incubator/shindig/trunk/php/test/PHPUnit/Framework.php Fri Jun 6 07:55:55 2008
@@ -0,0 +1,71 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2008, Sebastian Bergmann <sb...@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Testing
+ * @package PHPUnit
+ * @author Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @copyright 2002-2008 Sebastian Bergmann <sb...@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version SVN: $Id: Framework.php 1985 2007-12-26 18:11:55Z sb $
+ * @link http://www.phpunit.de/
+ * @since File available since Release 3.0.0
+ */
+
+require_once '../PHPUnit/Util/Filter.php';
+
+PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
+
+require '../PHPUnit/Framework/SelfDescribing.php';
+require '../PHPUnit/Framework/AssertionFailedError.php';
+require '../PHPUnit/Framework/Assert.php';
+require '../PHPUnit/Framework/Error.php';
+require '../PHPUnit/Framework/Notice.php';
+require '../PHPUnit/Framework/IncompleteTest.php';
+require '../PHPUnit/Framework/SkippedTest.php';
+require '../PHPUnit/Framework/Test.php';
+require '../PHPUnit/Framework/TestFailure.php';
+require '../PHPUnit/Framework/TestListener.php';
+require '../PHPUnit/Framework/TestResult.php';
+require '../PHPUnit/Framework/ExpectationFailedException.php';
+require '../PHPUnit/Framework/IncompleteTestError.php';
+require '../PHPUnit/Framework/SkippedTestError.php';
+require '../PHPUnit/Framework/SkippedTestSuiteError.php';
+require '../PHPUnit/Framework/TestCase.php';
+require '../PHPUnit/Framework/TestSuite.php';
+require '../PHPUnit/Framework/Warning.php';
+require '../PHPUnit/Framework/Constraint.php';
+require '../PHPUnit/Framework/ComparisonFailure.php';
+?>