summaryrefslogtreecommitdiff
path: root/buildscripts/PHPUnit2
diff options
context:
space:
mode:
authorxue <>2006-06-19 18:38:29 +0000
committerxue <>2006-06-19 18:38:29 +0000
commit588727c7e2b8954ec3dbde293cf4c4d68b119f9b (patch)
treefdcc16181a20335547953ccf1550e0006c11bf28 /buildscripts/PHPUnit2
parent127f78a4db3cc0fbbbb92f5b1abcfdce4a9af93b (diff)
Merge from 3.0 branch till 1185.
Diffstat (limited to 'buildscripts/PHPUnit2')
-rw-r--r--buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php122
-rw-r--r--buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php128
-rw-r--r--buildscripts/PHPUnit2/Extensions/RepeatedTest.php138
-rw-r--r--buildscripts/PHPUnit2/Extensions/TestDecorator.php174
-rw-r--r--buildscripts/PHPUnit2/Extensions/TestSetup.php154
-rw-r--r--buildscripts/PHPUnit2/Framework/Assert.php626
-rw-r--r--buildscripts/PHPUnit2/Framework/AssertionFailedError.php80
-rw-r--r--buildscripts/PHPUnit2/Framework/ComparisonFailure.php153
-rw-r--r--buildscripts/PHPUnit2/Framework/Error.php88
-rw-r--r--buildscripts/PHPUnit2/Framework/IncompleteTest.php72
-rw-r--r--buildscripts/PHPUnit2/Framework/IncompleteTestError.php75
-rw-r--r--buildscripts/PHPUnit2/Framework/Test.php87
-rw-r--r--buildscripts/PHPUnit2/Framework/TestCase.php292
-rw-r--r--buildscripts/PHPUnit2/Framework/TestFailure.php154
-rw-r--r--buildscripts/PHPUnit2/Framework/TestListener.php135
-rw-r--r--buildscripts/PHPUnit2/Framework/TestResult.php447
-rw-r--r--buildscripts/PHPUnit2/Framework/TestSuite.php554
-rw-r--r--buildscripts/PHPUnit2/Framework/Warning.php94
-rw-r--r--buildscripts/PHPUnit2/Runner/BaseTestRunner.php283
-rw-r--r--buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php184
-rw-r--r--buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php129
-rw-r--r--buildscripts/PHPUnit2/Runner/TestCollector.php77
-rw-r--r--buildscripts/PHPUnit2/Runner/TestSuiteLoader.php85
-rw-r--r--buildscripts/PHPUnit2/Runner/Version.php90
-rw-r--r--buildscripts/PHPUnit2/TextUI/ResultPrinter.php356
-rw-r--r--buildscripts/PHPUnit2/TextUI/TestRunner.php622
-rw-r--r--buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php225
-rw-r--r--buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php191
-rw-r--r--buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php125
-rw-r--r--buildscripts/PHPUnit2/Util/ErrorHandler.php77
-rw-r--r--buildscripts/PHPUnit2/Util/Fileloader.php109
-rw-r--r--buildscripts/PHPUnit2/Util/Filter.php263
-rw-r--r--buildscripts/PHPUnit2/Util/Log/PEAR.php220
-rw-r--r--buildscripts/PHPUnit2/Util/Log/XML.php356
-rw-r--r--buildscripts/PHPUnit2/Util/Printer.php116
-rw-r--r--buildscripts/PHPUnit2/Util/Skeleton.php340
-rw-r--r--buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php165
-rw-r--r--buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php299
-rw-r--r--buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php120
-rw-r--r--buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php102
-rw-r--r--buildscripts/PHPUnit2/pear-phpunit41
-rw-r--r--buildscripts/PHPUnit2/pear-phpunit.bat39
42 files changed, 8187 insertions, 0 deletions
diff --git a/buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php b/buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php
new file mode 100644
index 00000000..80afd1b5
--- /dev/null
+++ b/buildscripts/PHPUnit2/Extensions/ExceptionTestCase.php
@@ -0,0 +1,122 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: ExceptionTestCase.php,v 1.15.2.6 2006/02/20 07:42:59 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/TestCase.php';
+
+/**
+ * A TestCase that expects a specified Exception to be thrown.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Extensions_ExceptionTestCase extends PHPUnit2_Framework_TestCase {
+ /**
+ * The name of the expected Exception.
+ *
+ * @var mixed
+ * @access private
+ */
+ private $expectedException = NULL;
+
+ /**
+ * @return string
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function getExpectedException() {
+ return $this->expectedException;
+ }
+
+ /**
+ * @param mixed $exceptionName
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function setExpectedException($exceptionName) {
+ if ((is_string($exceptionName) && class_exists($exceptionName)) || $exceptionName === NULL) {
+ $this->expectedException = $exceptionName;
+ }
+ }
+
+ /**
+ * @access protected
+ */
+ protected function runTest() {
+ try {
+ parent::runTest();
+ }
+
+ catch (Exception $e) {
+ if ($this->expectedException !== NULL &&
+ $e instanceof $this->expectedException) {
+ return;
+ } else {
+ throw $e;
+ }
+ }
+
+ if ($this->expectedException !== NULL) {
+ $this->fail('Expected exception ' . $this->expectedException);
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php b/buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php
new file mode 100644
index 00000000..38b249a6
--- /dev/null
+++ b/buildscripts/PHPUnit2/Extensions/PerformanceTestCase.php
@@ -0,0 +1,128 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: PerformanceTestCase.php,v 1.15.2.5 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.1.0
+ */
+
+require_once 'PHPUnit2/Framework/TestCase.php';
+
+require_once 'Benchmark/Timer.php';
+
+/**
+ * A TestCase that expects a TestCase to be executed
+ * meeting a given time limit.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Extensions_PerformanceTestCase extends PHPUnit2_Framework_TestCase {
+ /**
+ * @var integer
+ * @access private
+ */
+ private $maxRunningTime = 0;
+
+ /**
+ * @access protected
+ */
+ protected function runTest() {
+ $timer = new Benchmark_Timer;
+
+ $timer->start();
+ parent::runTest();
+ $timer->stop();
+
+ if ($this->maxRunningTime != 0 &&
+ $timer->timeElapsed() > $this->maxRunningTime) {
+ $this->fail(
+ sprintf(
+ 'expected running time: <= %s but was: %s',
+
+ $this->maxRunningTime,
+ $timer->timeElapsed()
+ )
+ );
+ }
+ }
+
+ /**
+ * @param integer $maxRunningTime
+ * @throws Exception
+ * @access public
+ * @since Method available since Release 2.3.0
+ */
+ public function setMaxRunningTime($maxRunningTime) {
+ if (is_integer($maxRunningTime) &&
+ $maxRunningTime >= 0) {
+ $this->maxRunningTime = $maxRunningTime;
+ } else {
+ throw new Exception;
+ }
+ }
+
+ /**
+ * @return integer
+ * @access public
+ * @since Method available since Release 2.3.0
+ */
+ public function getMaxRunningTime() {
+ return $this->maxRunningTime;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Extensions/RepeatedTest.php b/buildscripts/PHPUnit2/Extensions/RepeatedTest.php
new file mode 100644
index 00000000..c23b0915
--- /dev/null
+++ b/buildscripts/PHPUnit2/Extensions/RepeatedTest.php
@@ -0,0 +1,138 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: RepeatedTest.php,v 1.15.2.4 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Extensions/TestDecorator.php';
+
+/**
+ * A Decorator that runs a test repeatedly.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Extensions_RepeatedTest extends PHPUnit2_Extensions_TestDecorator {
+ /**
+ * @var integer
+ * @access private
+ */
+ private $timesRepeat = 1;
+
+ /**
+ * Constructor.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param integer $timesRepeat
+ * @throws Exception
+ * @access public
+ */
+ public function __construct(PHPUnit2_Framework_Test $test, $timesRepeat = 1) {
+ parent::__construct($test);
+
+ if (is_integer($timesRepeat) &&
+ $timesRepeat >= 0) {
+ $this->timesRepeat = $timesRepeat;
+ } else {
+ throw new Exception(
+ 'Argument 2 must be a positive integer.'
+ );
+ }
+ }
+
+ /**
+ * Counts the number of test cases that
+ * will be run by this test.
+ *
+ * @return integer
+ * @access public
+ */
+ public function countTestCases() {
+ return $this->timesRepeat * $this->test->countTestCases();
+ }
+
+ /**
+ * Runs the decorated test and collects the
+ * result in a TestResult.
+ *
+ * @param PHPUnit2_Framework_TestResult $result
+ * @return PHPUnit2_Framework_TestResult
+ * @throws Exception
+ * @access public
+ */
+ public function run($result = NULL) {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ // XXX: Workaround for missing ability to declare type-hinted parameters as optional.
+ else if (!($result instanceof PHPUnit2_Framework_TestResult)) {
+ throw new Exception(
+ 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.'
+ );
+ }
+
+ for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) {
+ $this->test->run($result);
+ }
+
+ return $result;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Extensions/TestDecorator.php b/buildscripts/PHPUnit2/Extensions/TestDecorator.php
new file mode 100644
index 00000000..3557eeca
--- /dev/null
+++ b/buildscripts/PHPUnit2/Extensions/TestDecorator.php
@@ -0,0 +1,174 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestDecorator.php,v 1.14.2.4 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/Assert.php';
+require_once 'PHPUnit2/Framework/Test.php';
+require_once 'PHPUnit2/Framework/TestResult.php';
+
+/**
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Extensions_TestDecorator extends PHPUnit2_Framework_Assert implements PHPUnit2_Framework_Test {
+ /**
+ * The Test to be decorated.
+ *
+ * @var object
+ * @access protected
+ */
+ protected $test = NULL;
+
+ /**
+ * Constructor.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function __construct(PHPUnit2_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 PHPUnit2_Framework_TestResult $result
+ * @access public
+ */
+ public function basicRun(PHPUnit2_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 countTestCases() {
+ return $this->test->countTestCases();
+ }
+
+ /**
+ * Creates a default TestResult object.
+ *
+ * @return PHPUnit2_Framework_TestResult
+ * @access protected
+ */
+ protected function createResult() {
+ return new PHPUnit2_Framework_TestResult;
+ }
+
+ /**
+ * Returns the test to be run.
+ *
+ * @return PHPUnit2_Framework_Test
+ * @access public
+ */
+ public function getTest() {
+ return $this->test;
+ }
+
+ /**
+ * Runs the decorated test and collects the
+ * result in a TestResult.
+ *
+ * @param PHPUnit2_Framework_TestResult $result
+ * @return PHPUnit2_Framework_TestResult
+ * @throws Exception
+ * @access public
+ */
+ public function run($result = NULL) {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ // XXX: Workaround for missing ability to declare type-hinted parameters as optional.
+ else if (!($result instanceof PHPUnit2_Framework_TestResult)) {
+ throw new Exception(
+ 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.'
+ );
+ }
+
+ $this->basicRun($result);
+
+ return $result;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Extensions/TestSetup.php b/buildscripts/PHPUnit2/Extensions/TestSetup.php
new file mode 100644
index 00000000..4d28f931
--- /dev/null
+++ b/buildscripts/PHPUnit2/Extensions/TestSetup.php
@@ -0,0 +1,154 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestSetup.php,v 1.13.2.6 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/TestSuite.php';
+require_once 'PHPUnit2/Extensions/TestDecorator.php';
+
+/**
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Extensions_TestSetup extends PHPUnit2_Extensions_TestDecorator {
+ /**
+ * Runs the decorated test and collects the
+ * result in a TestResult.
+ *
+ * @param PHPUnit2_Framework_TestResult $result
+ * @return PHPUnit2_Framework_TestResult
+ * @throws Exception
+ * @access public
+ */
+ public function run($result = NULL) {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ // XXX: Workaround for missing ability to declare type-hinted parameters as optional.
+ else if (!($result instanceof PHPUnit2_Framework_TestResult)) {
+ throw new Exception(
+ 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.'
+ );
+ }
+
+ $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 $property) {
+ $name = $property->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 PHPUnit2_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() {
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/Assert.php b/buildscripts/PHPUnit2/Framework/Assert.php
new file mode 100644
index 00000000..3465afea
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/Assert.php
@@ -0,0 +1,626 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Assert.php,v 1.45.2.4 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+require_once 'PHPUnit2/Framework/ComparisonFailure.php';
+
+/**
+ * A set of assert methods.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ * @static
+ */
+class PHPUnit2_Framework_Assert {
+ /**
+ * @var boolean
+ * @access private
+ * @static
+ */
+ private static $looselyTyped = FALSE;
+
+ /**
+ * Protect constructor since it is a static only class.
+ *
+ * @access protected
+ */
+ protected function __construct() {
+ }
+
+ /**
+ * Asserts that a haystack contains a needle.
+ *
+ * @param mixed $needle
+ * @param mixed $haystack
+ * @param string $message
+ * @access public
+ * @static
+ * @since Method available since Release 2.1.0
+ */
+ public static function assertContains($needle, $haystack, $message = '') {
+ self::doAssertContains($needle, $haystack, TRUE, $message);
+ }
+
+ /**
+ * Asserts that a haystack does not contain a needle.
+ *
+ * @param mixed $needle
+ * @param mixed $haystack
+ * @param string $message
+ * @access public
+ * @static
+ * @since Method available since Release 2.1.0
+ */
+ public static function assertNotContains($needle, $haystack, $message = '') {
+ self::doAssertContains($needle, $haystack, FALSE, $message);
+ }
+
+ /**
+ * @param mixed $needle
+ * @param mixed $haystack
+ * @param boolean $condition
+ * @param string $message
+ * @throws Exception
+ * @access private
+ * @static
+ * @since Method available since Release 2.2.0
+ */
+ private static function doAssertContains($needle, $haystack, $condition, $message) {
+ $found = FALSE;
+
+ if (is_array($haystack) ||
+ (is_object($haystack) && $haystack instanceof Iterator)) {
+ foreach ($haystack as $straw) {
+ if ($straw === $needle) {
+ $found = TRUE;
+ break;
+ }
+ }
+ }
+
+ else if (is_string($needle) && is_string($haystack)) {
+ if (strpos($haystack, $needle) !== FALSE) {
+ $found = TRUE;
+ }
+ }
+
+ else {
+ throw new Exception;
+ }
+
+ if ($condition && !$found) {
+ self::fail(
+ sprintf(
+ '%s%s"%s" does not contain "%s"',
+
+ $message,
+ ($message != '') ? ' ' : '',
+ self::objectToString($haystack),
+ self::objectToString($needle)
+ )
+ );
+ }
+
+ else if (!$condition && $found) {
+ self::fail(
+ sprintf(
+ '%s%s"%s" contains "%s"',
+
+ $message,
+ ($message != '') ? ' ' : '',
+ self::objectToString($haystack),
+ self::objectToString($needle)
+ )
+ );
+ }
+ }
+
+ /**
+ * Asserts that two variables are equal.
+ *
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param string $message
+ * @param mixed $delta
+ * @access public
+ * @static
+ */
+ public static function assertEquals($expected, $actual, $message = '', $delta = 0) {
+ self::doAssertEquals($expected, $actual, $delta, TRUE, $message);
+ }
+
+ /**
+ * Asserts that two variables are not equal.
+ *
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param string $message
+ * @param mixed $delta
+ * @access public
+ * @static
+ * @since Method available since Release 2.3.0
+ */
+ public static function assertNotEquals($expected, $actual, $message = '', $delta = 0) {
+ self::doAssertEquals($expected, $actual, $delta, FALSE, $message);
+ }
+
+ /**
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param mixed $delta
+ * @param boolean $condition
+ * @param string $message
+ * @access private
+ * @static
+ * @since Method available since Release 2.3.0
+ */
+ private static function doAssertEquals($expected, $actual, $delta, $condition, $message) {
+ $equal = FALSE;
+
+ if (is_array($expected)) {
+ if (is_array($actual)) {
+ self::sortArrayRecursively($actual);
+ self::sortArrayRecursively($expected);
+
+ if (self::$looselyTyped) {
+ $actual = self::convertToString($actual);
+ $expected = self::convertToString($expected);
+ }
+
+ $equal = (serialize($expected) == serialize($actual));
+ }
+ }
+
+ else if (is_float($expected) && is_float($actual) && is_float($delta)) {
+ $equal = (abs($expected - $actual) <= $delta);
+ }
+
+ else {
+ $equal = (serialize($expected) == serialize($actual));
+ }
+
+ if ($condition && !$equal) {
+ self::failNotSame(
+ $expected,
+ $actual,
+ $message
+ );
+ }
+
+ else if (!$condition && $equal) {
+ self::failSame(
+ $expected,
+ $actual,
+ $message
+ );
+ }
+ }
+
+ /**
+ * Asserts that a condition is true.
+ *
+ * @param boolean $condition
+ * @param string $message
+ * @throws Exception
+ * @access public
+ * @static
+ */
+ public static function assertTrue($condition, $message = '') {
+ if (is_bool($condition)) {
+ if (!$condition) {
+ self::fail($message);
+ }
+ } else {
+ throw new Exception;
+ }
+ }
+
+ /**
+ * Asserts that a condition is false.
+ *
+ * @param boolean $condition
+ * @param string $message
+ * @throws Exception
+ * @access public
+ * @static
+ */
+ public static function assertFalse($condition, $message = '') {
+ if (is_bool($condition)) {
+ self::assertTrue(!$condition, $message);
+ } else {
+ throw new Exception;
+ }
+ }
+
+ /**
+ * Asserts that a variable is not NULL.
+ *
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function assertNotNull($actual, $message = '') {
+ if (is_null($actual)) {
+ self::fail(self::format('NOT NULL', 'NULL', $message));
+ }
+ }
+
+ /**
+ * Asserts that a variable is NULL.
+ *
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function assertNull($actual, $message = '') {
+ if (!is_null($actual)) {
+ self::fail(self::format('NULL', 'NOT NULL', $message));
+ }
+ }
+
+ /**
+ * Asserts that two variables have the same type and value.
+ * Used on objects, it asserts that two variables reference
+ * the same object.
+ *
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function assertSame($expected, $actual, $message = '') {
+ if ($expected !== $actual) {
+ self::failNotSame($expected, $actual, $message);
+ }
+ }
+
+ /**
+ * Asserts that two variables do not have the same type and value.
+ * Used on objects, it asserts that two variables do not reference
+ * the same object.
+ *
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function assertNotSame($expected, $actual, $message = '') {
+ if ($expected === $actual) {
+ self::failSame($expected, $actual, $message);
+ }
+ }
+
+ /**
+ * Asserts that a variable is of a given type.
+ *
+ * @param string $expected
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function assertType($expected, $actual, $message = '') {
+ self::doAssertType($expected, $actual, TRUE, $message);
+ }
+
+ /**
+ * Asserts that a variable is not of a given type.
+ *
+ * @param string $expected
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ * @since Method available since Release 2.2.0
+ */
+ public static function assertNotType($expected, $actual, $message = '') {
+ self::doAssertType($expected, $actual, FALSE, $message);
+ }
+
+ /**
+ * @param string $expected
+ * @param mixed $actual
+ * @param boolean $condition
+ * @param string $message
+ * @access private
+ * @static
+ * @since Method available since Release 2.2.0
+ */
+ private static function doAssertType($expected, $actual, $condition, $message) {
+ if (!is_string($expected)) {
+ throw new Exception;
+ }
+
+ if (is_object($actual)) {
+ $result = $actual instanceof $expected;
+ } else {
+ $result = (gettype($actual) == $expected);
+ }
+
+ if ($condition && !$result) {
+ self::failNotSame(
+ $expected,
+ $actual,
+ $message
+ );
+ }
+
+ else if (!$condition && $result) {
+ self::failSame(
+ $expected,
+ $actual,
+ $message
+ );
+ }
+ }
+
+ /**
+ * Asserts that a string matches a given regular expression.
+ *
+ * @param string $pattern
+ * @param string $string
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function assertRegExp($pattern, $string, $message = '') {
+ self::doAssertRegExp($pattern, $string, TRUE, $message);
+ }
+
+ /**
+ * Asserts that a string does not match a given regular expression.
+ *
+ * @param string $pattern
+ * @param string $string
+ * @param string $message
+ * @access public
+ * @static
+ * @since Method available since Release 2.1.0
+ */
+ public static function assertNotRegExp($pattern, $string, $message = '') {
+ self::doAssertRegExp($pattern, $string, FALSE, $message);
+ }
+
+ /**
+ * @param mixed $pattern
+ * @param mixed $string
+ * @param boolean $condition
+ * @param string $message
+ * @access private
+ * @static
+ * @since Method available since Release 2.2.0
+ */
+ private static function doAssertRegExp($pattern, $string, $condition, $message) {
+ if (!is_string($pattern) || !is_string($string)) {
+ throw new Exception;
+ }
+
+ $result = preg_match($pattern, $string);
+
+ if ($condition && !$result) {
+ self::fail(
+ sprintf(
+ '%s%s"%s" does not match pattern "%s"',
+
+ $message,
+ ($message != '') ? ' ' : '',
+ $string,
+ $pattern
+ )
+ );
+ }
+
+ else if (!$condition && $result) {
+ self::fail(
+ sprintf(
+ '%s%s"%s" matches pattern "%s"',
+
+ $message,
+ ($message != '') ? ' ' : '',
+ $string,
+ $pattern
+ )
+ );
+ }
+ }
+
+ /**
+ * Fails a test with the given message.
+ *
+ * @param string $message
+ * @throws PHPUnit2_Framework_AssertionFailedError
+ * @access public
+ * @static
+ */
+ public static function fail($message = '') {
+ throw new PHPUnit2_Framework_AssertionFailedError($message);
+ }
+
+ /**
+ * @param string $message
+ * @throws PHPUnit2_Framework_AssertionFailedError
+ * @access private
+ * @static
+ */
+ private static function failSame($message) {
+ self::fail(
+ sprintf(
+ '%s%sexpected not same',
+
+ $message,
+ ($message != '') ? ' ' : ''
+ )
+ );
+ }
+
+ /**
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param string $message
+ * @throws PHPUnit2_Framework_AssertionFailedError
+ * @access private
+ * @static
+ */
+ private static function failNotSame($expected, $actual, $message) {
+ if (is_string($expected) && is_string($actual)) {
+ throw new PHPUnit2_Framework_ComparisonFailure($expected, $actual, $message);
+ }
+
+ self::fail(
+ sprintf(
+ '%s%sexpected same: <%s> was not: <%s>',
+
+ $message,
+ ($message != '') ? ' ' : '',
+ self::objectToString($expected),
+ self::objectToString($actual)
+ )
+ );
+ }
+
+ /**
+ * @param mixed $expected
+ * @param mixed $actual
+ * @param string $message
+ * @access public
+ * @static
+ */
+ public static function format($expected, $actual, $message) {
+ return sprintf(
+ '%s%sexpected: <%s> but was: <%s>',
+
+ $message,
+ ($message != '') ? ' ' : '',
+ self::objectToString($expected),
+ self::objectToString($actual)
+ );
+ }
+
+ /**
+ * @param boolean $looselyTyped
+ * @access public
+ * @static
+ */
+ public static function setLooselyTyped($looselyTyped) {
+ if (is_bool($looselyTyped)) {
+ self::$looselyTyped = $looselyTyped;
+ }
+ }
+
+ /**
+ * Converts a value to a string.
+ *
+ * @param mixed $value
+ * @access private
+ * @static
+ */
+ private static function convertToString($value) {
+ foreach ($value as $k => $v) {
+ if (is_array($v)) {
+ $value[$k] = self::convertToString($value[$k]);
+ } else if (is_object($v)) {
+ $value[$k] = self::objectToString($value[$k]);
+ } else {
+ settype($value[$k], 'string');
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * @param mixed $object
+ * @return string
+ * @access private
+ * @static
+ */
+ private static function objectToString($object) {
+ if (is_array($object) || is_object($object)) {
+ $object = serialize($object);
+ }
+
+ return $object;
+ }
+
+ /**
+ * Sorts an array recursively by its keys.
+ *
+ * @param array $array
+ * @access private
+ * @static
+ * @author Adam Maccabee Trachtenberg <adam@trachtenberg.com>
+ */
+ private static function sortArrayRecursively(&$array) {
+ ksort($array);
+
+ foreach($array as $k => $v) {
+ if (is_array($v)) {
+ self::sortArrayRecursively($array[$k]);
+ }
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/AssertionFailedError.php b/buildscripts/PHPUnit2/Framework/AssertionFailedError.php
new file mode 100644
index 00000000..d3db50ed
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/AssertionFailedError.php
@@ -0,0 +1,80 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: AssertionFailedError.php,v 1.9.2.2 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * Thrown when an assertion failed.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_AssertionFailedError extends Exception {
+ /**
+ * Wrapper for getMessage() which is declared as final.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString() {
+ return $this->getMessage();
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/ComparisonFailure.php b/buildscripts/PHPUnit2/Framework/ComparisonFailure.php
new file mode 100644
index 00000000..cc8e26e6
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/ComparisonFailure.php
@@ -0,0 +1,153 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: ComparisonFailure.php,v 1.13.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/Assert.php';
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+
+/**
+ * Thrown when an assertion for string equality failed.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_ComparisonFailure extends PHPUnit2_Framework_AssertionFailedError {
+ /**
+ * @var string
+ * @access private
+ */
+ private $expected = '';
+
+ /**
+ * @var string
+ * @access private
+ */
+ private $actual = '';
+
+ /**
+ * Constructs a comparison failure.
+ *
+ * @param string $expected
+ * @param string $actual
+ * @param string $message
+ * @access public
+ */
+ public function __construct($expected, $actual, $message = '') {
+ parent::__construct($message);
+
+ $this->expected = ($expected === NULL) ? 'NULL' : $expected;
+ $this->actual = ($actual === NULL) ? 'NULL' : $actual;
+ }
+
+ /**
+ * Returns "..." in place of common prefix and "..." in
+ * place of common suffix between expected and actual.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString() {
+ $end = min(strlen($this->expected), strlen($this->actual));
+ $i = 0;
+ $j = strlen($this->expected) - 1;
+ $k = strlen($this->actual) - 1;
+
+ for (; $i < $end; $i++) {
+ if ($this->expected[$i] != $this->actual[$i]) {
+ break;
+ }
+ }
+
+ for (; $k >= $i && $j >= $i; $k--,$j--) {
+ if ($this->expected[$j] != $this->actual[$k]) {
+ break;
+ }
+ }
+
+ if ($j < $i && $k < $i) {
+ $expected = $this->expected;
+ $actual = $this->actual;
+ } else {
+ $expected = substr($this->expected, $i, ($j + 1 - $i));
+ $actual = substr($this->actual, $i, ($k + 1 - $i));;
+
+ if ($i <= $end && $i > 0) {
+ $expected = '...' . $expected;
+ $actual = '...' . $actual;
+ }
+
+ if ($j < strlen($this->expected) - 1) {
+ $expected .= '...';
+ }
+
+ if ($k < strlen($this->actual) - 1) {
+ $actual .= '...';
+ }
+ }
+
+ return PHPUnit2_Framework_Assert::format(
+ $expected,
+ $actual,
+ parent::getMessage()
+ );
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/Error.php b/buildscripts/PHPUnit2/Framework/Error.php
new file mode 100644
index 00000000..a4bd4fd2
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/Error.php
@@ -0,0 +1,88 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Error.php,v 1.4.2.2 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.2.0
+ */
+
+/**
+ * Wrapper for PHP errors.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.2.0
+ */
+class PHPUnit2_Framework_Error extends Exception {
+ /**
+ * Constructor.
+ *
+ * @param string $message
+ * @param integer $code
+ * @param string $file
+ * @param integer $line
+ * @param array $trace
+ * @access public
+ */
+ public function __construct($message, $code, $file, $line, $trace) {
+ parent::__construct($message, $code);
+
+ $this->file = $file;
+ $this->line = $line;
+ $this->trace = $trace;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/IncompleteTest.php b/buildscripts/PHPUnit2/Framework/IncompleteTest.php
new file mode 100644
index 00000000..325e6411
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/IncompleteTest.php
@@ -0,0 +1,72 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: IncompleteTest.php,v 1.6.2.2 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * A marker interface for marking any exception/error as result of an unit
+ * test as incomplete implementation or currently not implemented.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Interface available since Release 2.0.0
+ */
+interface PHPUnit2_Framework_IncompleteTest {
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/IncompleteTestError.php b/buildscripts/PHPUnit2/Framework/IncompleteTestError.php
new file mode 100644
index 00000000..6c2a0660
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/IncompleteTestError.php
@@ -0,0 +1,75 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: IncompleteTestError.php,v 1.5.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+require_once 'PHPUnit2/Framework/IncompleteTest.php';
+
+/**
+ * Extension to PHPUnit2_Framework_AssertionFailedError to mark the special
+ * case of an incomplete test.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_IncompleteTestError extends PHPUnit2_Framework_AssertionFailedError implements PHPUnit2_Framework_IncompleteTest {
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/Test.php b/buildscripts/PHPUnit2/Framework/Test.php
new file mode 100644
index 00000000..1d198f1a
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/Test.php
@@ -0,0 +1,87 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Test.php,v 1.12.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * A Test can be run and collect its results.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Interface available since Release 2.0.0
+ */
+interface PHPUnit2_Framework_Test {
+ /**
+ * Counts the number of test cases that will be run by this test.
+ *
+ * @return integer
+ * @access public
+ */
+ public function countTestCases();
+
+ /**
+ * Runs a test and collects its result in a TestResult instance.
+ *
+ * @param PHPUnit2_Framework_TestResult $result
+ * @return PHPUnit2_Framework_TestResult
+ * @access public
+ */
+ public function run($result = NULL);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/TestCase.php b/buildscripts/PHPUnit2/Framework/TestCase.php
new file mode 100644
index 00000000..80f56932
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/TestCase.php
@@ -0,0 +1,292 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestCase.php,v 1.32.2.5 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/Assert.php';
+require_once 'PHPUnit2/Framework/Error.php';
+require_once 'PHPUnit2/Framework/Test.php';
+require_once 'PHPUnit2/Framework/TestResult.php';
+
+/**
+ * A TestCase defines the fixture to run multiple tests.
+ *
+ * To define a TestCase
+ *
+ * 1) Implement a subclass of PHPUnit2_Framework_TestCase.
+ * 2) Define instance variables that store the state of the fixture.
+ * 3) Initialize the fixture state by overriding setUp().
+ * 4) Clean-up after a test by overriding tearDown().
+ *
+ * Each test runs in its own fixture so there can be no side effects
+ * among test runs.
+ *
+ * Here is an example:
+ *
+ * <code>
+ * <?php
+ * require_once 'PHPUnit2/Framework/TestCase.php';
+ *
+ * class MathTest extends PHPUnit2_Framework_TestCase {
+ * public $value1;
+ * public $value2;
+ *
+ * public function __construct($name) {
+ * parent::__construct($name);
+ * }
+ *
+ * public function setUp() {
+ * $this->value1 = 2;
+ * $this->value2 = 3;
+ * }
+ * }
+ * ?>
+ * </code>
+ *
+ * For each test implement a method which interacts with the fixture.
+ * Verify the expected results with assertions specified by calling
+ * assert with a boolean.
+ *
+ * <code>
+ * <?php
+ * public function testPass() {
+ * $this->assertTrue($this->value1 + $this->value2 == 5);
+ * }
+ * ?>
+ * </code>
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ * @abstract
+ */
+abstract class PHPUnit2_Framework_TestCase extends PHPUnit2_Framework_Assert implements PHPUnit2_Framework_Test {
+ /**
+ * The name of the test case.
+ *
+ * @var string
+ * @access private
+ */
+ private $name = NULL;
+
+ /**
+ * Constructs a test case with the given name.
+ *
+ * @param string
+ * @access public
+ */
+ public function __construct($name = NULL) {
+ if ($name !== NULL) {
+ $this->setName($name);
+ }
+ }
+
+ /**
+ * Returns a string representation of the test case.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString() {
+ $class = new ReflectionClass($this);
+
+ return sprintf(
+ '%s(%s)',
+
+ $this->getName(),
+ $class->name
+ );
+ }
+
+ /**
+ * Counts the number of test cases executed by run(TestResult result).
+ *
+ * @return integer
+ * @access public
+ */
+ public function countTestCases() {
+ return 1;
+ }
+
+ /**
+ * Gets the name of a TestCase.
+ *
+ * @return string
+ * @access public
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * 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 PHPUnit2_Framework_TestResult $result
+ * @return PHPUnit2_Framework_TestResult
+ * @throws Exception
+ * @access public
+ */
+ public function run($result = NULL) {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ // XXX: Workaround for missing ability to declare type-hinted parameters as optional.
+ else if (!($result instanceof PHPUnit2_Framework_TestResult)) {
+ throw new Exception(
+ 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.'
+ );
+ }
+
+ $result->run($this);
+
+ return $result;
+ }
+
+ /**
+ * Runs the bare test sequence.
+ *
+ * @access public
+ */
+ public function runBare() {
+ $catchedException = NULL;
+
+ $this->setUp();
+
+ try {
+ $this->runTest();
+ }
+
+ catch (Exception $e) {
+ $catchedException = $e;
+ }
+
+ $this->tearDown();
+
+ // Workaround for missing "finally".
+ if ($catchedException !== NULL) {
+ throw $catchedException;
+ }
+ }
+
+ /**
+ * Override to run the test and assert its state.
+ *
+ * @throws PHPUnit2_Framework_Error
+ * @access protected
+ */
+ protected function runTest() {
+ if ($this->name === NULL) {
+ throw new PHPUnit2_Framework_Error(
+ 'PHPUnit2_Framework_TestCase::$name must not be NULL.'
+ );
+ }
+
+ try {
+ $class = new ReflectionClass($this);
+ $method = $class->getMethod($this->name);
+ }
+
+ catch (ReflectionException $e) {
+ $this->fail($e->getMessage());
+ }
+
+ $method->invoke($this);
+ }
+
+ /**
+ * Sets the name of a TestCase.
+ *
+ * @param string
+ * @access public
+ */
+ public function setName($name) {
+ $this->name = $name;
+ }
+
+ /**
+ * Creates a default TestResult object.
+ *
+ * @return PHPUnit2_Framework_TestResult
+ * @access protected
+ */
+ protected function createResult() {
+ return new PHPUnit2_Framework_TestResult;
+ }
+
+ /**
+ * Sets up the fixture, for example, open a network connection.
+ * This method is called before a test is executed.
+ *
+ * @access protected
+ */
+ protected function setUp() {
+ }
+
+ /**
+ * Tears down the fixture, for example, close a network connection.
+ * This method is called after a test is executed.
+ *
+ * @access protected
+ */
+ protected function tearDown() {
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/TestFailure.php b/buildscripts/PHPUnit2/Framework/TestFailure.php
new file mode 100644
index 00000000..4957e4e6
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/TestFailure.php
@@ -0,0 +1,154 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestFailure.php,v 1.10.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+require_once 'PHPUnit2/Framework/Test.php';
+
+/**
+ * A TestFailure collects a failed test together with the caught exception.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_TestFailure {
+ /**
+ * @var PHPUnit2_Framework_Test
+ * @access protected
+ */
+ protected $failedTest;
+
+ /**
+ * @var Exception
+ * @access protected
+ */
+ protected $thrownException;
+
+ /**
+ * Constructs a TestFailure with the given test and exception.
+ *
+ * @param PHPUnit2_Framework_Test $failedTest
+ * @param Exception $thrownException
+ * @access public
+ */
+ public function __construct(PHPUnit2_Framework_Test $failedTest, Exception $thrownException) {
+ $this->failedTest = $failedTest;
+ $this->thrownException = $thrownException;
+ }
+
+ /**
+ * Returns a short description of the failure.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString() {
+ return sprintf(
+ '%s: %s',
+
+ $this->failedTest,
+ $this->thrownException->getMessage()
+ );
+ }
+
+ /**
+ * Gets the failed test.
+ *
+ * @return Test
+ * @access public
+ */
+ public function failedTest() {
+ return $this->failedTest;
+ }
+
+ /**
+ * Gets the thrown exception.
+ *
+ * @return Exception
+ * @access public
+ */
+ public function thrownException() {
+ return $this->thrownException;
+ }
+
+ /**
+ * Returns the exception's message.
+ *
+ * @return string
+ * @access public
+ */
+ public function exceptionMessage() {
+ return $this->thrownException()->getMessage();
+ }
+
+ /**
+ * Returns TRUE if the thrown exception
+ * is of type AssertionFailedError.
+ *
+ * @return boolean
+ * @access public
+ */
+ public function isFailure() {
+ return ($this->thrownException() instanceof PHPUnit2_Framework_AssertionFailedError);
+ }
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/TestListener.php b/buildscripts/PHPUnit2/Framework/TestListener.php
new file mode 100644
index 00000000..79f11ffb
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/TestListener.php
@@ -0,0 +1,135 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestListener.php,v 1.11.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+require_once 'PHPUnit2/Framework/TestSuite.php';
+
+/**
+ * A Listener for test progress.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Interface available since Release 2.0.0
+ */
+interface PHPUnit2_Framework_TestListener {
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e);
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e);
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e);
+
+ /**
+ * A test suite started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite);
+
+ /**
+ * A test suite ended.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite);
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test);
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test);
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/TestResult.php b/buildscripts/PHPUnit2/Framework/TestResult.php
new file mode 100644
index 00000000..17adb529
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/TestResult.php
@@ -0,0 +1,447 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestResult.php,v 1.32.2.7 2006/02/25 09:44:23 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+require_once 'PHPUnit2/Framework/IncompleteTest.php';
+require_once 'PHPUnit2/Framework/TestFailure.php';
+require_once 'PHPUnit2/Framework/TestListener.php';
+require_once 'PHPUnit2/Util/ErrorHandler.php';
+require_once 'PHPUnit2/Util/Filter.php';
+
+/**
+ * A TestResult collects the results of executing a test case.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_TestResult {
+ /**
+ * @var array
+ * @access protected
+ */
+ protected $errors = array();
+
+ /**
+ * @var array
+ * @access protected
+ */
+ protected $failures = array();
+
+ /**
+ * @var array
+ * @access protected
+ */
+ protected $notImplemented = array();
+
+ /**
+ * @var array
+ * @access protected
+ */
+ protected $listeners = array();
+
+ /**
+ * @var integer
+ * @access protected
+ */
+ protected $runTests = 0;
+
+ /**
+ * Code Coverage information provided by Xdebug.
+ *
+ * @var array
+ * @access protected
+ */
+ protected $codeCoverageInformation = array();
+
+ /**
+ * @var boolean
+ * @access protected
+ */
+ protected $collectCodeCoverageInformation = FALSE;
+
+ /**
+ * @var boolean
+ * @access private
+ */
+ private $stop = FALSE;
+
+ /**
+ * Registers a TestListener.
+ *
+ * @param PHPUnit2_Framework_TestListener
+ * @access public
+ */
+ public function addListener(PHPUnit2_Framework_TestListener $listener) {
+ $this->listeners[] = $listener;
+ }
+
+ /**
+ * Unregisters a TestListener.
+ *
+ * @param PHPUnit2_Framework_TestListener $listener
+ * @access public
+ */
+ public function removeListener(PHPUnit2_Framework_TestListener $listener) {
+ for ($i = 0; $i < sizeof($this->listeners); $i++) {
+ if ($this->listeners[$i] === $listener) {
+ unset($this->listeners[$i]);
+ }
+ }
+ }
+
+ /**
+ * Adds an error to the list of errors.
+ * The passed in exception caused the error.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e) {
+ if ($e instanceof PHPUnit2_Framework_IncompleteTest) {
+ $this->notImplemented[] = new PHPUnit2_Framework_TestFailure($test, $e);
+
+ foreach ($this->listeners as $listener) {
+ $listener->addIncompleteTest($test, $e);
+ }
+ } else {
+ $this->errors[] = new PHPUnit2_Framework_TestFailure($test, $e);
+
+ foreach ($this->listeners as $listener) {
+ $listener->addError($test, $e);
+ }
+ }
+ }
+
+ /**
+ * Adds a failure to the list of failures.
+ * The passed in exception caused the failure.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ if ($e instanceof PHPUnit2_Framework_IncompleteTest) {
+ $this->notImplemented[] = new PHPUnit2_Framework_TestFailure($test, $e);
+
+ foreach ($this->listeners as $listener) {
+ $listener->addIncompleteTest($test, $e);
+ }
+ } else {
+ $this->failures[] = new PHPUnit2_Framework_TestFailure($test, $e);
+
+ foreach ($this->listeners as $listener) {
+ $listener->addFailure($test, $e);
+ }
+ }
+ }
+
+ /**
+ * Informs the result that a testsuite will be started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ foreach ($this->listeners as $listener) {
+ $listener->startTestSuite($suite);
+ }
+ }
+
+ /**
+ * Informs the result that a testsuite was completed.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ foreach ($this->listeners as $listener) {
+ $listener->endTestSuite($suite);
+ }
+ }
+
+ /**
+ * Informs the result that a test will be started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test) {
+ $this->runTests += $test->countTestCases();
+
+ foreach ($this->listeners as $listener) {
+ $listener->startTest($test);
+ }
+ }
+
+ /**
+ * Informs the result that a test was completed.
+ *
+ * @param PHPUnit2_Framework_Test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test) {
+ foreach ($this->listeners as $listener) {
+ $listener->endTest($test);
+ }
+ }
+
+ /**
+ * Returns TRUE if no incomplete test occured.
+ *
+ * @return boolean
+ * @access public
+ */
+ public function allCompletlyImplemented() {
+ return $this->notImplementedCount() == 0;
+ }
+
+ /**
+ * Gets the number of incomplete tests.
+ *
+ * @return integer
+ * @access public
+ */
+ public function notImplementedCount() {
+ return sizeof($this->notImplemented);
+ }
+
+ /**
+ * Returns an Enumeration for the incomplete tests.
+ *
+ * @return array
+ * @access public
+ */
+ public function notImplemented() {
+ return $this->notImplemented;
+ }
+
+ /**
+ * Gets the number of detected errors.
+ *
+ * @return integer
+ * @access public
+ */
+ public function errorCount() {
+ return sizeof($this->errors);
+ }
+
+ /**
+ * Returns an Enumeration for the errors.
+ *
+ * @return array
+ * @access public
+ */
+ public function errors() {
+ return $this->errors;
+ }
+
+ /**
+ * Gets the number of detected failures.
+ *
+ * @return integer
+ * @access public
+ */
+ public function failureCount() {
+ return sizeof($this->failures);
+ }
+
+ /**
+ * Returns an Enumeration for the failures.
+ *
+ * @return array
+ * @access public
+ */
+ public function failures() {
+ return $this->failures;
+ }
+
+ /**
+ * Enables or disables the collection of Code Coverage information.
+ *
+ * @param boolean $flag
+ * @throws Exception
+ * @access public
+ * @since Method available since Release 2.3.0
+ */
+ public function collectCodeCoverageInformation($flag) {
+ if (is_bool($flag)) {
+ $this->collectCodeCoverageInformation = $flag;
+ } else {
+ throw new Exception;
+ }
+ }
+
+ /**
+ * Returns Code Coverage data per test case.
+ *
+ * Format of the result array:
+ *
+ * <code>
+ * array(
+ * "testCase" => array(
+ * "/tested/code.php" => array(
+ * linenumber => flag
+ * )
+ * )
+ * )
+ * </code>
+ *
+ * flag < 0: Line is executable but was not executed.
+ * flag > 0: Line was executed.
+ *
+ * @return array
+ * @access public
+ */
+ public function getCodeCoverageInformation() {
+ return $this->codeCoverageInformation;
+ }
+
+ /**
+ * Runs a TestCase.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function run(PHPUnit2_Framework_Test $test) {
+ $this->startTest($test);
+
+ set_error_handler('PHPUnit2_Util_ErrorHandler', E_USER_ERROR);
+
+ $useXdebug = (extension_loaded('xdebug') && $this->collectCodeCoverageInformation);
+
+ if ($useXdebug) {
+ xdebug_start_code_coverage(XDEBUG_CC_UNUSED);
+ }
+
+ $globalsBackup = $GLOBALS;
+
+ try {
+ $test->runBare();
+ }
+
+ catch (PHPUnit2_Framework_AssertionFailedError $e) {
+ $this->addFailure($test, $e);
+ }
+
+ catch (Exception $e) {
+ $this->addError($test, $e);
+ }
+
+ $GLOBALS = $globalsBackup;
+
+ if ($useXdebug) {
+ $this->codeCoverageInformation[$test->getName()] = PHPUnit2_Util_Filter::getFilteredCodeCoverage(
+ xdebug_get_code_coverage()
+ );
+
+ xdebug_stop_code_coverage();
+ }
+
+ restore_error_handler();
+
+ $this->endTest($test);
+ }
+
+ /**
+ * Gets the number of run tests.
+ *
+ * @return integer
+ * @access public
+ */
+ public function runCount() {
+ return $this->runTests;
+ }
+
+ /**
+ * Checks whether the test run should stop.
+ *
+ * @return boolean
+ * @access public
+ */
+ public function shouldStop() {
+ return $this->stop;
+ }
+
+ /**
+ * Marks that the test run should stop.
+ *
+ * @access public
+ */
+ public function stop() {
+ $this->stop = TRUE;
+ }
+
+ /**
+ * Returns whether the entire test was successful or not.
+ *
+ * @return boolean
+ * @access public
+ */
+ public function wasSuccessful() {
+ return empty($this->errors) && empty($this->failures);
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/TestSuite.php b/buildscripts/PHPUnit2/Framework/TestSuite.php
new file mode 100644
index 00000000..3d5d670e
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/TestSuite.php
@@ -0,0 +1,554 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestSuite.php,v 1.26.2.11 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/Test.php';
+require_once 'PHPUnit2/Framework/TestCase.php';
+require_once 'PHPUnit2/Framework/TestResult.php';
+require_once 'PHPUnit2/Runner/BaseTestRunner.php';
+require_once 'PHPUnit2/Util/Fileloader.php';
+
+/**
+ * A TestSuite is a composite of Tests. It runs a collection of test cases.
+ *
+ * Here is an example using the dynamic test definition.
+ *
+ * <code>
+ * <?php
+ * $suite = new PHPUnit2_Framework_TestSuite;
+ * $suite->addTest(new MathTest('testPass'));
+ * ?>
+ * </code>
+ *
+ * Alternatively, a TestSuite can extract the tests to be run automatically.
+ * To do so you pass a ReflectionClass instance for your
+ * PHPUnit2_Framework_TestCase class to the PHPUnit2_Framework_TestSuite
+ * constructor.
+ *
+ * <code>
+ * <?php
+ * $suite = new PHPUnit2_Framework_TestSuite(
+ * new ReflectionClass('MathTest')
+ * );
+ * ?>
+ * </code>
+ *
+ * This constructor creates a suite with all the methods starting with
+ * "test" that take no arguments.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_TestSuite implements PHPUnit2_Framework_Test {
+ /**
+ * The name of the test suite.
+ *
+ * @var string
+ * @access private
+ */
+ private $name = '';
+
+ /**
+ * The tests in the test suite.
+ *
+ * @var array
+ * @access private
+ */
+ private $tests = array();
+
+ /**
+ * Constructs a new TestSuite:
+ *
+ * - PHPUnit2_Framework_TestSuite() constructs an empty TestSuite.
+ *
+ * - PHPUnit2_Framework_TestSuite(ReflectionClass) constructs a
+ * TestSuite from the given class.
+ *
+ * - PHPUnit2_Framework_TestSuite(ReflectionClass, String)
+ * constructs a TestSuite from the given class with the given
+ * name.
+ *
+ * - PHPUnit2_Framework_TestSuite(String) either constructs a
+ * TestSuite from the given class (if the passed string is the
+ * name of an existing class) or constructs an empty TestSuite
+ * with the given name.
+ *
+ * @param mixed $theClass
+ * @param string $name
+ * @throws Exception
+ * @access public
+ */
+ public function __construct($theClass = '', $name = '') {
+ $argumentsValid = FALSE;
+
+ if (is_object($theClass) &&
+ $theClass instanceof ReflectionClass) {
+ $argumentsValid = TRUE;
+ }
+
+ else if (is_string($theClass) && $theClass !== '' && class_exists($theClass)) {
+ $argumentsValid = TRUE;
+
+ if ($name == '') {
+ $name = $theClass;
+ }
+
+ $theClass = new ReflectionClass($theClass);
+ }
+
+ else if (is_string($theClass)) {
+ $this->setName($theClass);
+ return;
+ }
+
+ if (!$argumentsValid) {
+ throw new Exception;
+ }
+
+ if ($name != '') {
+ $this->setName($name);
+ } else {
+ $this->setName($theClass->getName());
+ }
+
+ $constructor = $theClass->getConstructor();
+
+ if ($constructor === NULL ||
+ !$constructor->isPublic()) {
+ $this->addTest(
+ self::warning(
+ sprintf(
+ 'Class %s has no public constructor',
+
+ $theClass->getName()
+ )
+ )
+ );
+
+ return;
+ }
+
+ $methods = $theClass->getMethods();
+ $names = array();
+
+ foreach ($methods as $method) {
+ $this->addTestMethod($method, $names, $theClass);
+ }
+
+ if (empty($this->tests)) {
+ $this->addTest(
+ self::warning(
+ sprintf(
+ 'No tests found in %s',
+
+ $theClass->getName()
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * Returns a string representation of the test suite.
+ *
+ * @return string
+ * @access public
+ */
+ public function toString() {
+ return $this->getName();
+ }
+
+ /**
+ * Adds a test to the suite.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function addTest(PHPUnit2_Framework_Test $test) {
+ $this->tests[] = $test;
+ }
+
+ /**
+ * Adds the tests from the given class to the suite.
+ *
+ * @param mixed $testClass
+ * @access public
+ */
+ public function addTestSuite($testClass) {
+ if (is_string($testClass) &&
+ class_exists($testClass)) {
+ $testClass = new ReflectionClass($testClass);
+ }
+
+ if (is_object($testClass) &&
+ $testClass instanceof ReflectionClass) {
+ $this->addTest(new PHPUnit2_Framework_TestSuite($testClass));
+ }
+ }
+
+ /**
+ * Wraps both <code>addTest()</code> and <code>addTestSuite</code>
+ * as well as the separate import statements for the user's convenience.
+ *
+ * If the named file cannot be read or there are no new tests that can be
+ * added, a <code>PHPUnit2_Framework_Warning</code> will be created instead,
+ * leaving the current test run untouched.
+ *
+ * @param string $filename
+ * @throws Exception
+ * @access public
+ * @since Method available since Release 2.3.0
+ * @author Stefano F. Rausch <stefano@rausch-e.net>
+ */
+ public function addTestFile($filename) {
+ if (!is_string($filename) || !file_exists($filename)) {
+ throw new Exception;
+ }
+
+ $declaredClasses = get_declared_classes();
+
+ PHPUnit2_Util_Fileloader::checkAndLoad($filename);
+
+ $newClasses = array_values(
+ array_diff(get_declared_classes(), $declaredClasses)
+ );
+
+ $testsFound = 0;
+
+ foreach ($newClasses as $class) {
+ if (preg_match('"Tests?$"', $class)) {
+ try {
+ $suiteMethod = new ReflectionMethod(
+ $class, PHPUnit2_Runner_BaseTestRunner::SUITE_METHODNAME
+ );
+
+ $this->addTest($suiteMethod->invoke(NULL));
+ } catch (ReflectionException $e) {
+ $this->addTestSuite(new ReflectionClass($class));
+ }
+
+ $testsFound++;
+ }
+ }
+
+ if ($testsFound == 0) {
+ $this->addTest(
+ new PHPUnit2_Framework_Warning('No tests found in file ' . $filename)
+ );
+ }
+ }
+
+ /**
+ * Wrapper for addTestFile() that adds multiple test files.
+ *
+ * @param Array $filenames
+ * @throws Exception
+ * @access public
+ * @since Method available since Release 2.3.0
+ */
+ public function addTestFiles($filenames) {
+ foreach ($filenames as $filename) {
+ $this->addTestFile($filename);
+ }
+ }
+
+ /**
+ * Counts the number of test cases that will be run by this test.
+ *
+ * @return integer
+ * @access public
+ */
+ public function countTestCases() {
+ $count = 0;
+
+ foreach ($this->tests as $test) {
+ $count += $test->countTestCases();
+ }
+
+ return $count;
+ }
+
+ /**
+ * @param ReflectionClass $theClass
+ * @param string $name
+ * @return PHPUnit2_Framework_Test
+ * @access public
+ * @static
+ */
+ public static function createTest(ReflectionClass $theClass, $name) {
+ if (!$theClass->isInstantiable()) {
+ return self::warning(
+ sprintf(
+ 'Cannot instantiate test case %s.',
+ $theClass->getName()
+ )
+ );
+ }
+
+ $constructor = $theClass->getConstructor();
+
+ if ($constructor !== NULL) {
+ $parameters = $constructor->getParameters();
+
+ if (sizeof($parameters) == 0) {
+ $test = $theClass->newInstance();
+
+ if ($test instanceof PHPUnit2_Framework_TestCase) {
+ $test->setName($name);
+ }
+ }
+
+ else if (sizeof($parameters) == 1 &&
+ $parameters[0]->getClass() === NULL) {
+ $test = $theClass->newInstance($name);
+ }
+
+ else {
+ return self::warning(
+ sprintf(
+ 'Constructor of class %s is not TestCase($name) or TestCase().',
+ $theClass->getName()
+ )
+ );
+ }
+ }
+
+ return $test;
+ }
+
+ /**
+ * Creates a default TestResult object.
+ *
+ * @return PHPUnit2_Framework_TestResult
+ * @access protected
+ */
+ protected function createResult() {
+ return new PHPUnit2_Framework_TestResult;
+ }
+
+ /**
+ * Returns the name of the suite.
+ *
+ * @return string
+ * @access public
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * Runs the tests and collects their result in a TestResult.
+ *
+ * @param PHPUnit2_Framework_TestResult $result
+ * @return PHPUnit2_Framework_TestResult
+ * @throws Exception
+ * @access public
+ */
+ public function run($result = NULL) {
+ if ($result === NULL) {
+ $result = $this->createResult();
+ }
+
+ // XXX: Workaround for missing ability to declare type-hinted parameters as optional.
+ else if (!($result instanceof PHPUnit2_Framework_TestResult)) {
+ throw new Exception(
+ 'Argument 1 must be an instance of PHPUnit2_Framework_TestResult.'
+ );
+ }
+
+ $result->startTestSuite($this);
+
+ foreach ($this->tests as $test) {
+ if ($result->shouldStop()) {
+ break;
+ }
+
+ $this->runTest($test, $result);
+ }
+
+ $result->endTestSuite($this);
+
+ return $result;
+ }
+
+ /**
+ * Runs a test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_TestResult $testResult
+ * @access public
+ */
+ public function runTest(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_TestResult $result) {
+ $test->run($result);
+ }
+
+ /**
+ * Sets the name of the suite.
+ *
+ * @param string
+ * @access public
+ */
+ public function setName($name) {
+ $this->name = $name;
+ }
+
+ /**
+ * Returns the test at the given index.
+ *
+ * @param integer
+ * @return PHPUnit2_Framework_Test
+ * @access public
+ */
+ public function testAt($index) {
+ if (isset($this->tests[$index])) {
+ return $this->tests[$index];
+ } else {
+ return FALSE;
+ }
+ }
+
+ /**
+ * Returns the number of tests in this suite.
+ *
+ * @return integer
+ * @access public
+ */
+ public function testCount() {
+ return sizeof($this->tests);
+ }
+
+ /**
+ * Returns the tests as an enumeration.
+ *
+ * @return array
+ * @access public
+ */
+ public function tests() {
+ return $this->tests;
+ }
+
+ /**
+ * @param ReflectionMethod $method
+ * @param array $names
+ * @param ReflectionClass $theClass
+ * @access private
+ */
+ private function addTestMethod(ReflectionMethod $method, &$names, ReflectionClass $theClass) {
+ $name = $method->getName();
+
+ if (in_array($name, $names)) {
+ return;
+ }
+
+ if ($this->isPublicTestMethod($method)) {
+ $names[] = $name;
+
+ $this->addTest(
+ self::createTest(
+ $theClass,
+ $name
+ )
+ );
+ }
+
+ else if ($this->isTestMethod($method)) {
+ $this->addTest(
+ self::warning(
+ sprintf(
+ 'Test method is not public: %s',
+
+ $name
+ )
+ )
+ );
+ }
+ }
+
+ /**
+ * @param ReflectionMethod $method
+ * @return boolean
+ * @access private
+ */
+ private function isPublicTestMethod(ReflectionMethod $method) {
+ return ($this->isTestMethod($method) &&
+ $method->isPublic());
+ }
+
+ /**
+ * @param ReflectionMethod $method
+ * @return boolean
+ * @access private
+ */
+ private function isTestMethod(ReflectionMethod $method) {
+ return (substr($method->name, 0, 4) == 'test');
+ }
+
+ /**
+ * @param string $message
+ * @return PHPUnit2_Framework_Warning
+ * @access private
+ */
+ private static function warning($message) {
+ require_once 'PHPUnit2/Framework/Warning.php';
+ return new PHPUnit2_Framework_Warning($message);
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Framework/Warning.php b/buildscripts/PHPUnit2/Framework/Warning.php
new file mode 100644
index 00000000..0ae885a4
--- /dev/null
+++ b/buildscripts/PHPUnit2/Framework/Warning.php
@@ -0,0 +1,94 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Warning.php,v 1.11.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/TestCase.php';
+
+/**
+ * A warning.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Framework_Warning extends PHPUnit2_Framework_TestCase {
+ /**
+ * @var string
+ * @access private
+ */
+ private $message = '';
+
+ /**
+ * @param string $message
+ * @access public
+ */
+ public function __construct($message = '') {
+ $this->message = $message;
+ parent::__construct('Warning');
+ }
+
+ /**
+ * @access protected
+ */
+ protected function runTest() {
+ $this->fail($this->message);
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Runner/BaseTestRunner.php b/buildscripts/PHPUnit2/Runner/BaseTestRunner.php
new file mode 100644
index 00000000..b9517e5a
--- /dev/null
+++ b/buildscripts/PHPUnit2/Runner/BaseTestRunner.php
@@ -0,0 +1,283 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: BaseTestRunner.php,v 1.18.2.3 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/AssertionFailedError.php';
+require_once 'PHPUnit2/Framework/TestListener.php';
+require_once 'PHPUnit2/Runner/StandardTestSuiteLoader.php';
+
+/**
+ * Base class for all test runners.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ * @abstract
+ */
+abstract class PHPUnit2_Runner_BaseTestRunner implements PHPUnit2_Framework_TestListener {
+ const STATUS_ERROR = 1;
+ const STATUS_FAILURE = 2;
+ const STATUS_INCOMPLETE = 3;
+ const SUITE_METHODNAME = 'suite';
+
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->testFailed(self::STATUS_ERROR, $test, $e);
+ }
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ $this->testFailed(self::STATUS_FAILURE, $test, $e);
+ }
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->testFailed(self::STATUS_INCOMPLETE, $test, $e);
+ }
+
+ /**
+ * A testsuite started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ }
+
+ /**
+ * A testsuite ended.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ }
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test) {
+ $this->testStarted($test->getName());
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test) {
+ $this->testEnded($test->getName());
+ }
+
+ /**
+ * Returns the loader to be used.
+ *
+ * @return PHPUnit2_Runner_TestSuiteLoader
+ * @access public
+ */
+ public function getLoader() {
+ return new PHPUnit2_Runner_StandardTestSuiteLoader;
+ }
+
+ /**
+ * Returns the Test corresponding to the given suite.
+ * This is a template method, subclasses override
+ * the runFailed() and clearStatus() methods.
+ *
+ * @param string $suiteClassName
+ * @param string $suiteClassFile
+ * @return PHPUnit2_Framework_Test
+ * @access public
+ */
+ public function getTest($suiteClassName, $suiteClassFile = '') {
+ if ($suiteClassFile == $suiteClassName . '.php') {
+ $suiteClassFile = '';
+ }
+
+ try {
+ $testClass = $this->loadSuiteClass($suiteClassName, $suiteClassFile);
+ }
+
+ catch (Exception $e) {
+ $this->runFailed($e->getMessage());
+ return NULL;
+ }
+
+ try {
+ $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
+
+ if (!$suiteMethod->isStatic()) {
+ $this->runFailed(
+ 'suite() method must be static.'
+ );
+
+ return NULL;
+ }
+
+ try {
+ $test = $suiteMethod->invoke(NULL);
+ }
+
+ catch (ReflectionException $e) {
+ $this->runFailed(
+ sprintf(
+ "Failed to invoke suite() method.\n%s",
+
+ $e->getMessage()
+ )
+ );
+
+ return NULL;
+ }
+ }
+
+ catch (ReflectionException $e) {
+ $test = new PHPUnit2_Framework_TestSuite($testClass);
+ }
+
+ $this->clearStatus();
+
+ return $test;
+ }
+
+ /**
+ * Override to define how to handle a failed loading of
+ * a test suite.
+ *
+ * @param string $message
+ * @access protected
+ * @abstract
+ */
+ protected abstract function runFailed($message);
+
+ /**
+ * Returns the loaded ReflectionClass for a suite name.
+ *
+ * @param string $suiteClassName
+ * @param string $suiteClassFile
+ * @return ReflectionClass
+ * @access protected
+ */
+ protected function loadSuiteClass($suiteClassName, $suiteClassFile = '') {
+ return $this->getLoader()->load($suiteClassName, $suiteClassFile);
+ }
+
+ /**
+ * Clears the status message.
+ *
+ * @access protected
+ */
+ protected function clearStatus() {
+ }
+
+ /**
+ * A test started.
+ *
+ * @param string $testName
+ * @access public
+ * @abstract
+ */
+ public abstract function testStarted($testName);
+
+ /**
+ * A test ended.
+ *
+ * @param string $testName
+ * @access public
+ * @abstract
+ */
+ public abstract function testEnded($testName);
+
+ /**
+ * A test failed.
+ *
+ * @param integer $status
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ * @abstract
+ */
+ public abstract function testFailed($status, PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php b/buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php
new file mode 100644
index 00000000..116b20ed
--- /dev/null
+++ b/buildscripts/PHPUnit2/Runner/IncludePathTestCollector.php
@@ -0,0 +1,184 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: IncludePathTestCollector.php,v 1.13.2.5 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.1.0
+ */
+
+if (!class_exists('AppendIterator')) {
+ class AppendIterator implements Iterator {
+ private $iterators;
+
+ public function __construct() {
+ $this->iterators = new ArrayIterator();
+ }
+
+ public function __call($func, $params) {
+ return call_user_func_array(array($this->getInnerIterator(), $func), $params);
+ }
+
+ public function append(Iterator $it) {
+ $this->iterators->append($it);
+ }
+
+ public function getInnerIterator() {
+ return $this->iterators->current();
+ }
+
+ public function rewind() {
+ $this->iterators->rewind();
+
+ if ($this->iterators->valid()) {
+ $this->getInnerIterator()->rewind();
+ }
+ }
+
+ public function valid() {
+ return $this->iterators->valid() && $this->getInnerIterator()->valid();
+ }
+
+ public function current() {
+ return $this->iterators->valid() ? $this->getInnerIterator()->current() : NULL;
+ }
+
+ public function key() {
+ return $this->iterators->valid() ? $this->getInnerIterator()->key() : NULL;
+ }
+
+ public function next() {
+ if (!$this->iterators->valid()) return;
+ $this->getInnerIterator()->next();
+
+ if ($this->getInnerIterator()->valid()) return;
+ $this->iterators->next();
+
+ while ($this->iterators->valid()) {
+ $this->getInnerIterator()->rewind();
+
+ if ($this->getInnerIterator()->valid()) return;
+ $this->iterators->next();
+ }
+ }
+ }
+}
+
+require_once 'PHPUnit2/Runner/TestCollector.php';
+
+require_once 'PEAR/Config.php';
+
+/**
+ * An implementation of a TestCollector that consults the
+ * include path set in the php.ini.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+
+class PHPUnit2_Runner_IncludePathTestCollector implements PHPUnit2_Runner_TestCollector {
+ /**
+ * @return array
+ * @access public
+ */
+ public function collectTests() {
+ $config = new PEAR_Config;
+ $iterator = new AppendIterator;
+ $result = array();
+
+ if (substr(PHP_OS, 0, 3) == 'WIN') {
+ $delimiter = ';';
+ } else {
+ $delimiter = ':';
+ }
+
+ $paths = explode($delimiter, ini_get('include_path'));
+ $paths[] = $config->get('test_dir');
+
+ foreach ($paths as $path) {
+ $iterator->append(
+ new RecursiveIteratorIterator(
+ new RecursiveDirectoryIterator($path)
+ )
+ );
+ }
+
+ foreach ($iterator as $path => $file) {
+ if ($this->isTestClass($file)) {
+ if (substr(PHP_OS, 0, 3) == 'WIN') {
+ $path = str_replace('/', '\\', $path);
+ }
+
+ $result[] = $path;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Considers a file to contain a test class when it contains the
+ * pattern "Test" in its name and its name ends with ".php".
+ *
+ * @param string $classFileName
+ * @return boolean
+ * @access protected
+ */
+ protected function isTestClass($classFileName) {
+ return (strpos($classFileName, 'Test') !== FALSE && substr($classFileName, -4) == '.php') ? TRUE : FALSE;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php b/buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php
new file mode 100644
index 00000000..b0c359a0
--- /dev/null
+++ b/buildscripts/PHPUnit2/Runner/StandardTestSuiteLoader.php
@@ -0,0 +1,129 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: StandardTestSuiteLoader.php,v 1.19.2.8 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Runner/TestSuiteLoader.php';
+require_once 'PHPUnit2/Util/Fileloader.php';
+
+require_once 'PEAR/Config.php';
+
+/**
+ * The standard test suite loader.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Runner_StandardTestSuiteLoader implements PHPUnit2_Runner_TestSuiteLoader {
+ /**
+ * @param string $suiteClassName
+ * @param string $suiteClassFile
+ * @return ReflectionClass
+ * @throws Exception
+ * @access public
+ */
+ public function load($suiteClassName, $suiteClassFile = '') {
+ $suiteClassName = str_replace('.php', '', $suiteClassName);
+ $suiteClassFile = !empty($suiteClassFile) ? $suiteClassFile : str_replace('_', '/', $suiteClassName) . '.php';
+
+ if (!class_exists($suiteClassName)) {
+ if(!file_exists($suiteClassFile)) {
+ $config = new PEAR_Config;
+
+ $includePaths = explode(PATH_SEPARATOR, get_include_path());
+ $includePaths[] = $config->get('test_dir');
+
+ foreach ($includePaths as $includePath) {
+ $file = $includePath . DIRECTORY_SEPARATOR . $suiteClassFile;
+
+ if (file_exists($file)) {
+ $suiteClassFile = $file;
+ break;
+ }
+ }
+ }
+
+ PHPUnit2_Util_Fileloader::checkAndLoad($suiteClassFile);
+ }
+
+ if (class_exists($suiteClassName)) {
+ return new ReflectionClass($suiteClassName);
+ } else {
+ throw new Exception(
+ sprintf(
+ 'Class %s could not be found in %s.',
+
+ $suiteClassName,
+ $suiteClassFile
+ )
+ );
+ }
+ }
+
+ /**
+ * @param ReflectionClass $aClass
+ * @return ReflectionClass
+ * @access public
+ */
+ public function reload(ReflectionClass $aClass) {
+ return $aClass;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Runner/TestCollector.php b/buildscripts/PHPUnit2/Runner/TestCollector.php
new file mode 100644
index 00000000..38a9ce81
--- /dev/null
+++ b/buildscripts/PHPUnit2/Runner/TestCollector.php
@@ -0,0 +1,77 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestCollector.php,v 1.7.2.2 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * Collects Test class names to be presented
+ * by the TestSelector.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Interface available since Release 2.0.0
+ */
+interface PHPUnit2_Runner_TestCollector {
+ /**
+ * @return array
+ * @access public
+ */
+ public function collectTests();
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Runner/TestSuiteLoader.php b/buildscripts/PHPUnit2/Runner/TestSuiteLoader.php
new file mode 100644
index 00000000..711a03d2
--- /dev/null
+++ b/buildscripts/PHPUnit2/Runner/TestSuiteLoader.php
@@ -0,0 +1,85 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestSuiteLoader.php,v 1.11.2.2 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * An interface to define how a test suite should be loaded.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Interface available since Release 2.0.0
+ */
+interface PHPUnit2_Runner_TestSuiteLoader {
+ /**
+ * @param string $suiteClassName
+ * @param string $suiteClassFile
+ * @return ReflectionClass
+ * @access public
+ */
+ public function load($suiteClassName, $suiteClassFile = '');
+
+ /**
+ * @param ReflectionClass $aClass
+ * @return ReflectionClass
+ * @access public
+ */
+ public function reload(ReflectionClass $aClass);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Runner/Version.php b/buildscripts/PHPUnit2/Runner/Version.php
new file mode 100644
index 00000000..5a0f7785
--- /dev/null
+++ b/buildscripts/PHPUnit2/Runner/Version.php
@@ -0,0 +1,90 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Version.php,v 1.7.2.2 2005/12/17 16:04:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * This class defines the current version of PHPUnit.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Runner_Version {
+ /**
+ * Returns the current version of PHPUnit.
+ *
+ * @return string
+ * @access public
+ * @static
+ */
+ public static function id() {
+ return '@package_version@';
+ }
+
+ /**
+ * @return string
+ * @access public
+ * @static
+ */
+ public static function getVersionString() {
+ return 'PHPUnit @package_version@ by Sebastian Bergmann.';
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/TextUI/ResultPrinter.php b/buildscripts/PHPUnit2/TextUI/ResultPrinter.php
new file mode 100644
index 00000000..32d3e667
--- /dev/null
+++ b/buildscripts/PHPUnit2/TextUI/ResultPrinter.php
@@ -0,0 +1,356 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: ResultPrinter.php,v 1.20.2.5 2005/12/17 16:04:57 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+require_once 'PHPUnit2/Framework/TestListener.php';
+require_once 'PHPUnit2/Framework/TestFailure.php';
+require_once 'PHPUnit2/Util/Filter.php';
+require_once 'PHPUnit2/Util/Printer.php';
+
+/**
+ * Prints the result of a TextUI TestRunner run.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_TextUI_ResultPrinter extends PHPUnit2_Util_Printer implements PHPUnit2_Framework_TestListener {
+ /**
+ * @var integer
+ * @access private
+ */
+ private $column = 0;
+
+ /**
+ * @var boolean
+ * @access private
+ */
+ private $lastTestFailed = FALSE;
+
+ /**
+ * @param PHPUnit2_Framework_TestResult $result
+ * @param float $runTime
+ * @access public
+ */
+ public function printResult(PHPUnit2_Framework_TestResult $result, $timeElapsed) {
+ $this->printHeader($timeElapsed);
+ $this->printErrors($result);
+ $this->printFailures($result);
+ $this->printIncompletes($result);
+ $this->printFooter($result);
+ }
+
+ /**
+ * @param array $defects
+ * @param integer $count
+ * @param string $type
+ * @access protected
+ */
+ protected function printDefects($defects, $count, $type) {
+ if ($count == 0) {
+ return;
+ }
+
+ $this->write(
+ sprintf(
+ "There %s %d %s%s:\n",
+
+ ($count == 1) ? 'was' : 'were',
+ $count,
+ $type,
+ ($count == 1) ? '' : 's'
+ )
+ );
+
+ $i = 1;
+
+ foreach ($defects as $defect) {
+ $this->printDefect($defect, $i++);
+ }
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestFailure $defect
+ * @param integer $count
+ * @access protected
+ */
+ protected function printDefect(PHPUnit2_Framework_TestFailure $defect, $count) {
+ $this->printDefectHeader($defect, $count);
+ $this->printDefectTrace($defect);
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestFailure $defect
+ * @param integer $count
+ * @access protected
+ */
+ protected function printDefectHeader(PHPUnit2_Framework_TestFailure $defect, $count) {
+ $this->write(
+ sprintf(
+ "%d) %s\n",
+
+ $count,
+ $defect->failedTest()->toString()
+ )
+ );
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestFailure $defect
+ * @access protected
+ */
+ protected function printDefectTrace(PHPUnit2_Framework_TestFailure $defect) {
+ $e = $defect->thrownException();
+ $message = method_exists($e, 'toString') ? $e->toString() : $e->getMessage();
+
+ $this->write($message . "\n");
+
+ $this->write(
+ PHPUnit2_Util_Filter::getFilteredStacktrace(
+ $defect->thrownException()
+ )
+ );
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestResult $result
+ * @access protected
+ */
+ protected function printErrors(PHPUnit2_Framework_TestResult $result) {
+ $this->printDefects($result->errors(), $result->errorCount(), 'error');
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestResult $result
+ * @access protected
+ */
+ protected function printFailures(PHPUnit2_Framework_TestResult $result) {
+ $this->printDefects($result->failures(), $result->failureCount(), 'failure');
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestResult $result
+ * @access protected
+ */
+ protected function printIncompletes(PHPUnit2_Framework_TestResult $result) {
+ $this->printDefects($result->notImplemented(), $result->notImplementedCount(), 'incomplete test case');
+ }
+
+ /**
+ * @param float $timeElapsed
+ * @access protected
+ */
+ protected function printHeader($timeElapsed) {
+ $this->write(
+ sprintf(
+ "\n\nTime: %s\n",
+
+ $timeElapsed
+ )
+ );
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestResult $result
+ * @access protected
+ */
+ protected function printFooter(PHPUnit2_Framework_TestResult $result) {
+ if ($result->allCompletlyImplemented() &&
+ $result->wasSuccessful()) {
+ $this->write(
+ sprintf(
+ "\nOK (%d test%s)\n",
+
+ $result->runCount(),
+ ($result->runCount() == 1) ? '' : 's'
+ )
+ );
+ }
+
+ else if (!$result->allCompletlyImplemented() &&
+ $result->wasSuccessful()) {
+ $this->write(
+ sprintf(
+ "\nOK, but incomplete test cases!!!\nTests run: %d, Incomplete Tests: %d.\n",
+
+ $result->runCount(),
+ $result->notImplementedCount()
+ )
+ );
+ }
+
+ else {
+ $this->write(
+ sprintf(
+ "\nFAILURES!!!\nTests run: %d, Failures: %d, Errors: %d, Incomplete Tests: %d.\n",
+
+ $result->runCount(),
+ $result->failureCount(),
+ $result->errorCount(),
+ $result->notImplementedCount()
+ )
+ );
+ }
+ }
+
+ /**
+ * @access public
+ */
+ public function printWaitPrompt() {
+ $this->write("\n<RETURN> to continue\n");
+ }
+
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->write('E');
+ $this->nextColumn();
+
+ $this->lastTestFailed = TRUE;
+ }
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ $this->write('F');
+ $this->nextColumn();
+
+ $this->lastTestFailed = TRUE;
+ }
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->write('I');
+ $this->nextColumn();
+
+ $this->lastTestFailed = TRUE;
+ }
+
+ /**
+ * A testsuite started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ }
+
+ /**
+ * A testsuite ended.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ }
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test) {
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test) {
+ if (!$this->lastTestFailed) {
+ $this->write('.');
+ $this->nextColumn();
+ }
+
+ $this->lastTestFailed = FALSE;
+ }
+
+ /**
+ * @access protected
+ */
+ protected function nextColumn() {
+ if ($this->column++ >= 40) {
+ $this->column = 0;
+ $this->write("\n");
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/TextUI/TestRunner.php b/buildscripts/PHPUnit2/TextUI/TestRunner.php
new file mode 100644
index 00000000..63639a24
--- /dev/null
+++ b/buildscripts/PHPUnit2/TextUI/TestRunner.php
@@ -0,0 +1,622 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: TestRunner.php,v 1.64.2.5 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+if (!defined('PHPUnit2_MAIN_METHOD')) {
+ define('PHPUnit2_MAIN_METHOD', 'PHPUnit2_TextUI_TestRunner::main');
+}
+
+require_once 'PHPUnit2/Framework/TestSuite.php';
+require_once 'PHPUnit2/Runner/Version.php';
+require_once 'PHPUnit2/Runner/BaseTestRunner.php';
+require_once 'PHPUnit2/TextUI/ResultPrinter.php';
+require_once 'PHPUnit2/Util/Fileloader.php';
+
+require_once 'Console/Getopt.php';
+require_once 'Benchmark/Timer.php';
+
+/**
+ * A TestRunner for the Command Line Interface (CLI)
+ * PHP SAPI Module.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_TextUI_TestRunner extends PHPUnit2_Runner_BaseTestRunner {
+ const SUCCESS_EXIT = 0;
+ const FAILURE_EXIT = 1;
+ const EXCEPTION_EXIT = 2;
+
+ /**
+ * @var PHPUnit2_Runner_TestSuiteLoader
+ * @access private
+ */
+ private $loader = NULL;
+
+ /**
+ * @var PHPUnit2_TextUI_ResultPrinter
+ * @access private
+ */
+ private $printer = NULL;
+
+ /**
+ * @var boolean
+ * @access private
+ * @static
+ */
+ private static $versionStringPrinted = FALSE;
+
+ /**
+ * @access public
+ * @static
+ */
+ public static function main() {
+ $aTestRunner = new PHPUnit2_TextUI_TestRunner;
+
+ try {
+ $result = $aTestRunner->start($_SERVER['argv']);
+
+ if (!$result->wasSuccessful()) {
+ exit(self::FAILURE_EXIT);
+ }
+
+ exit(self::SUCCESS_EXIT);
+ }
+
+ catch (Exception $e) {
+ self::printVersionString();
+ print $e->getMessage();
+ exit(self::EXCEPTION_EXIT);
+ }
+ }
+
+ /**
+ * @param array $arguments
+ * @throws Exception
+ * @access protected
+ */
+ protected function start($arguments) {
+ $coverageDataFile = FALSE;
+ $coverageHTMLFile = FALSE;
+ $coverageTextFile = FALSE;
+ $testdoxHTMLFile = FALSE;
+ $testdoxTextFile = FALSE;
+ $xmlLogfile = FALSE;
+ $wait = FALSE;
+
+ $possibleOptions = array(
+ 'help',
+ 'loader=',
+ 'log-xml=',
+ 'skeleton',
+ 'testdox-html=',
+ 'testdox-text=',
+ 'version',
+ 'wait'
+ );
+
+ if (extension_loaded('xdebug')) {
+ $possibleOptions[] = 'coverage-data=';
+ $possibleOptions[] = 'coverage-html=';
+ $possibleOptions[] = 'coverage-text=';
+ }
+
+ $options = Console_Getopt::getopt(
+ $arguments,
+ '',
+ $possibleOptions
+ );
+
+ if (PEAR::isError($options)) {
+ $this->showError($options->getMessage());
+ }
+
+ $test = isset($options[1][0]) ? $options[1][0] : FALSE;
+ $testFile = isset($options[1][1]) ? $options[1][1] : $test . '.php';
+
+ foreach ($options[0] as $option) {
+ switch ($option[0]) {
+ case '--coverage-data': {
+ $coverageDataFile = $option[1];
+ }
+ break;
+
+ case '--coverage-html': {
+ $coverageHTMLFile = $option[1];
+ }
+ break;
+
+ case '--coverage-text': {
+ $coverageTextFile = $option[1];
+ }
+ break;
+
+ case '--help': {
+ $this->showHelp();
+ exit(self::SUCCESS_EXIT);
+ }
+ break;
+
+ case '--testdox-html': {
+ $testdoxHTMLFile = $option[1];
+ }
+ break;
+
+ case '--testdox-text': {
+ $testdoxTextFile = $option[1];
+ }
+ break;
+
+ case '--loader': {
+ if (!class_exists($option[1])) {
+ PHPUnit2_Util_Fileloader::checkAndLoad(
+ str_replace('_', '/', $option[1]) . '.php'
+ );
+ }
+
+ if (class_exists($option[1])) {
+ $class = new ReflectionClass($option[1]);
+
+ if ($class->implementsInterface('PHPUnit2_Runner_TestSuiteLoader') &&
+ $class->isInstantiable()) {
+ $this->loader = $class->newInstance();
+ }
+ }
+
+ if ($this->loader === NULL) {
+ $this->showError(
+ sprintf(
+ 'Could not use "%s" as loader.',
+
+ $option[1]
+ )
+ );
+ }
+ }
+ break;
+
+ case '--log-xml': {
+ $xmlLogfile = $option[1];
+ }
+ break;
+
+ case '--skeleton': {
+ if ($test !== FALSE) {
+ self::printVersionString();
+
+ try {
+ require_once 'PHPUnit2/Util/Skeleton.php';
+
+ $skeleton = new PHPUnit2_Util_Skeleton($test, $testFile);
+ $skeleton->write();
+ }
+
+ catch (Exception $e) {
+ print $e->getMessage() . "\n";
+
+ printf(
+ "Could not write test class skeleton for %s to %s.\n",
+ $test,
+ $test . 'Test.php'
+ );
+
+ exit(self::FAILURE_EXIT);
+ }
+
+ printf(
+ "Wrote test class skeleton for %s to %s.\n",
+ $test,
+ $test . 'Test.php'
+ );
+
+ exit(self::SUCCESS_EXIT);
+ }
+ }
+ break;
+
+ case '--version': {
+ self::printVersionString();
+ exit(self::SUCCESS_EXIT);
+ }
+ break;
+
+ case '--wait': {
+ $wait = TRUE;
+ }
+ break;
+ }
+ }
+
+ if ($test === FALSE) {
+ $this->showHelp();
+
+ exit(self::SUCCESS_EXIT);
+ }
+
+ try {
+ return $this->doRun(
+ $this->getTest($test, $testFile),
+ $coverageDataFile,
+ $coverageHTMLFile,
+ $coverageTextFile,
+ $testdoxHTMLFile,
+ $testdoxTextFile,
+ $xmlLogfile,
+ $wait
+ );
+ }
+
+ catch (Exception $e) {
+ throw new Exception(
+ 'Could not create and run test suite: ' . $e->getMessage()
+ );
+ }
+ }
+
+ /**
+ * @param mixed $test
+ * @param mixed $coverageDataFile
+ * @param mixed $testdoxHTMLFile
+ * @param mixed $testdoxTextFile
+ * @param mixed $xmlLogfile
+ * @param boolean $wait
+ * @access public
+ * @static
+ */
+ public static function run($test, $coverageDataFile = FALSE, $coverageHTMLFile = FALSE, $coverageTextFile = FALSE, $testdoxHTMLFile = FALSE, $testdoxTextFile = FALSE, $xmlLogfile = FALSE, $wait = FALSE) {
+ if ($test instanceof ReflectionClass) {
+ $test = new PHPUnit2_Framework_TestSuite($test);
+ }
+
+ if ($test instanceof PHPUnit2_Framework_Test) {
+ $aTestRunner = new PHPUnit2_TextUI_TestRunner;
+
+ return $aTestRunner->doRun(
+ $test,
+ $coverageDataFile,
+ $coverageHTMLFile,
+ $coverageTextFile,
+ $testdoxHTMLFile,
+ $testdoxTextFile,
+ $xmlLogfile,
+ $wait
+ );
+ }
+ }
+
+ /**
+ * Runs a single test and waits until the user types RETURN.
+ *
+ * @param PHPUnit2_Framework_Test $suite
+ * @access public
+ * @static
+ */
+ public static function runAndWait(PHPUnit2_Framework_Test $suite) {
+ $aTestRunner = new PHPUnit2_TextUI_TestRunner;
+
+ $aTestRunner->doRun(
+ $suite,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ FALSE,
+ TRUE
+ );
+ }
+
+ /**
+ * @return PHPUnit2_Framework_TestResult
+ * @access protected
+ */
+ protected function createTestResult() {
+ return new PHPUnit2_Framework_TestResult;
+ }
+
+ /**
+ * @param PHPUnit2_Framework_Test $suite
+ * @param mixed $coverageDataFile
+ * @param mixed $coverageHTMLFile
+ * @param mixed $coverageTextFile
+ * @param mixed $testdoxHTMLFile
+ * @param mixed $testdoxTextFile
+ * @param mixed $xmlLogfile
+ * @param boolean $wait
+ * @return PHPUnit2_Framework_TestResult
+ * @access public
+ */
+ public function doRun(PHPUnit2_Framework_Test $suite, $coverageDataFile = FALSE, $coverageHTMLFile = FALSE, $coverageTextFile = FALSE, $testdoxHTMLFile = FALSE, $testdoxTextFile = FALSE, $xmlLogfile = FALSE, $wait = FALSE) {
+ $result = $this->createTestResult();
+ $timer = new Benchmark_Timer;
+
+ if ($this->printer === NULL) {
+ $this->printer = new PHPUnit2_TextUI_ResultPrinter;
+ }
+
+ $this->printer->write(
+ PHPUnit2_Runner_Version::getVersionString() . "\n\n"
+ );
+
+ $result->addListener($this->printer);
+
+ if ($testdoxHTMLFile !== FALSE || $testdoxTextFile !== FALSE) {
+ require_once 'PHPUnit2/Util/TestDox/ResultPrinter.php';
+
+ if ($testdoxHTMLFile !== FALSE) {
+ $result->addListener(
+ PHPUnit2_Util_TestDox_ResultPrinter::factory(
+ 'HTML',
+ $testdoxHTMLFile
+ )
+ );
+ }
+
+ if ($testdoxTextFile !== FALSE) {
+ $result->addListener(
+ PHPUnit2_Util_TestDox_ResultPrinter::factory(
+ 'Text',
+ $testdoxTextFile
+ )
+ );
+ }
+ }
+
+ if ($xmlLogfile !== FALSE) {
+ require_once 'PHPUnit2/Util/Log/XML.php';
+
+ $result->addListener(
+ new PHPUnit2_Util_Log_XML($xmlLogfile)
+ );
+ }
+
+ if ($coverageDataFile !== FALSE ||
+ $coverageHTMLFile !== FALSE ||
+ $coverageTextFile !== FALSE) {
+ $result->collectCodeCoverageInformation(TRUE);
+ }
+
+ $timer->start();
+ $suite->run($result);
+ $timer->stop();
+ $timeElapsed = $timer->timeElapsed();
+
+ $this->pause($wait);
+
+ $this->printer->printResult($result, $timeElapsed);
+
+ $this->handleCodeCoverageInformation(
+ $result,
+ $coverageDataFile,
+ $coverageHTMLFile,
+ $coverageTextFile
+ );
+
+ return $result;
+ }
+
+ /**
+ * Returns the loader to be used.
+ *
+ * @return PHPUnit2_Runner_TestSuiteLoader
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function getLoader() {
+ if ($this->loader === NULL) {
+ $this->loader = new PHPUnit2_Runner_StandardTestSuiteLoader;
+ }
+
+ return $this->loader;
+ }
+
+ /**
+ * @param PHPUnit2_Framework_TestResult $result
+ * @param mixed $coverageDataFile
+ * @param mixed $coverageHTMLFile
+ * @param mixed $coverageTextFile
+ * @access protected
+ * @since Method available since Release 2.1.0
+ */
+ protected function handleCodeCoverageInformation(PHPUnit2_Framework_TestResult $result, $coverageDataFile, $coverageHTMLFile, $coverageTextFile) {
+ if ($coverageDataFile !== FALSE &&
+ $fp = fopen($coverageDataFile, 'w')) {
+ fputs($fp, serialize($result->getCodeCoverageInformation()));
+ fclose($fp);
+ }
+
+ if ($coverageHTMLFile !== FALSE || $coverageTextFile !== FALSE) {
+ require_once 'PHPUnit2/Util/CodeCoverage/Renderer.php';
+
+ if ($coverageHTMLFile !== FALSE) {
+ $renderer = PHPUnit2_Util_CodeCoverage_Renderer::factory(
+ 'HTML',
+ $result->getCodeCoverageInformation()
+ );
+
+ $renderer->renderToFile($coverageHTMLFile);
+ }
+
+ if ($coverageTextFile !== FALSE) {
+ $renderer = PHPUnit2_Util_CodeCoverage_Renderer::factory(
+ 'Text',
+ $result->getCodeCoverageInformation()
+ );
+
+ $renderer->renderToFile($coverageTextFile);
+ }
+ }
+ }
+
+ /**
+ * @access public
+ */
+ public function showError($message) {
+ self::printVersionString();
+ print $message . "\n";
+
+ exit(self::FAILURE_EXIT);
+ }
+
+ /**
+ * @access public
+ */
+ public function showHelp() {
+ self::printVersionString();
+ print "Usage: phpunit [switches] UnitTest [UnitTest.php]\n";
+
+ if (extension_loaded('xdebug')) {
+ print " --coverage-data <file> Write Code Coverage data in raw format to file.\n" .
+ " --coverage-html <file> Write Code Coverage data in HTML format to file.\n" .
+ " --coverage-text <file> Write Code Coverage data in text format to file.\n\n";
+ }
+
+ print " --testdox-html <file> Write agile documentation in HTML format to file.\n" .
+ " --testdox-text <file> Write agile documentation in Text format to file.\n" .
+ " --log-xml <file> Log test progress in XML format to file.\n\n";
+
+ print " --loader <loader> TestSuiteLoader implementation to use.\n\n" .
+ " --skeleton Generate skeleton UnitTest class for Unit in Unit.php.\n\n" .
+ " --wait Waits for a keystroke after each test.\n\n" .
+ " --help Prints this usage information.\n" .
+ " --version Prints the version and exits.\n";
+ }
+
+ /**
+ * @param boolean $wait
+ * @access protected
+ */
+ protected function pause($wait) {
+ if (!$wait) {
+ return;
+ }
+
+ $this->printer->printWaitPrompt();
+
+ fgets(STDIN);
+ }
+
+ /**
+ * @param PHPUnit2_TextUI_ResultPrinter $resultPrinter
+ * @access public
+ */
+ public function setPrinter(PHPUnit2_TextUI_ResultPrinter $resultPrinter) {
+ $this->printer = $resultPrinter;
+ }
+
+ /**
+ * A test started.
+ *
+ * @param string $testName
+ * @access public
+ */
+ public function testStarted($testName) {
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param string $testName
+ * @access public
+ */
+ public function testEnded($testName) {
+ }
+
+ /**
+ * A test failed.
+ *
+ * @param integer $status
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function testFailed($status, PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ }
+
+ /**
+ * Override to define how to handle a failed loading of
+ * a test suite.
+ *
+ * @param string $message
+ * @access protected
+ */
+ protected function runFailed($message) {
+ self::printVersionString();
+ print $message;
+ exit(self::FAILURE_EXIT);
+ }
+
+ /**
+ * @access private
+ * @since Method available since Release 2.2.0
+ */
+ private static function printVersionString() {
+ if (!self::$versionStringPrinted) {
+ print PHPUnit2_Runner_Version::getVersionString() . "\n\n";
+ self::$versionStringPrinted = TRUE;
+ }
+ }
+}
+
+if (PHPUnit2_MAIN_METHOD == 'PHPUnit2_TextUI_TestRunner::main') {
+ PHPUnit2_TextUI_TestRunner::main();
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php
new file mode 100644
index 00000000..cbcdda51
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer.php
@@ -0,0 +1,225 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Renderer.php,v 1.8.2.7 2006/02/25 17:02:23 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+/**
+ * Abstract base class for Code Coverage renderers.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ * @abstract
+ */
+abstract class PHPUnit2_Util_CodeCoverage_Renderer {
+ /**
+ * @var array
+ * @access protected
+ */
+ protected $codeCoverageInformation;
+
+ /**
+ * Constructor.
+ *
+ * @param array $codeCoverageInformation
+ * @access protected
+ */
+ protected function __construct($codeCoverageInformation) {
+ $this->codeCoverageInformation = $codeCoverageInformation;
+ }
+
+ /**
+ * Abstract Factory.
+ *
+ * @param string $rendererName
+ * @param array $codeCoverageInformation
+ * @throws Exception
+ * @access public
+ */
+ public function factory($rendererName, $codeCoverageInformation) {
+ require_once 'PHPUnit2/Util/CodeCoverage/Renderer/' . $rendererName . '.php';
+
+ $class = 'PHPUnit2_Util_CodeCoverage_Renderer_' . $rendererName;
+ return new $class($codeCoverageInformation);
+ }
+
+ /**
+ * Visualizes the result array of
+ * PHPUnit2_Framework_TestResult::getCodeCoverageInformation().
+ *
+ * @return string
+ * @access public
+ * @final
+ */
+ public final function render() {
+ $buffer = $this->header();
+
+ foreach ($this->getSummary() as $sourceFile => $executedLines) {
+ if (file_exists($sourceFile)) {
+ $buffer .= $this->startSourceFile($sourceFile);
+ $buffer .= $this->renderSourceFile(file($sourceFile), $executedLines);
+ $buffer .= $this->endSourceFile($sourceFile);
+ }
+ }
+
+ return $buffer . $this->footer();
+ }
+
+ /**
+ * Visualizes the result array of
+ * PHPUnit2_Framework_TestResult::getCodeCoverageInformation()
+ * and writes it to a file.
+ *
+ * @param string $filename
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function renderToFile($filename) {
+ if ($fp = fopen($filename, 'w')) {
+ fputs(
+ $fp,
+ $this->render()
+ );
+
+ fclose($fp);
+ }
+ }
+
+ /**
+ * Returns summarized Code Coverage data.
+ *
+ * Format of the result array:
+ *
+ * <code>
+ * array(
+ * "/tested/code.php" => array(
+ * linenumber => flag
+ * )
+ * )
+ * </code>
+ *
+ * flag > 0: line was executed.
+ * flag < 0: line is executable but was not executed.
+ *
+ * @return array
+ * @access protected
+ * @since Method available since Release 2.2.0
+ */
+ protected function getSummary() {
+ $summary = array();
+
+ foreach ($this->codeCoverageInformation as $testCaseName => $sourceFiles) {
+ foreach ($sourceFiles as $sourceFile => $executedLines) {
+ foreach ($executedLines as $lineNumber => $flag) {
+ if (!isset($summary[$sourceFile][$lineNumber])) {
+ $summary[$sourceFile][$lineNumber] = $flag;
+ }
+
+ else if ($flag > 0) {
+ $summary[$sourceFile][$lineNumber] = $flag;
+ }
+ }
+ }
+ }
+
+ return $summary;
+ }
+
+ /**
+ * @return string
+ * @access protected
+ * @since Method available since Release 2.1.1
+ */
+ protected function header() {
+ }
+
+ /**
+ * @return string
+ * @access protected
+ * @since Method available since Release 2.1.1
+ */
+ protected function footer() {
+ }
+
+ /**
+ * @param string $sourceFile
+ * @return string
+ * @access protected
+ */
+ protected function startSourceFile($sourceFile) {
+ }
+
+ /**
+ * @param string $sourceFile
+ * @return string
+ * @access protected
+ */
+ protected function endSourceFile($sourceFile) {
+ }
+
+ /**
+ * @param array $codeLines
+ * @param array $executedLines
+ * @return string
+ * @access protected
+ * @abstract
+ */
+ abstract protected function renderSourceFile($codeLines, $executedLines);
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php
new file mode 100644
index 00000000..66fc4d13
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/HTML.php
@@ -0,0 +1,191 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: HTML.php,v 1.7.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Util/CodeCoverage/Renderer.php';
+
+/**
+ * Renders Code Coverage information in HTML format.
+ *
+ * Formatting of the generated HTML can be achieved through
+ * CSS (codecoverage.css).
+ *
+ * Example
+ *
+ * <code>
+ * td.ccLineNumber, td.ccCoveredLine, td.ccUncoveredLine, td.ccNotExecutableLine {
+ * font-family: monospace;
+ * white-space: pre;
+ * }
+ *
+ * td.ccLineNumber, td.ccCoveredLine {
+ * background-color: #aaaaaa;
+ * }
+ *
+ * td.ccNotExecutableLine {
+ * color: #aaaaaa;
+ * }
+ * </code>
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_CodeCoverage_Renderer_HTML extends PHPUnit2_Util_CodeCoverage_Renderer {
+ const pageHeader =
+'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <link href="codecoverage.css" type="text/css" rel="stylesheet" />
+ </head>
+ <body>
+';
+
+ const pageFooter =
+' </body>
+</html>
+';
+
+ const sourceFileHeader =
+' <table style="border: 1px solid black" cellspacing="0" cellpadding="0" width="100%">
+';
+
+ const sourceFileFooter =
+' </table>
+';
+
+ const codeLine =
+' <tr><td class="ccLineNumber">%s</td><td class="%s">%s</td></tr>
+';
+
+ /**
+ * @return string
+ * @access protected
+ * @since Method available since Release 2.1.1
+ */
+ protected function header() {
+ return self::pageHeader;
+ }
+
+ /**
+ * @return string
+ * @access protected
+ * @since Method available since Release 2.1.1
+ */
+ protected function footer() {
+ return self::pageFooter;
+ }
+
+ /**
+ * @param string $sourceFile
+ * @return string
+ * @access protected
+ */
+ protected function startSourceFile($sourceFile) {
+ return self::sourceFileHeader;
+ }
+
+ /**
+ * @param string $sourceFile
+ * @return string
+ * @access protected
+ */
+ protected function endSourceFile($sourceFile) {
+ return self::sourceFileFooter;
+ }
+
+ /**
+ * @param array $codeLines
+ * @param array $executedLines
+ * @return string
+ * @access protected
+ */
+ protected function renderSourceFile($codeLines, $executedLines) {
+ $buffer = '';
+ $line = 1;
+
+ foreach ($codeLines as $codeLine) {
+ $lineStyle = 'ccNotExecutableLine';
+
+ if (isset($executedLines[$line])) {
+ if ($executedLines[$line] > 0) {
+ $lineStyle = 'ccCoveredLine';
+ } else {
+ $lineStyle = 'ccUncoveredLine';
+ }
+ }
+
+ $buffer .= sprintf(
+ self::codeLine,
+
+ $line,
+ $lineStyle,
+ htmlspecialchars(rtrim($codeLine))
+ );
+
+ $line++;
+ }
+
+ return $buffer;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php
new file mode 100644
index 00000000..6b083692
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/CodeCoverage/Renderer/Text.php
@@ -0,0 +1,125 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Text.php,v 1.6.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Util/CodeCoverage/Renderer.php';
+
+/**
+ * Renders Code Coverage information in text format.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_CodeCoverage_Renderer_Text extends PHPUnit2_Util_CodeCoverage_Renderer {
+ /**
+ * @param string $sourceFile
+ * @return string
+ * @access protected
+ */
+ protected function startSourceFile($sourceFile) {
+ return ' ' . $sourceFile . "\n\n";
+ }
+
+ /**
+ * @param string $sourceFile
+ * @return string
+ * @access protected
+ */
+ protected function endSourceFile($sourceFile) {
+ return "\n";
+ }
+
+ /**
+ * @param array $codeLines
+ * @param array $executedLines
+ * @return string
+ * @access protected
+ */
+ protected function renderSourceFile($codeLines, $executedLines) {
+ $buffer = '';
+ $line = 1;
+
+ foreach ($codeLines as $codeLine) {
+ $flag = '-';
+
+ if (isset($executedLines[$line])) {
+ if ($executedLines[$line] > 0) {
+ $flag = '+';
+ } else {
+ $flag = '#';
+ }
+ }
+
+ $buffer .= sprintf(
+ ' %4u|%s| %s',
+
+ $line,
+ $flag,
+ $codeLine
+ );
+
+ $line++;
+ }
+
+ return $buffer;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/ErrorHandler.php b/buildscripts/PHPUnit2/Util/ErrorHandler.php
new file mode 100644
index 00000000..ee724ffe
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/ErrorHandler.php
@@ -0,0 +1,77 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: ErrorHandler.php,v 1.1.2.2 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+/**
+ * @param integer $errno
+ * @param string $errstr
+ * @param string $errfile
+ * @param integer $errline
+ * @throws PHPUnit2_Framework_Error
+ * @since Function available since Release 2.3.0
+ */
+function PHPUnit2_Util_ErrorHandler($errno, $errstr, $errfile, $errline) {
+ $trace = debug_backtrace();
+ array_shift($trace);
+
+ throw new PHPUnit2_Framework_Error(
+ $errstr,
+ $errno,
+ $errfile,
+ $errline,
+ $trace
+ );
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/Fileloader.php b/buildscripts/PHPUnit2/Util/Fileloader.php
new file mode 100644
index 00000000..bdcd49ed
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/Fileloader.php
@@ -0,0 +1,109 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Fileloader.php,v 1.1.2.6 2005/12/19 05:43:56 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+/**
+ *
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.3.0
+ */
+class PHPUnit2_Util_Fileloader {
+ /**
+ * Checks if a PHP sourcefile is readable and contains no syntax errors.
+ * If that is the case, the sourcefile is loaded through include_once().
+ *
+ * @param string $filename
+ * @throws Exception
+ * @access public
+ * @static
+ */
+ public static function checkAndLoad($filename) {
+ if (!is_readable($filename)) {
+ $filename = './' . $filename;
+ }
+
+ if (!is_readable($filename)) {
+ throw new Exception(
+ sprintf(
+ '%s could not be found or is not readable.',
+
+ str_replace('./', '', $filename)
+ )
+ );
+ }
+
+ $output = shell_exec('php -l ' . escapeshellarg($filename));
+
+ if (strpos($output, 'No syntax errors detected in') === FALSE) {
+ throw new Exception(
+ sprintf(
+ 'Syntax error in %s.',
+
+ str_replace('./', '', $filename)
+ )
+ );
+ }
+
+ include_once $filename;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/Filter.php b/buildscripts/PHPUnit2/Util/Filter.php
new file mode 100644
index 00000000..70d055fd
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/Filter.php
@@ -0,0 +1,263 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Filter.php,v 1.32.2.5 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * Utility class for code filtering.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit2_Util_Filter {
+ /**
+ * Source files that are to be filtered.
+ *
+ * @var array
+ * @access protected
+ * @static
+ */
+ protected static $filteredFiles = array(
+ 'PHPUnit2/Extensions/ExceptionTestCase.php',
+ 'PHPUnit2/Extensions/PerformanceTestCase.php',
+ 'PHPUnit2/Extensions/RepeatedTest.php',
+ 'PHPUnit2/Extensions/TestDecorator.php',
+ 'PHPUnit2/Extensions/TestSetup.php',
+ 'PHPUnit2/Framework/Assert.php',
+ 'PHPUnit2/Framework/AssertionFailedError.php',
+ 'PHPUnit2/Framework/ComparisonFailure.php',
+ 'PHPUnit2/Framework/Error.php',
+ 'PHPUnit2/Framework/IncompleteTest.php',
+ 'PHPUnit2/Framework/IncompleteTestError.php',
+ 'PHPUnit2/Framework/Test.php',
+ 'PHPUnit2/Framework/TestCase.php',
+ 'PHPUnit2/Framework/TestFailure.php',
+ 'PHPUnit2/Framework/TestListener.php',
+ 'PHPUnit2/Framework/TestResult.php',
+ 'PHPUnit2/Framework/TestSuite.php',
+ 'PHPUnit2/Framework/Warning.php',
+ 'PHPUnit2/Runner/BaseTestRunner.php',
+ 'PHPUnit2/Runner/IncludePathTestCollector.php',
+ 'PHPUnit2/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit2/Runner/TestCollector.php',
+ 'PHPUnit2/Runner/TestSuiteLoader.php',
+ 'PHPUnit2/Runner/Version.php',
+ 'PHPUnit2/TextUI/ResultPrinter.php',
+ 'PHPUnit2/TextUI/TestRunner.php',
+ 'PHPUnit2/Util/CodeCoverage/Renderer/HTML.php',
+ 'PHPUnit2/Util/CodeCoverage/Renderer/Text.php',
+ 'PHPUnit2/Util/CodeCoverage/Renderer.php',
+ 'PHPUnit2/Util/Log/PEAR.php',
+ 'PHPUnit2/Util/Log/XML.php',
+ 'PHPUnit2/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit2/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit2/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit2/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit2/Util/ErrorHandler.php',
+ 'PHPUnit2/Util/Fileloader.php',
+ 'PHPUnit2/Util/Filter.php',
+ 'PHPUnit2/Util/Printer.php',
+ 'PHPUnit2/Util/Skeleton.php',
+ 'Benchmark/Timer.php',
+ 'Console/Getopt.php',
+ 'Log/composite.php',
+ 'Log/console.php',
+ 'Log/display.php',
+ 'Log/error.php',
+ 'Log/file.php',
+ 'Log/mail.php',
+ 'Log/mcal.php',
+ 'Log/null.php',
+ 'Log/observer.php',
+ 'Log/sql.php',
+ 'Log/sqlite.php',
+ 'Log/syslog.php',
+ 'Log/win.php',
+ 'Log.php',
+ 'PEAR/Config.php',
+ 'PEAR.php'
+ );
+
+ /**
+ * Adds a new file to be filtered.
+ *
+ * @param string
+ * @access public
+ * @static
+ * @since Method available since Release 2.1.0
+ */
+ public static function addFileToFilter($filename) {
+ $filename = self::getCanonicalFilename($filename);
+
+ if (!self::isFiltered($filename)) {
+ self::$filteredFiles[] = $filename;
+ }
+ }
+
+ /**
+ * Removes a file from the filter.
+ *
+ * @param string
+ * @access public
+ * @static
+ * @since Method available since Release 2.1.0
+ */
+ public static function removeFileFromFilter($filename) {
+ $filename = self::getCanonicalFilename($filename);
+ $keys = array_keys(self::$filteredFiles);
+
+ for ($i = 0; $i < sizeof($keys); $i++) {
+ if (self::$filteredFiles[$keys[$i]] == $filename) {
+ unset(self::$filteredFiles[$keys[$i]]);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Filters source lines from PHPUnit classes.
+ *
+ * @param array
+ * @return array
+ * @access public
+ * @static
+ */
+ public static function getFilteredCodeCoverage($codeCoverageInformation) {
+ $files = array_keys($codeCoverageInformation);
+
+ foreach ($files as $file) {
+ if (self::isFiltered($file)) {
+ unset($codeCoverageInformation[$file]);
+ }
+ }
+
+ return $codeCoverageInformation;
+ }
+
+ /**
+ * Filters stack frames from PHPUnit classes.
+ *
+ * @param Exception $e
+ * @return string
+ * @access public
+ * @static
+ */
+ public static function getFilteredStacktrace(Exception $e) {
+ $filteredStacktrace = '';
+ $stacktrace = $e->getTrace();
+
+ foreach ($stacktrace as $frame) {
+ $filtered = FALSE;
+
+ if (isset($frame['file']) && !self::isFiltered($frame['file'])) {
+ $filteredStacktrace .= sprintf(
+ "%s:%s\n",
+
+ $frame['file'],
+ isset($frame['line']) ? $frame['line'] : '?'
+ );
+ }
+ }
+
+ return $filteredStacktrace;
+ }
+
+ /**
+ * Canonicalizes a source file name.
+ *
+ * @param string $filename
+ * @return string
+ * @access protected
+ * @static
+ */
+ protected static function getCanonicalFilename($filename) {
+ foreach (array('PHPUnit2', 'Benchmark', 'Console', 'PEAR') as $package) {
+ $pos = strpos($filename, $package);
+
+ if ($pos !== FALSE) {
+ $filename = substr($filename, $pos);
+ break;
+ }
+ }
+
+ return str_replace(
+ '\\',
+ '/',
+ $filename
+ );
+ }
+
+ /**
+ * @param string $filename
+ * @return boolean
+ * @access protected
+ * @static
+ * @since Method available since Release 2.1.3
+ */
+ protected static function isFiltered($filename) {
+ if (substr($filename, -7) == 'phpunit' ||
+ in_array(self::getCanonicalFilename($filename), self::$filteredFiles)) {
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/Log/PEAR.php b/buildscripts/PHPUnit2/Util/Log/PEAR.php
new file mode 100644
index 00000000..368c4f54
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/Log/PEAR.php
@@ -0,0 +1,220 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: PEAR.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Framework/TestListener.php';
+
+@include_once 'Log.php';
+
+/**
+ * A TestListener that logs to a PEAR_Log sink.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_Log_PEAR implements PHPUnit2_Framework_TestListener {
+ /**
+ * Log.
+ *
+ * @var Log
+ * @access private
+ */
+ private $log;
+
+ /**
+ * @param string $type The type of concrete Log subclass to use.
+ * Currently, valid values are 'console',
+ * 'syslog', 'sql', 'file', and 'mcal'.
+ * @param string $name The name of the actually log file, table, or
+ * other specific store to use. Defaults to an
+ * empty string, with which the subclass will
+ * attempt to do something intelligent.
+ * @param string $ident The identity reported to the log system.
+ * @param array $conf A hash containing any additional configuration
+ * information that a subclass might need.
+ * @param int $maxLevel Maximum priority level at which to log.
+ * @access public
+ */
+ public function __construct($type, $name = '', $ident = '', $conf = array(), $maxLevel = PEAR_LOG_DEBUG) {
+ $this->log = Log::factory($type, $name, $ident, $conf, $maxLevel);
+ }
+
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->log->crit(
+ sprintf(
+ 'Test "%s" failed: %s',
+
+ $test->getName(),
+ $e->getMessage()
+ )
+ );
+ }
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ $this->log->err(
+ sprintf(
+ 'Test "%s" failed: %s',
+
+ $test->getName(),
+ $e->getMessage()
+ )
+ );
+ }
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->log->info(
+ sprintf(
+ 'Test "%s" incomplete: %s',
+
+ $test->getName(),
+ $e->getMessage()
+ )
+ );
+ }
+
+ /**
+ * A test suite started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ $this->log->info(
+ sprintf(
+ 'TestSuite "%s" started.',
+
+ $suite->getName()
+ )
+ );
+ }
+
+ /**
+ * A test suite ended.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ $this->log->info(
+ sprintf(
+ 'TestSuite "%s" ended.',
+
+ $suite->getName()
+ )
+ );
+ }
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test) {
+ $this->log->info(
+ sprintf(
+ 'Test "%s" started.',
+
+ $test->getName()
+ )
+ );
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test) {
+ $this->log->info(
+ sprintf(
+ 'Test "%s" ended.',
+
+ $test->getName()
+ )
+ );
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/Log/XML.php b/buildscripts/PHPUnit2/Util/Log/XML.php
new file mode 100644
index 00000000..ce528753
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/Log/XML.php
@@ -0,0 +1,356 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: XML.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Framework/TestListener.php';
+require_once 'PHPUnit2/Util/Filter.php';
+require_once 'PHPUnit2/Util/Printer.php';
+
+require_once 'Benchmark/Timer.php';
+
+/**
+ * A TestListener that generates an XML-based logfile
+ * of the test execution.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_Log_XML extends PHPUnit2_Util_Printer implements PHPUnit2_Framework_TestListener {
+ /**
+ * @var DOMDocument
+ * @access private
+ */
+ private $document;
+
+ /**
+ * @var DOMElement
+ * @access private
+ */
+ private $root;
+
+ /**
+ * @var boolean
+ * @access private
+ */
+ private $writeDocument = TRUE;
+
+ /**
+ * @var DOMElement[]
+ * @access private
+ */
+ private $testSuites = array();
+
+ /**
+ * @var integer[]
+ * @access private
+ */
+ private $testSuiteTests = array(0);
+
+ /**
+ * @var integer[]
+ * @access private
+ */
+ private $testSuiteErrors = array(0);
+
+ /**
+ * @var integer[]
+ * @access private
+ */
+ private $testSuiteFailures = array(0);
+
+ /**
+ * @var integer[]
+ * @access private
+ */
+ private $testSuiteTimes = array(0);
+
+ /**
+ * @var integer
+ * @access private
+ */
+ private $testSuiteLevel = 0;
+
+ /**
+ * @var DOMElement
+ * @access private
+ */
+ private $currentTestCase = NULL;
+
+ /**
+ * @var Benchmark_Timer
+ * @access private
+ */
+ private $timer;
+
+ /**
+ * Constructor.
+ *
+ * @param mixed $out
+ * @access public
+ */
+ public function __construct($out = NULL) {
+ $this->document = new DOMDocument('1.0', 'UTF-8');
+ $this->document->formatOutput = TRUE;
+
+ $this->root = $this->document->createElement('testsuites');
+ $this->document->appendChild($this->root);
+
+ $this->timer = new Benchmark_Timer;
+
+ parent::__construct($out);
+ }
+
+ /**
+ * Destructor.
+ *
+ * @access public
+ */
+ public function __destruct() {
+ if ($this->writeDocument === TRUE) {
+ $this->write($this->getXML());
+ }
+
+ parent::__destruct();
+ }
+
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e) {
+ $error = $this->document->createElement('error', PHPUnit2_Util_Filter::getFilteredStacktrace($e));
+ $error->setAttribute('message', $e->getMessage());
+ $error->setAttribute('type', get_class($e));
+
+ $this->currentTestCase->appendChild($error);
+
+ $this->testSuiteErrors[$this->testSuiteLevel]++;
+ }
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ $failure = $this->document->createElement('failure', PHPUnit2_Util_Filter::getFilteredStacktrace($e));
+ $failure->setAttribute('message', $e->getMessage());
+ $failure->setAttribute('type', get_class($e));
+
+ $this->currentTestCase->appendChild($failure);
+
+ $this->testSuiteFailures[$this->testSuiteLevel]++;
+ }
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) {
+ $error = $this->document->createElement('error', PHPUnit2_Util_Filter::getFilteredStacktrace($e));
+ $error->setAttribute('message', 'Incomplete Test');
+ $error->setAttribute('type', get_class($e));
+
+ $this->currentTestCase->appendChild($error);
+
+ $this->testSuiteErrors[$this->testSuiteLevel]++;
+ }
+
+ /**
+ * A testsuite started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ $testSuite = $this->document->createElement('testsuite');
+ $testSuite->setAttribute('name', $suite->getName());
+
+ try {
+ $class = new ReflectionClass($suite->getName());
+ $docComment = $class->getDocComment();
+
+ if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) {
+ $testSuite->setAttribute('category', $matches[1]);
+ }
+
+ if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) {
+ $testSuite->setAttribute('package', $matches[1]);
+ }
+
+ if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) {
+ $testSuite->setAttribute('subpackage', $matches[1]);
+ }
+ }
+
+ catch (ReflectionException $e) {
+ }
+
+ if ($this->testSuiteLevel > 0) {
+ $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite);
+ } else {
+ $this->root->appendChild($testSuite);
+ }
+
+ $this->testSuiteLevel++;
+ $this->testSuites[$this->testSuiteLevel] = $testSuite;
+ $this->testSuiteTests[$this->testSuiteLevel] = 0;
+ $this->testSuiteErrors[$this->testSuiteLevel] = 0;
+ $this->testSuiteFailures[$this->testSuiteLevel] = 0;
+ $this->testSuiteTimes[$this->testSuiteLevel] = 0;
+ }
+
+ /**
+ * A testsuite ended.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ $this->testSuites[$this->testSuiteLevel]->setAttribute('tests', $this->testSuiteTests[$this->testSuiteLevel]);
+ $this->testSuites[$this->testSuiteLevel]->setAttribute('failures', $this->testSuiteFailures[$this->testSuiteLevel]);
+ $this->testSuites[$this->testSuiteLevel]->setAttribute('errors', $this->testSuiteErrors[$this->testSuiteLevel]);
+ $this->testSuites[$this->testSuiteLevel]->setAttribute('time', $this->testSuiteTimes[$this->testSuiteLevel]);
+
+ if ($this->testSuiteLevel > 1) {
+ $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel];
+ $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel];
+ $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel];
+ $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel];
+ }
+
+ $this->testSuiteLevel--;
+ }
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test) {
+ $testCase = $this->document->createElement('testcase');
+ $testCase->setAttribute('name', $test->getName());
+ $testCase->setAttribute('class', get_class($test));
+
+ $this->testSuites[$this->testSuiteLevel]->appendChild($testCase);
+ $this->currentTestCase = $testCase;
+
+ $this->testSuiteTests[$this->testSuiteLevel]++;
+
+ $this->timer->start();
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test) {
+ $this->timer->stop();
+ $time = $this->timer->timeElapsed();
+
+ $this->currentTestCase->setAttribute('time', $time);
+ $this->testSuiteTimes[$this->testSuiteLevel] += $time;
+
+ $this->currentTestCase = NULL;
+ }
+
+ /**
+ * Returns the XML as a string.
+ *
+ * @return string
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function getXML() {
+ return $this->document->saveXML();
+ }
+
+ /**
+ * Enables or disables the writing of the document
+ * in __destruct().
+ *
+ * This is a "hack" needed for the integration of
+ * PHPUnit with Phing.
+ *
+ * @return string
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function setWriteDocument($flag) {
+ if (is_bool($flag)) {
+ $this->writeDocument = $flag;
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/Printer.php b/buildscripts/PHPUnit2/Util/Printer.php
new file mode 100644
index 00000000..13dc46a9
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/Printer.php
@@ -0,0 +1,116 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Printer.php,v 1.10.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.0.0
+ */
+
+/**
+ * Utility class that can print to STDOUT or write to a file.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.0.0
+ * @abstract
+ */
+abstract class PHPUnit2_Util_Printer {
+ /**
+ * @var resource
+ * @access private
+ */
+ private $out = NULL;
+
+ /**
+ * Constructor.
+ *
+ * @param mixed $out
+ * @access public
+ */
+ public function __construct($out = NULL) {
+ if ($out !== NULL) {
+ if (is_string($out)) {
+ $this->out = fopen($out, 'w');
+ } else {
+ $this->out = $out;
+ }
+ }
+ }
+
+ /**
+ * Destructor.
+ *
+ * @access public
+ */
+ public function __destruct() {
+ if ($this->out !== NULL) {
+ fclose($this->out);
+ }
+ }
+
+ /**
+ * @param string $buffer
+ * @access public
+ */
+ public function write($buffer) {
+ if ($this->out !== NULL) {
+ fputs($this->out, $buffer);
+ } else {
+ print $buffer;
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/Skeleton.php b/buildscripts/PHPUnit2/Util/Skeleton.php
new file mode 100644
index 00000000..39717557
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/Skeleton.php
@@ -0,0 +1,340 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Skeleton.php,v 1.24.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.1.0
+ */
+
+/**
+ * Class for creating a PHPUnit2_Framework_TestCase skeleton file.
+ *
+ * This class will take a classname as a parameter on construction and will
+ * create a PHP file that contains the skeleton of a PHPUnit2_Framework_TestCase
+ * subclass.
+ *
+ * <code>
+ * <?php
+ * require_once 'PHPUnit2/Util/Skeleton.php';
+ *
+ * $skeleton = new PHPUnit2_Util_Skeleton(
+ * 'PHPUnit2_Util_Skeleton',
+ * 'PHPUnit2/Util/Skeleton.php'
+ * );
+ *
+ * $skeleton->write();
+ * ?>
+ * </code>
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_Skeleton {
+ protected $templateClassHeader =
+'<?php
+// Call {className}Test::main() if this source file is executed directly.
+if (!defined("PHPUnit2_MAIN_METHOD")) {
+ define("PHPUnit2_MAIN_METHOD", "{className}Test::main");
+}
+
+require_once "PHPUnit2/Framework/TestCase.php";
+require_once "PHPUnit2/Framework/TestSuite.php";
+
+// You may remove the following line when all tests have been implemented.
+require_once "PHPUnit2/Framework/IncompleteTestError.php";
+
+require_once "{classFile}";
+
+/**
+ * Test class for {className}.
+ * Generated by PHPUnit2_Util_Skeleton on {date} at {time}.
+ */
+class {className}Test extends PHPUnit2_Framework_TestCase {
+ /**
+ * Runs the test methods of this class.
+ *
+ * @access public
+ * @static
+ */
+ public static function main() {
+ require_once "PHPUnit2/TextUI/TestRunner.php";
+
+ $suite = new PHPUnit2_Framework_TestSuite("{className}Test");
+ $result = PHPUnit2_TextUI_TestRunner::run($suite);
+ }
+
+ /**
+ * Sets up the fixture, for example, open a network connection.
+ * This method is called before a test is executed.
+ *
+ * @access protected
+ */
+ protected function setUp() {
+ }
+
+ /**
+ * Tears down the fixture, for example, close a network connection.
+ * This method is called after a test is executed.
+ *
+ * @access protected
+ */
+ protected function tearDown() {
+ }
+';
+
+ protected $templateClassFooter =
+'}
+
+// Call {className}Test::main() if this source file is executed directly.
+if (PHPUnit2_MAIN_METHOD == "{className}Test::main") {
+ {className}Test::main();
+}
+?>
+';
+
+ protected $templateMethod =
+'
+ /**
+ * @todo Implement test{methodName}().
+ */
+ public function test{methodName}() {
+ // Remove the following line when you implement this test.
+ throw new PHPUnit2_Framework_IncompleteTestError;
+ }
+';
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $className;
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $classSourceFile;
+
+ /**
+ * Constructor.
+ *
+ * @param string $className
+ * @param string $classSourceFile
+ * @throws Exception
+ * @access public
+ */
+ public function __construct($className, $classSourceFile = '') {
+ if ($classSourceFile == '') {
+ $classSourceFile = $className . '.php';
+ }
+
+ if (file_exists($classSourceFile)) {
+ $this->classSourceFile = $classSourceFile;
+ } else {
+ throw new Exception(
+ sprintf(
+ 'Could not open %s.',
+
+ $classSourceFile
+ )
+ );
+ }
+
+ @include_once $this->classSourceFile;
+
+ if (class_exists($className)) {
+ $this->className = $className;
+ } else {
+ throw new Exception(
+ sprintf(
+ 'Could not find class "%s" in %s.',
+
+ $className,
+ $classSourceFile
+ )
+ );
+ }
+ }
+
+ /**
+ * Generates the test class' source.
+ *
+ * @return string
+ * @access public
+ */
+ public function generate() {
+ $testClassSource = $this->testClassHeader($this->className, $this->classSourceFile);
+
+ $class = new ReflectionClass($this->className);
+
+ foreach ($class->getMethods() as $method) {
+ if (!$method->isConstructor() &&
+ !$method->isAbstract() &&
+ $method->isUserDefined() &&
+ $method->isPublic() &&
+ $method->getDeclaringClass()->getName() == $this->className) {
+ $testClassSource .= $this->testMethod($method->getName());
+ }
+ }
+
+ $testClassSource .= $this->testClassFooter($this->className);
+
+ return $testClassSource;
+ }
+
+ /**
+ * Generates the test class and writes it to a source file.
+ *
+ * @param string $file
+ * @access public
+ */
+ public function write($file = '') {
+ if ($file == '') {
+ $file = $this->className . 'Test.php';
+ }
+
+ if ($fp = @fopen($file, 'w')) {
+ @fputs($fp, $this->generate());
+ @fclose($fp);
+ }
+ }
+
+ /**
+ * Sets the templates for class header, class footer, and method.
+ *
+ * @param string $classHeader
+ * @param string $classFooter
+ * @param string $method
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function setTemplates($classHeader, $classFooter, $method) {
+ if (is_file($classHeader)) {
+ $this->templateClassHeader = file_get_contents($classHeader);
+ } else {
+ $this->templateClassHeader = $classHeader;
+ }
+
+ if (is_file($classFooter)) {
+ $this->templateClassFooter = file_get_contents($classFooter);
+ } else {
+ $this->templateClassFooter = $classFooter;
+ }
+
+ if (is_file($method)) {
+ $this->templateMethod = file_get_contents($method);
+ } else {
+ $this->templateMethod = $method;
+ }
+ }
+
+ /**
+ * @param string $className
+ * @param string $classSourceFile
+ * @access protected
+ */
+ protected function testClassHeader($className, $classSourceFile) {
+ return str_replace(
+ array(
+ '{className}',
+ '{classFile}',
+ '{date}',
+ '{time}'
+ ),
+ array(
+ $className,
+ $classSourceFile,
+ date('Y-m-d'),
+ date('H:i:s')
+ ),
+ $this->templateClassHeader
+ );
+ }
+
+ /**
+ * @param string $className
+ * @access protected
+ */
+ protected function testClassFooter($className) {
+ return str_replace(
+ array(
+ '{className}'
+ ),
+ array(
+ $className
+ ),
+ $this->templateClassFooter
+ );
+ }
+
+ /**
+ * @param string $methodName
+ * @access protected
+ */
+ protected function testMethod($methodName) {
+ return str_replace(
+ array(
+ '{methodName}'
+ ),
+ array(
+ ucfirst($methodName)
+ ),
+ $this->templateMethod
+ );
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php b/buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php
new file mode 100644
index 00000000..1d686dc8
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/TestDox/NamePrettifier.php
@@ -0,0 +1,165 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: NamePrettifier.php,v 1.2.2.2 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+/**
+ * Prettifies class and method names for use in TestDox documentation.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_TestDox_NamePrettifier {
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $prefix = 'Test';
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $suffix = 'Test';
+
+ /**
+ * Tests if a method is a test method.
+ *
+ * @param string $testMethodName
+ * @return boolean
+ * @access public
+ */
+ public function isATestMethod($testMethodName) {
+ if (substr($testMethodName, 0, 4) == 'test') {
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+ /**
+ * Prettifies the name of a test class.
+ *
+ * @param string $testClassName
+ * @return string
+ * @access public
+ */
+ public function prettifyTestClass($testClassName) {
+ $title = $testClassName;
+
+ if ($this->suffix !== NULL &&
+ $this->suffix == substr($testClassName, -1 * strlen($this->suffix))) {
+ $title = substr($title, 0, strripos($title, $this->suffix));
+ }
+
+ if ($this->prefix !== NULL &&
+ $this->prefix == substr($testClassName, 0, strlen($this->prefix))) {
+ $title = substr($title, strlen($this->prefix));
+ }
+
+ return $title;
+ }
+
+ /**
+ * Prettifies the name of a test method.
+ *
+ * @param string $testMethodName
+ * @return string
+ * @access public
+ */
+ public function prettifyTestMethod($testMethodName) {
+ $buffer = '';
+
+ $testMethodName = preg_replace('#\d+$#', '', $testMethodName);
+
+ for ($i = 4; $i < strlen($testMethodName); $i++) {
+ if ($i > 4 &&
+ ord($testMethodName[$i]) >= 65 &&
+ ord($testMethodName[$i]) <= 90) {
+ $buffer .= ' ' . strtolower($testMethodName[$i]);
+ } else {
+ $buffer .= $testMethodName[$i];
+ }
+ }
+
+ return $buffer;
+ }
+
+ /**
+ * Sets the prefix of test names.
+ *
+ * @param string $prefix
+ * @access public
+ */
+ public function setPrefix($prefix) {
+ $this->prefix = $prefix;
+ }
+
+ /**
+ * Sets the suffix of test names.
+ *
+ * @param string $prefix
+ * @access public
+ */
+ public function setSuffix($suffix) {
+ $this->suffix = $suffix;
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php
new file mode 100644
index 00000000..274c7309
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter.php
@@ -0,0 +1,299 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: ResultPrinter.php,v 1.2.2.6 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Framework/TestListener.php';
+require_once 'PHPUnit2/Util/TestDox/NamePrettifier.php';
+require_once 'PHPUnit2/Util/Printer.php';
+
+/**
+ * Base class for printers of TestDox documentation.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ * @abstract
+ */
+abstract class PHPUnit2_Util_TestDox_ResultPrinter extends PHPUnit2_Util_Printer implements PHPUnit2_Framework_TestListener {
+ /**
+ * @var PHPUnit2_Util_TestDox_NamePrettifier
+ * @access protected
+ */
+ protected $prettifier;
+
+ /**
+ * @var string
+ * @access protected
+ */
+ protected $testClass = '';
+
+ /**
+ * @var boolean
+ * @access protected
+ */
+ protected $testFailed = FALSE;
+
+ /**
+ * @var array
+ * @access protected
+ */
+ protected $tests = array();
+
+ /**
+ * Constructor.
+ *
+ * @param resource $out
+ * @access public
+ */
+ public function __construct($out = NULL) {
+ parent::__construct($out);
+
+ $this->prettifier = new PHPUnit2_Util_TestDox_NamePrettifier;
+ $this->startRun();
+ }
+
+ /**
+ * Destructor.
+ *
+ * @access public
+ */
+ public function __destruct() {
+ $this->doEndClass();
+ $this->endRun();
+
+ parent::__destruct();
+ }
+
+ /**
+ * Abstract Factory.
+ *
+ * @param string $type
+ * @param resource $out
+ * @throws Exception
+ * @access public
+ * @static
+ */
+ public static function factory($type, $out = NULL) {
+ require_once 'PHPUnit2/Util/TestDox/ResultPrinter/' . $type . '.php';
+
+ $class = 'PHPUnit2_Util_TestDox_ResultPrinter_' . $type;
+ return new $class($out);
+ }
+
+ /**
+ * An error occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addError(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->testFailed = TRUE;
+ }
+
+ /**
+ * A failure occurred.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param PHPUnit2_Framework_AssertionFailedError $e
+ * @access public
+ */
+ public function addFailure(PHPUnit2_Framework_Test $test, PHPUnit2_Framework_AssertionFailedError $e) {
+ $this->testFailed = TRUE;
+ }
+
+ /**
+ * Incomplete test.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @param Exception $e
+ * @access public
+ */
+ public function addIncompleteTest(PHPUnit2_Framework_Test $test, Exception $e) {
+ $this->testFailed = TRUE;
+ }
+
+ /**
+ * A testsuite started.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ }
+
+ /**
+ * A testsuite ended.
+ *
+ * @param PHPUnit2_Framework_TestSuite $suite
+ * @access public
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit2_Framework_TestSuite $suite) {
+ }
+
+ /**
+ * A test started.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function startTest(PHPUnit2_Framework_Test $test) {
+ $class = get_class($test);
+
+ if ($this->testClass != $class) {
+ if ($this->testClass != '') {
+ $this->doEndClass();
+ }
+
+ $this->startClass($this->prettifier->prettifyTestClass($class));
+
+ $this->testClass = $class;
+ $this->tests = array();
+ }
+
+ $this->testFailed = FALSE;
+ }
+
+ /**
+ * A test ended.
+ *
+ * @param PHPUnit2_Framework_Test $test
+ * @access public
+ */
+ public function endTest(PHPUnit2_Framework_Test $test) {
+ $prettifiedName = $this->prettifier->prettifyTestMethod($test->getName());
+
+ if (!isset($this->tests[$prettifiedName])) {
+ if (!$this->testFailed) {
+ $this->tests[$prettifiedName]['success'] = 1;
+ $this->tests[$prettifiedName]['failure'] = 0;
+ } else {
+ $this->tests[$prettifiedName]['success'] = 0;
+ $this->tests[$prettifiedName]['failure'] = 1;
+ }
+ } else {
+ if (!$this->testFailed) {
+ $this->tests[$prettifiedName]['success']++;
+ } else {
+ $this->tests[$prettifiedName]['failure']++;
+ }
+ }
+ }
+
+ /**
+ * @access private
+ * @since Method available since Release 2.3.0
+ */
+ private function doEndClass() {
+ foreach ($this->tests as $name => $data) {
+ if ($data['failure'] == 0) {
+ $this->onTest($name);
+ }
+ }
+
+ $this->endClass($this->prettifier->prettifyTestClass($this->testClass));
+ }
+
+ /**
+ * Handler for 'start run' event.
+ *
+ * @access protected
+ */
+ protected function startRun() {
+ }
+
+ /**
+ * Handler for 'start class' event.
+ *
+ * @param string $name
+ * @access protected
+ * @abstract
+ */
+ abstract protected function startClass($name);
+
+ /**
+ * Handler for 'on test' event.
+ *
+ * @param string $name
+ * @access protected
+ * @abstract
+ */
+ abstract protected function onTest($name);
+
+ /**
+ * Handler for 'end class' event.
+ *
+ * @param string $name
+ * @access protected
+ * @abstract
+ */
+ abstract protected function endClass($name);
+
+ /**
+ * Handler for 'end run' event.
+ *
+ * @access protected
+ */
+ protected function endRun() {
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php
new file mode 100644
index 00000000..505ec60d
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/HTML.php
@@ -0,0 +1,120 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: HTML.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Util/TestDox/ResultPrinter.php';
+
+/**
+ * Prints TestDox documentation in HTML format.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_TestDox_ResultPrinter_HTML extends PHPUnit2_Util_TestDox_ResultPrinter {
+ /**
+ * Handler for 'start run' event.
+ *
+ * @access protected
+ */
+ protected function startRun() {
+ $this->write('<html><body>');
+ }
+
+ /**
+ * Handler for 'start class' event.
+ *
+ * @param string $name
+ * @access protected
+ */
+ protected function startClass($name) {
+ $this->write('<h2>' . $name . '</h2><ul>');
+ }
+
+ /**
+ * Handler for 'on test' event.
+ *
+ * @param string $name
+ * @access protected
+ */
+ protected function onTest($name) {
+ $this->write('<li>' . $name . '</li>');
+ }
+
+ /**
+ * Handler for 'end class' event.
+ *
+ * @param string $name
+ * @access protected
+ */
+ protected function endClass($name) {
+ $this->write('</ul>');
+ }
+
+ /**
+ * Handler for 'end run' event.
+ *
+ * @access protected
+ */
+ protected function endRun() {
+ $this->write('</body></html>');
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php
new file mode 100644
index 00000000..cd12e525
--- /dev/null
+++ b/buildscripts/PHPUnit2/Util/TestDox/ResultPrinter/Text.php
@@ -0,0 +1,102 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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 PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version CVS: $Id: Text.php,v 1.2.2.3 2005/12/17 16:04:58 sebastian Exp $
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit2/Util/TestDox/ResultPrinter.php';
+
+/**
+ * Prints TestDox documentation in text format.
+ *
+ * @category Testing
+ * @package PHPUnit2
+ * @author Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2002-2006 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PHPUnit2
+ * @since Class available since Release 2.1.0
+ */
+class PHPUnit2_Util_TestDox_ResultPrinter_Text extends PHPUnit2_Util_TestDox_ResultPrinter {
+ /**
+ * Handler for 'start class' event.
+ *
+ * @param string $name
+ * @access protected
+ */
+ protected function startClass($name) {
+ $this->write($name . "\n");
+ }
+
+ /**
+ * Handler for 'on test' event.
+ *
+ * @param string $name
+ * @access protected
+ */
+ protected function onTest($name) {
+ $this->write(' - ' . $name . "\n");
+ }
+
+ /**
+ * Handler for 'end class' event.
+ *
+ * @param string $name
+ * @access protected
+ */
+ protected function endClass($name) {
+ $this->write("\n");
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * c-hanging-comment-ender-p: nil
+ * End:
+ */
+?>
diff --git a/buildscripts/PHPUnit2/pear-phpunit b/buildscripts/PHPUnit2/pear-phpunit
new file mode 100644
index 00000000..25e8944d
--- /dev/null
+++ b/buildscripts/PHPUnit2/pear-phpunit
@@ -0,0 +1,41 @@
+#!@php_bin@
+<?php
+/* PHP Version 5
+ *
+ * Copyright (c) 2002-2006, 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, STRIC
+ * 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.
+ *
+ * $Id: pear-phpunit,v 1.2.8.2 2005/12/17 16:04:56 sebastian Exp $
+ */
+
+require 'PHPUnit2/TextUI/TestRunner.php';
+?>
diff --git a/buildscripts/PHPUnit2/pear-phpunit.bat b/buildscripts/PHPUnit2/pear-phpunit.bat
new file mode 100644
index 00000000..d7aadb5c
--- /dev/null
+++ b/buildscripts/PHPUnit2/pear-phpunit.bat
@@ -0,0 +1,39 @@
+@echo off
+REM PHP Version 5
+REM
+REM Copyright (c) 2002-2006, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+REM All rights reserved.
+REM
+REM Redistribution and use in source and binary forms, with or without
+REM modification, are permitted provided that the following conditions
+REM are met:
+REM
+REM * Redistributions of source code must retain the above copyright
+REM notice, this list of conditions and the following disclaimer.
+REM
+REM * Redistributions in binary form must reproduce the above copyright
+REM notice, this list of conditions and the following disclaimer in
+REM the documentation and/or other materials provided with the
+REM distribution.
+REM
+REM * Neither the name of Sebastian Bergmann nor the names of his
+REM contributors may be used to endorse or promote products derived
+REM from this software without specific prior written permission.
+REM
+REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+REM FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+REM COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+REM INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+REM BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+REM LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+REM CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+REM LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+REM ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+REM POSSIBILITY OF SUCH DAMAGE.
+REM
+REM $Id: pear-phpunit.bat,v 1.3.2.2 2005/12/17 16:04:56 sebastian Exp $
+REM
+
+"@php_bin@" "@php_dir@/PHPUnit2/TextUI/TestRunner.php" %*