diff --git a/.travis.yml b/.travis.yml index eac15fc90..e416c915c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,10 @@ php: - 7.1 env: - - DB=mysql + matrix: + - DB=mysql + global: + - PHPUNIT=3.7.33 services: - memcached @@ -17,6 +20,9 @@ services: matrix: fast_finish: true include: + - php: 5.3 + env: DB=mysql PHPUNIT=4.8.35 + - php: 5.4 env: DB=pgsql @@ -28,8 +34,8 @@ matrix: before_script: - - sh -c "composer global require 'phpunit/phpunit=3.7.33'" - - sh -c "ln -s ~/.composer/vendor/phpunit/phpunit/PHPUnit ./vendors/PHPUnit" + - composer global require "phpunit/phpunit=$PHPUNIT" + - echo "require_once '$HOME/.composer/vendor/autoload.php';" >> app/Config/bootstrap.php - sudo locale-gen de_DE - sudo locale-gen es_ES - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'CREATE DATABASE cakephp_test;'; fi" diff --git a/lib/Cake/Console/ConsoleInputArgument.php b/lib/Cake/Console/ConsoleInputArgument.php index 08dbc21e9..4f7c726d8 100644 --- a/lib/Cake/Console/ConsoleInputArgument.php +++ b/lib/Cake/Console/ConsoleInputArgument.php @@ -159,7 +159,7 @@ class ConsoleInputArgument { $option = $parent->addChild('argument'); $option->addAttribute('name', $this->_name); $option->addAttribute('help', $this->_help); - $option->addAttribute('required', $this->isRequired()); + $option->addAttribute('required', (int)$this->isRequired()); $choices = $option->addChild('choices'); foreach ($this->_choices as $valid) { $choices->addChild('choice', $valid); diff --git a/lib/Cake/Console/ConsoleInputOption.php b/lib/Cake/Console/ConsoleInputOption.php index 3a4b7a1c9..2d97462ea 100644 --- a/lib/Cake/Console/ConsoleInputOption.php +++ b/lib/Cake/Console/ConsoleInputOption.php @@ -205,10 +205,11 @@ class ConsoleInputOption { $option->addAttribute('name', '--' . $this->_name); $short = ''; if (strlen($this->_short)) { - $short = $this->_short; + $short = '-' . $this->_short; } - $option->addAttribute('short', '-' . $short); - $option->addAttribute('boolean', $this->_boolean); + $option->addAttribute('short', $short); + $option->addAttribute('help', $this->_help); + $option->addAttribute('boolean', (int)$this->_boolean); $option->addChild('default', $this->_default); $choices = $option->addChild('choices'); foreach ($this->_choices as $valid) { diff --git a/lib/Cake/Console/HelpFormatter.php b/lib/Cake/Console/HelpFormatter.php index 3a8fac98f..422b7cb49 100644 --- a/lib/Cake/Console/HelpFormatter.php +++ b/lib/Cake/Console/HelpFormatter.php @@ -182,7 +182,6 @@ class HelpFormatter { $xml->addChild('command', $parser->command()); $xml->addChild('description', $parser->description()); - $xml->addChild('epilog', $parser->epilog()); $subcommands = $xml->addChild('subcommands'); foreach ($parser->subcommands() as $command) { $command->xml($subcommands); @@ -195,6 +194,7 @@ class HelpFormatter { foreach ($parser->arguments() as $argument) { $argument->xml($arguments); } + $xml->addChild('epilog', $parser->epilog()); return $string ? $xml->asXml() : $xml; } diff --git a/lib/Cake/Test/Case/Console/HelpFormatterTest.php b/lib/Cake/Test/Case/Console/HelpFormatterTest.php index 77375f63b..14eee59eb 100644 --- a/lib/Cake/Test/Case/Console/HelpFormatterTest.php +++ b/lib/Cake/Test/Case/Console/HelpFormatterTest.php @@ -299,8 +299,8 @@ TEXT; $expected = << -mycommand -Description text +mycommand + TEXT; - $this->assertEquals(new DomDocument($expected), new DomDocument($result), 'Help does not match'); + $this->assertXmlStringEqualsXmlString($expected, $result, 'Help does not match'); } /** @@ -346,7 +349,7 @@ TEXT; $expected = << -mycommand +mycommand Description text @@ -367,7 +370,7 @@ TEXT; epilog text TEXT; - $this->assertEquals(new DomDocument($expected), new DomDocument($result), 'Help does not match'); + $this->assertXmlStringEqualsXmlString($expected, $result, 'Help does not match'); } /** @@ -385,7 +388,7 @@ TEXT; $expected = << -mycommand +mycommand @@ -404,7 +407,7 @@ TEXT; TEXT; - $this->assertEquals(new DomDocument($expected), new DomDocument($result), 'Help does not match'); + $this->assertXmlStringEqualsXmlString($expected, $result, 'Help does not match'); } /** @@ -424,7 +427,7 @@ TEXT; $expected = << -mycommand +mycommand @@ -445,7 +448,7 @@ TEXT; TEXT; - $this->assertEquals(new DomDocument($expected), new DomDocument($result), 'Help does not match'); + $this->assertXmlStringEqualsXmlString($expected, $result, 'Help does not match'); } /** @@ -464,7 +467,7 @@ TEXT; $expected = << - mycommand + mycommand @@ -488,7 +491,7 @@ TEXT; TEXT; - $this->assertEquals(new DomDocument($expected), new DomDocument($result), 'Help does not match'); + $this->assertXmlStringEqualsXmlString($expected, $result, 'Help does not match'); } /** diff --git a/lib/Cake/Test/Case/View/ThemeViewTest.php b/lib/Cake/Test/Case/View/ThemeViewTest.php index eef252a90..31e5fb0a1 100644 --- a/lib/Cake/Test/Case/View/ThemeViewTest.php +++ b/lib/Cake/Test/Case/View/ThemeViewTest.php @@ -198,7 +198,6 @@ class ThemeViewTest extends CakeTestCase { /** * testMissingView method * - * @expectedException MissingViewException * @return void */ public function testMissingView() { @@ -211,17 +210,18 @@ class ThemeViewTest extends CakeTestCase { $this->Controller->params['pass'] = array('home'); $View = new TestTheme2View($this->Controller); - ob_start(); - $View->getViewFileName('does_not_exist'); - $expected = ob_get_clean(); - $this->assertRegExp("/PagesController::/", $expected); - $this->assertRegExp("/views(\/|\\\)themed(\/|\\\)my_theme(\/|\\\)pages(\/|\\\)does_not_exist.ctp/", $expected); + + try { + $View->getViewFileName('does_not_exist'); + $this->fail('No exception'); + } catch (MissingViewException $e) { + $this->assertContains('Pages' . DS . 'does_not_exist.ctp', $e->getMessage()); + } } /** * testMissingLayout method * - * @expectedException MissingLayoutException * @return void */ public function testMissingLayout() { @@ -232,11 +232,13 @@ class ThemeViewTest extends CakeTestCase { $this->Controller->theme = 'my_theme'; $View = new TestTheme2View($this->Controller); - ob_start(); - $View->getLayoutFileName(); - $expected = ob_get_clean(); - $this->assertRegExp("/Missing Layout/", $expected); - $this->assertRegExp("/views(\/|\\\)themed(\/|\\\)my_theme(\/|\\\)layouts(\/|\\\)whatever.ctp/", $expected); + + try { + $View->getLayoutFileName(); + $this->fail('No exception'); + } catch (MissingLayoutException $e) { + $this->assertContains('Layouts' . DS . 'whatever.ctp', $e->getMessage()); + } } /** diff --git a/lib/Cake/Test/Case/View/ViewTest.php b/lib/Cake/Test/Case/View/ViewTest.php index 8ac8755ec..15829c6a4 100644 --- a/lib/Cake/Test/Case/View/ViewTest.php +++ b/lib/Cake/Test/Case/View/ViewTest.php @@ -625,9 +625,16 @@ class ViewTest extends CakeTestCase { $this->Controller->params['pass'] = array('home'); $View = new TestView($this->Controller); - ob_start(); $View->getViewFileName('does_not_exist'); + } +/** + * Test for missing theme views + * + * @expectedException MissingViewException + * @return void + */ + public function testMissingThemeView() { $this->ThemeController->plugin = null; $this->ThemeController->name = 'Pages'; $this->ThemeController->viewPath = 'Pages'; @@ -653,10 +660,16 @@ class ViewTest extends CakeTestCase { $this->Controller->layout = 'whatever'; $View = new TestView($this->Controller); - ob_start(); $View->getLayoutFileName(); - ob_get_clean(); + } +/** + * Test for missing theme layouts + * + * @expectedException MissingLayoutException + * @return void + */ + public function testMissingThemeLayout() { $this->ThemeController->plugin = null; $this->ThemeController->name = 'Posts'; $this->ThemeController->viewPath = 'posts'; @@ -1512,7 +1525,6 @@ class ViewTest extends CakeTestCase { public static function blockValueProvider() { return array( 'string' => array('A string value'), - 'null' => array(null), 'decimal' => array(1.23456), 'object with __toString' => array(new TestObjectWithToString()), ); @@ -1631,26 +1643,33 @@ class ViewTest extends CakeTestCase { /** * Test that starting the same block twice throws an exception * - * @expectedException CakeException * @return void */ public function testStartBlocksTwice() { - $this->View->start('first'); - echo 'In first '; - $this->View->start('second'); - echo 'In second'; - $this->View->start('first'); + try { + $this->View->start('first'); + $this->View->start('first'); + $this->fail('No exception'); + } catch (CakeException $e) { + ob_end_clean(); + $this->assertTrue(true); + } } /** * Test that an exception gets thrown when you leave a block open at the end * of a view. * - * @expectedException CakeException * @return void */ public function testExceptionOnOpenBlock() { - $this->View->render('open_block'); + try { + $this->View->render('open_block'); + $this->fail('No exception'); + } catch (CakeException $e) { + ob_end_clean(); + $this->assertContains('The "no_close" block was left open', $e->getMessage()); + } } /** @@ -1673,23 +1692,33 @@ TEXT; /** * Make sure that extending the current view with itself causes an exception * - * @expectedException LogicException * @return void */ public function testExtendSelf() { - $this->View->layout = false; - $this->View->render('extend_self'); + try { + $this->View->layout = false; + $this->View->render('extend_self'); + $this->fail('No exception'); + } catch (LogicException $e) { + ob_end_clean(); + $this->assertContains('cannot have views extend themselves', $e->getMessage()); + } } /** * Make sure that extending in a loop causes an exception * - * @expectedException LogicException * @return void */ public function testExtendLoop() { - $this->View->layout = false; - $this->View->render('extend_loop'); + try { + $this->View->layout = false; + $this->View->render('extend_loop'); + $this->fail('No exception'); + } catch (LogicException $e) { + ob_end_clean(); + $this->assertContains('cannot have views extend in a loop', $e->getMessage()); + } } /** @@ -1713,12 +1742,18 @@ TEXT; /** * Extending an element which doesn't exist should throw a missing view exception * - * @expectedException LogicException * @return void */ public function testExtendMissingElement() { - $this->View->layout = false; - $this->View->render('extend_missing_element'); + try { + $this->View->layout = false; + $this->View->render('extend_missing_element'); + $this->fail('No exception'); + } catch (LogicException $e) { + ob_end_clean(); + ob_end_clean(); + $this->assertContains('element', $e->getMessage()); + } } /** diff --git a/lib/Cake/TestSuite/CakeTestCase.php b/lib/Cake/TestSuite/CakeTestCase.php index 94cf73e73..5b537e979 100644 --- a/lib/Cake/TestSuite/CakeTestCase.php +++ b/lib/Cake/TestSuite/CakeTestCase.php @@ -76,6 +76,8 @@ abstract class CakeTestCase extends PHPUnit_Framework_TestCase { * @throws InvalidArgumentException */ public function run(PHPUnit_Framework_TestResult $result = null) { + $level = ob_get_level(); + if (!empty($this->fixtureManager)) { $this->fixtureManager->load($this); } @@ -83,6 +85,11 @@ abstract class CakeTestCase extends PHPUnit_Framework_TestCase { if (!empty($this->fixtureManager)) { $this->fixtureManager->unload($this); } + + for ($i = ob_get_level(); $i < $level; ++$i) { + ob_start(); + } + return $result; } diff --git a/lib/Cake/TestSuite/CakeTestRunner.php b/lib/Cake/TestSuite/CakeTestRunner.php index d512724cc..da36429ba 100644 --- a/lib/Cake/TestSuite/CakeTestRunner.php +++ b/lib/Cake/TestSuite/CakeTestRunner.php @@ -15,7 +15,7 @@ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ -if (!defined('__PHPUNIT_PHAR__')) { +if (!class_exists('PHPUnit_TextUI_TestRunner')) { require_once 'PHPUnit/TextUI/TestRunner.php'; } @@ -52,7 +52,11 @@ class CakeTestRunner extends PHPUnit_TextUI_TestRunner { } $fixture = $this->_getFixtureManager($arguments); - foreach ($suite->getIterator() as $test) { + $iterator = $suite->getIterator(); + if ($iterator instanceof RecursiveIterator) { + $iterator = new RecursiveIteratorIterator($iterator); + } + foreach ($iterator as $test) { if ($test instanceof CakeTestCase) { $fixture->fixturize($test); $test->fixtureManager = $fixture; diff --git a/lib/Cake/TestSuite/CakeTestSuiteCommand.php b/lib/Cake/TestSuite/CakeTestSuiteCommand.php index c4134c535..701ba15ca 100644 --- a/lib/Cake/TestSuite/CakeTestSuiteCommand.php +++ b/lib/Cake/TestSuite/CakeTestSuiteCommand.php @@ -16,7 +16,7 @@ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ -if (!defined('__PHPUNIT_PHAR__')) { +if (!class_exists('PHPUnit_TextUI_Command')) { require_once 'PHPUnit/TextUI/Command.php'; } diff --git a/lib/Cake/TestSuite/Reporter/CakeBaseReporter.php b/lib/Cake/TestSuite/Reporter/CakeBaseReporter.php index c89ead4df..953232046 100644 --- a/lib/Cake/TestSuite/Reporter/CakeBaseReporter.php +++ b/lib/Cake/TestSuite/Reporter/CakeBaseReporter.php @@ -15,7 +15,7 @@ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ -if (!defined('__PHPUNIT_PHAR__')) { +if (!class_exists('PHPUnit_TextUI_ResultPrinter')) { require_once 'PHPUnit/TextUI/ResultPrinter.php'; } diff --git a/lib/Cake/View/Errors/missing_controller.ctp b/lib/Cake/View/Errors/missing_controller.ctp index 8bfc90b7e..eea951f17 100644 --- a/lib/Cake/View/Errors/missing_controller.ctp +++ b/lib/Cake/View/Errors/missing_controller.ctp @@ -27,7 +27,7 @@ $pluginDot = empty($plugin) ? null : $plugin . '.';

 <?php
-class AppController {
+class AppController {
 
 }