pictcode / lib / Cake / TestSuite / CakeTestCase.php @ master
履歴 | 表示 | アノテート | ダウンロード (22.129 KB)
| 1 | 635eef61 | spyder1211 | <?php
 | 
      
|---|---|---|---|
| 2 | /**
 | 
      ||
| 3 |  * CakeTestCase file
 | 
      ||
| 4 |  *
 | 
      ||
| 5 |  * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
 | 
      ||
| 6 |  * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 | 
      ||
| 7 |  *
 | 
      ||
| 8 |  * Licensed under The MIT License
 | 
      ||
| 9 |  * For full copyright and license information, please see the LICENSE.txt
 | 
      ||
| 10 |  * Redistributions of files must retain the above copyright notice
 | 
      ||
| 11 |  *
 | 
      ||
| 12 |  * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 | 
      ||
| 13 |  * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
 | 
      ||
| 14 |  * @package       Cake.TestSuite
 | 
      ||
| 15 |  * @since         CakePHP(tm) v 1.2.0.4667
 | 
      ||
| 16 |  * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 | 
      ||
| 17 |  */
 | 
      ||
| 18 | |||
| 19 | App::uses('CakeFixtureManager', 'TestSuite/Fixture');  | 
      ||
| 20 | App::uses('CakeTestFixture', 'TestSuite/Fixture');  | 
      ||
| 21 | |||
| 22 | /**
 | 
      ||
| 23 |  * CakeTestCase class
 | 
      ||
| 24 |  *
 | 
      ||
| 25 |  * @package       Cake.TestSuite
 | 
      ||
| 26 |  */
 | 
      ||
| 27 | abstract class CakeTestCase extends PHPUnit_Framework_TestCase {  | 
      ||
| 28 | |||
| 29 | /**
 | 
      ||
| 30 |  * The class responsible for managing the creation, loading and removing of fixtures
 | 
      ||
| 31 |  *
 | 
      ||
| 32 |  * @var CakeFixtureManager
 | 
      ||
| 33 |  */
 | 
      ||
| 34 | public $fixtureManager = null;  | 
      ||
| 35 | |||
| 36 | /**
 | 
      ||
| 37 |  * By default, all fixtures attached to this class will be truncated and reloaded after each test.
 | 
      ||
| 38 |  * Set this to false to handle manually
 | 
      ||
| 39 |  *
 | 
      ||
| 40 |  * @var array
 | 
      ||
| 41 |  */
 | 
      ||
| 42 | public $autoFixtures = true;  | 
      ||
| 43 | |||
| 44 | /**
 | 
      ||
| 45 |  * Control table create/drops on each test method.
 | 
      ||
| 46 |  *
 | 
      ||
| 47 |  * Set this to false to avoid tables to be dropped if they already exist
 | 
      ||
| 48 |  * between each test method. Tables will still be dropped at the
 | 
      ||
| 49 |  * end of each test runner execution.
 | 
      ||
| 50 |  *
 | 
      ||
| 51 |  * @var bool
 | 
      ||
| 52 |  */
 | 
      ||
| 53 | public $dropTables = true;  | 
      ||
| 54 | |||
| 55 | /**
 | 
      ||
| 56 |  * Configure values to restore at end of test.
 | 
      ||
| 57 |  *
 | 
      ||
| 58 |  * @var array
 | 
      ||
| 59 |  */
 | 
      ||
| 60 | protected $_configure = array();  | 
      ||
| 61 | |||
| 62 | /**
 | 
      ||
| 63 |  * Path settings to restore at the end of the test.
 | 
      ||
| 64 |  *
 | 
      ||
| 65 |  * @var array
 | 
      ||
| 66 |  */
 | 
      ||
| 67 | protected $_pathRestore = array();  | 
      ||
| 68 | |||
| 69 | /**
 | 
      ||
| 70 |  * Runs the test case and collects the results in a TestResult object.
 | 
      ||
| 71 |  * If no TestResult object is passed a new one will be created.
 | 
      ||
| 72 |  * This method is run for each test method in this class
 | 
      ||
| 73 |  *
 | 
      ||
| 74 |  * @param PHPUnit_Framework_TestResult $result The test result object
 | 
      ||
| 75 |  * @return PHPUnit_Framework_TestResult
 | 
      ||
| 76 |  * @throws InvalidArgumentException
 | 
      ||
| 77 |  */
 | 
      ||
| 78 | public function run(PHPUnit_Framework_TestResult $result = null) {  | 
      ||
| 79 | if (!empty($this->fixtureManager)) {  | 
      ||
| 80 | $this->fixtureManager->load($this);  | 
      ||
| 81 | }  | 
      ||
| 82 | $result = parent::run($result);  | 
      ||
| 83 | if (!empty($this->fixtureManager)) {  | 
      ||
| 84 | $this->fixtureManager->unload($this);  | 
      ||
| 85 | }  | 
      ||
| 86 | return $result;  | 
      ||
| 87 | }  | 
      ||
| 88 | |||
| 89 | /**
 | 
      ||
| 90 |  * Called when a test case method is about to start (to be overridden when needed.)
 | 
      ||
| 91 |  *
 | 
      ||
| 92 |  * @param string $method Test method about to get executed.
 | 
      ||
| 93 |  * @return void
 | 
      ||
| 94 |  */
 | 
      ||
| 95 | public function startTest($method) {  | 
      ||
| 96 | }  | 
      ||
| 97 | |||
| 98 | /**
 | 
      ||
| 99 |  * Called when a test case method has been executed (to be overridden when needed.)
 | 
      ||
| 100 |  *
 | 
      ||
| 101 |  * @param string $method Test method about that was executed.
 | 
      ||
| 102 |  * @return void
 | 
      ||
| 103 |  */
 | 
      ||
| 104 | public function endTest($method) {  | 
      ||
| 105 | }  | 
      ||
| 106 | |||
| 107 | /**
 | 
      ||
| 108 |  * Overrides SimpleTestCase::skipIf to provide a boolean return value
 | 
      ||
| 109 |  *
 | 
      ||
| 110 |  * @param bool $shouldSkip Whether or not the test should be skipped.
 | 
      ||
| 111 |  * @param string $message The message to display.
 | 
      ||
| 112 |  * @return bool
 | 
      ||
| 113 |  */
 | 
      ||
| 114 | public function skipIf($shouldSkip, $message = '') {  | 
      ||
| 115 | if ($shouldSkip) {  | 
      ||
| 116 | $this->markTestSkipped($message);  | 
      ||
| 117 | }  | 
      ||
| 118 | return $shouldSkip;  | 
      ||
| 119 | }  | 
      ||
| 120 | |||
| 121 | /**
 | 
      ||
| 122 |  * Setup the test case, backup the static object values so they can be restored.
 | 
      ||
| 123 |  * Specifically backs up the contents of Configure and paths in App if they have
 | 
      ||
| 124 |  * not already been backed up.
 | 
      ||
| 125 |  *
 | 
      ||
| 126 |  * @return void
 | 
      ||
| 127 |  */
 | 
      ||
| 128 | public function setUp() {  | 
      ||
| 129 |                 parent::setUp();
 | 
      ||
| 130 | |||
| 131 | if (empty($this->_configure)) {  | 
      ||
| 132 | $this->_configure = Configure::read();  | 
      ||
| 133 | }  | 
      ||
| 134 | if (empty($this->_pathRestore)) {  | 
      ||
| 135 | $this->_pathRestore = App::paths();  | 
      ||
| 136 | }  | 
      ||
| 137 | if (class_exists('Router', false)) {  | 
      ||
| 138 |                         Router::reload();
 | 
      ||
| 139 | }  | 
      ||
| 140 | }  | 
      ||
| 141 | |||
| 142 | /**
 | 
      ||
| 143 |  * teardown any static object changes and restore them.
 | 
      ||
| 144 |  *
 | 
      ||
| 145 |  * @return void
 | 
      ||
| 146 |  */
 | 
      ||
| 147 | public function tearDown() {  | 
      ||
| 148 |                 parent::tearDown();
 | 
      ||
| 149 | App::build($this->_pathRestore, App::RESET);  | 
      ||
| 150 | if (class_exists('ClassRegistry', false)) {  | 
      ||
| 151 | ClassRegistry::flush();  | 
      ||
| 152 | }  | 
      ||
| 153 | if (!empty($this->_configure)) {  | 
      ||
| 154 |                         Configure::clear();
 | 
      ||
| 155 | Configure::write($this->_configure);  | 
      ||
| 156 | }  | 
      ||
| 157 | if (isset($_GET['debug']) && $_GET['debug']) {  | 
      ||
| 158 | ob_flush();  | 
      ||
| 159 | }  | 
      ||
| 160 | }  | 
      ||
| 161 | |||
| 162 | /**
 | 
      ||
| 163 |  * See CakeTestSuiteDispatcher::date()
 | 
      ||
| 164 |  *
 | 
      ||
| 165 |  * @param string $format format to be used.
 | 
      ||
| 166 |  * @return string
 | 
      ||
| 167 |  */
 | 
      ||
| 168 | public static function date($format = 'Y-m-d H:i:s') {  | 
      ||
| 169 | return CakeTestSuiteDispatcher::date($format);  | 
      ||
| 170 | }  | 
      ||
| 171 | |||
| 172 | // @codingStandardsIgnoreStart PHPUnit overrides don't match CakePHP
 | 
      ||
| 173 | |||
| 174 | /**
 | 
      ||
| 175 |  * Announces the start of a test.
 | 
      ||
| 176 |  *
 | 
      ||
| 177 |  * @return void
 | 
      ||
| 178 |  */
 | 
      ||
| 179 | protected function assertPreConditions() {  | 
      ||
| 180 |                 parent::assertPreConditions();
 | 
      ||
| 181 | $this->startTest($this->getName());  | 
      ||
| 182 | }  | 
      ||
| 183 | |||
| 184 | /**
 | 
      ||
| 185 |  * Announces the end of a test.
 | 
      ||
| 186 |  *
 | 
      ||
| 187 |  * @return void
 | 
      ||
| 188 |  */
 | 
      ||
| 189 | protected function assertPostConditions() {  | 
      ||
| 190 |                 parent::assertPostConditions();
 | 
      ||
| 191 | $this->endTest($this->getName());  | 
      ||
| 192 | }  | 
      ||
| 193 | |||
| 194 | // @codingStandardsIgnoreEnd
 | 
      ||
| 195 | |||
| 196 | /**
 | 
      ||
| 197 |  * Chooses which fixtures to load for a given test
 | 
      ||
| 198 |  *
 | 
      ||
| 199 |  * Each parameter is a model name that corresponds to a fixture, i.e. 'Post', 'Author', etc.
 | 
      ||
| 200 |  *
 | 
      ||
| 201 |  * @return void
 | 
      ||
| 202 |  * @see CakeTestCase::$autoFixtures
 | 
      ||
| 203 |  * @throws Exception when no fixture manager is available.
 | 
      ||
| 204 |  */
 | 
      ||
| 205 | public function loadFixtures() {  | 
      ||
| 206 | if (empty($this->fixtureManager)) {  | 
      ||
| 207 | throw new Exception(__d('cake_dev', 'No fixture manager to load the test fixture'));  | 
      ||
| 208 | }  | 
      ||
| 209 | $args = func_get_args();  | 
      ||
| 210 | foreach ($args as $class) {  | 
      ||
| 211 | $this->fixtureManager->loadSingle($class, null, $this->dropTables);  | 
      ||
| 212 | }  | 
      ||
| 213 | }  | 
      ||
| 214 | |||
| 215 | /**
 | 
      ||
| 216 |  * Assert text equality, ignoring differences in newlines.
 | 
      ||
| 217 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 218 |  *
 | 
      ||
| 219 |  * @param string $expected The expected value.
 | 
      ||
| 220 |  * @param string $result The actual value.
 | 
      ||
| 221 |  * @param string $message The message to use for failure.
 | 
      ||
| 222 |  * @return bool
 | 
      ||
| 223 |  */
 | 
      ||
| 224 | public function assertTextNotEquals($expected, $result, $message = '') {  | 
      ||
| 225 | $expected = str_replace(array("\r\n", "\r"), "\n", $expected);  | 
      ||
| 226 | $result = str_replace(array("\r\n", "\r"), "\n", $result);  | 
      ||
| 227 | return $this->assertNotEquals($expected, $result, $message);  | 
      ||
| 228 | }  | 
      ||
| 229 | |||
| 230 | /**
 | 
      ||
| 231 |  * Assert text equality, ignoring differences in newlines.
 | 
      ||
| 232 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 233 |  *
 | 
      ||
| 234 |  * @param string $expected The expected value.
 | 
      ||
| 235 |  * @param string $result The actual value.
 | 
      ||
| 236 |  * @param string $message message The message to use for failure.
 | 
      ||
| 237 |  * @return bool
 | 
      ||
| 238 |  */
 | 
      ||
| 239 | public function assertTextEquals($expected, $result, $message = '') {  | 
      ||
| 240 | $expected = str_replace(array("\r\n", "\r"), "\n", $expected);  | 
      ||
| 241 | $result = str_replace(array("\r\n", "\r"), "\n", $result);  | 
      ||
| 242 | return $this->assertEquals($expected, $result, $message);  | 
      ||
| 243 | }  | 
      ||
| 244 | |||
| 245 | /**
 | 
      ||
| 246 |  * Asserts that a string starts with a given prefix, ignoring differences in newlines.
 | 
      ||
| 247 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 248 |  *
 | 
      ||
| 249 |  * @param string $prefix The prefix to check for.
 | 
      ||
| 250 |  * @param string $string The string to search in.
 | 
      ||
| 251 |  * @param string $message The message to use for failure.
 | 
      ||
| 252 |  * @return bool
 | 
      ||
| 253 |  */
 | 
      ||
| 254 | public function assertTextStartsWith($prefix, $string, $message = '') {  | 
      ||
| 255 | $prefix = str_replace(array("\r\n", "\r"), "\n", $prefix);  | 
      ||
| 256 | $string = str_replace(array("\r\n", "\r"), "\n", $string);  | 
      ||
| 257 | return $this->assertStringStartsWith($prefix, $string, $message);  | 
      ||
| 258 | }  | 
      ||
| 259 | |||
| 260 | /**
 | 
      ||
| 261 |  * Asserts that a string starts not with a given prefix, ignoring differences in newlines.
 | 
      ||
| 262 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 263 |  *
 | 
      ||
| 264 |  * @param string $prefix The prefix to not find.
 | 
      ||
| 265 |  * @param string $string The string to search.
 | 
      ||
| 266 |  * @param string $message The message to use for failure.
 | 
      ||
| 267 |  * @return bool
 | 
      ||
| 268 |  */
 | 
      ||
| 269 | public function assertTextStartsNotWith($prefix, $string, $message = '') {  | 
      ||
| 270 | $prefix = str_replace(array("\r\n", "\r"), "\n", $prefix);  | 
      ||
| 271 | $string = str_replace(array("\r\n", "\r"), "\n", $string);  | 
      ||
| 272 | return $this->assertStringStartsNotWith($prefix, $string, $message);  | 
      ||
| 273 | }  | 
      ||
| 274 | |||
| 275 | /**
 | 
      ||
| 276 |  * Asserts that a string ends with a given prefix, ignoring differences in newlines.
 | 
      ||
| 277 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 278 |  *
 | 
      ||
| 279 |  * @param string $suffix The suffix to find.
 | 
      ||
| 280 |  * @param string $string The string to search.
 | 
      ||
| 281 |  * @param string $message The message to use for failure.
 | 
      ||
| 282 |  * @return bool
 | 
      ||
| 283 |  */
 | 
      ||
| 284 | public function assertTextEndsWith($suffix, $string, $message = '') {  | 
      ||
| 285 | $suffix = str_replace(array("\r\n", "\r"), "\n", $suffix);  | 
      ||
| 286 | $string = str_replace(array("\r\n", "\r"), "\n", $string);  | 
      ||
| 287 | return $this->assertStringEndsWith($suffix, $string, $message);  | 
      ||
| 288 | }  | 
      ||
| 289 | |||
| 290 | /**
 | 
      ||
| 291 |  * Asserts that a string ends not with a given prefix, ignoring differences in newlines.
 | 
      ||
| 292 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 293 |  *
 | 
      ||
| 294 |  * @param string $suffix The suffix to not find.
 | 
      ||
| 295 |  * @param string $string The string to search.
 | 
      ||
| 296 |  * @param string $message The message to use for failure.
 | 
      ||
| 297 |  * @return bool
 | 
      ||
| 298 |  */
 | 
      ||
| 299 | public function assertTextEndsNotWith($suffix, $string, $message = '') {  | 
      ||
| 300 | $suffix = str_replace(array("\r\n", "\r"), "\n", $suffix);  | 
      ||
| 301 | $string = str_replace(array("\r\n", "\r"), "\n", $string);  | 
      ||
| 302 | return $this->assertStringEndsNotWith($suffix, $string, $message);  | 
      ||
| 303 | }  | 
      ||
| 304 | |||
| 305 | /**
 | 
      ||
| 306 |  * Assert that a string contains another string, ignoring differences in newlines.
 | 
      ||
| 307 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 308 |  *
 | 
      ||
| 309 |  * @param string $needle The string to search for.
 | 
      ||
| 310 |  * @param string $haystack The string to search through.
 | 
      ||
| 311 |  * @param string $message The message to display on failure.
 | 
      ||
| 312 |  * @param bool $ignoreCase Whether or not the search should be case-sensitive.
 | 
      ||
| 313 |  * @return bool
 | 
      ||
| 314 |  */
 | 
      ||
| 315 | public function assertTextContains($needle, $haystack, $message = '', $ignoreCase = false) {  | 
      ||
| 316 | $needle = str_replace(array("\r\n", "\r"), "\n", $needle);  | 
      ||
| 317 | $haystack = str_replace(array("\r\n", "\r"), "\n", $haystack);  | 
      ||
| 318 | return $this->assertContains($needle, $haystack, $message, $ignoreCase);  | 
      ||
| 319 | }  | 
      ||
| 320 | |||
| 321 | /**
 | 
      ||
| 322 |  * Assert that a text doesn't contain another text, ignoring differences in newlines.
 | 
      ||
| 323 |  * Helpful for doing cross platform tests of blocks of text.
 | 
      ||
| 324 |  *
 | 
      ||
| 325 |  * @param string $needle The string to search for.
 | 
      ||
| 326 |  * @param string $haystack The string to search through.
 | 
      ||
| 327 |  * @param string $message The message to display on failure.
 | 
      ||
| 328 |  * @param bool $ignoreCase Whether or not the search should be case-sensitive.
 | 
      ||
| 329 |  * @return bool
 | 
      ||
| 330 |  */
 | 
      ||
| 331 | public function assertTextNotContains($needle, $haystack, $message = '', $ignoreCase = false) {  | 
      ||
| 332 | $needle = str_replace(array("\r\n", "\r"), "\n", $needle);  | 
      ||
| 333 | $haystack = str_replace(array("\r\n", "\r"), "\n", $haystack);  | 
      ||
| 334 | return $this->assertNotContains($needle, $haystack, $message, $ignoreCase);  | 
      ||
| 335 | }  | 
      ||
| 336 | |||
| 337 | /**
 | 
      ||
| 338 |  * Takes an array $expected and generates a regex from it to match the provided $string.
 | 
      ||
| 339 |  * Samples for $expected:
 | 
      ||
| 340 |  *
 | 
      ||
| 341 |  * Checks for an input tag with a name attribute (contains any non-empty value) and an id
 | 
      ||
| 342 |  * attribute that contains 'my-input':
 | 
      ||
| 343 |  *
 | 
      ||
| 344 |  * ```
 | 
      ||
| 345 |  * array('input' => array('name', 'id' => 'my-input'))
 | 
      ||
| 346 |  * ```
 | 
      ||
| 347 |  *
 | 
      ||
| 348 |  * Checks for two p elements with some text in them:
 | 
      ||
| 349 |  *
 | 
      ||
| 350 |  * ```
 | 
      ||
| 351 |  * array(
 | 
      ||
| 352 |  *   array('p' => true),
 | 
      ||
| 353 |  *   'textA',
 | 
      ||
| 354 |  *   '/p',
 | 
      ||
| 355 |  *   array('p' => true),
 | 
      ||
| 356 |  *   'textB',
 | 
      ||
| 357 |  *   '/p'
 | 
      ||
| 358 |  * )
 | 
      ||
| 359 |  * ```
 | 
      ||
| 360 |  *
 | 
      ||
| 361 |  * You can also specify a pattern expression as part of the attribute values, or the tag
 | 
      ||
| 362 |  * being defined, if you prepend the value with preg: and enclose it with slashes, like so:
 | 
      ||
| 363 |  *
 | 
      ||
| 364 |  * ```
 | 
      ||
| 365 |  * array(
 | 
      ||
| 366 |  *   array('input' => array('name', 'id' => 'preg:/FieldName\d+/')),
 | 
      ||
| 367 |  *   'preg:/My\s+field/'
 | 
      ||
| 368 |  * )
 | 
      ||
| 369 |  * ```
 | 
      ||
| 370 |  *
 | 
      ||
| 371 |  * Important: This function is very forgiving about whitespace and also accepts any
 | 
      ||
| 372 |  * permutation of attribute order. It will also allow whitespace between specified tags.
 | 
      ||
| 373 |  *
 | 
      ||
| 374 |  * @param string $string An HTML/XHTML/XML string
 | 
      ||
| 375 |  * @param array $expected An array, see above
 | 
      ||
| 376 |  * @param string $fullDebug Whether or not more verbose output should be used.
 | 
      ||
| 377 |  * @return bool
 | 
      ||
| 378 |  */
 | 
      ||
| 379 | public function assertTags($string, $expected, $fullDebug = false) {  | 
      ||
| 380 | $regex = array();  | 
      ||
| 381 | $normalized = array();  | 
      ||
| 382 | foreach ((array)$expected as $key => $val) {  | 
      ||
| 383 | if (!is_numeric($key)) {  | 
      ||
| 384 | $normalized[] = array($key => $val);  | 
      ||
| 385 |                         } else {
 | 
      ||
| 386 | $normalized[] = $val;  | 
      ||
| 387 | }  | 
      ||
| 388 | }  | 
      ||
| 389 | $i = 0;  | 
      ||
| 390 | foreach ($normalized as $tags) {  | 
      ||
| 391 | if (!is_array($tags)) {  | 
      ||
| 392 | $tags = (string)$tags;  | 
      ||
| 393 | }  | 
      ||
| 394 |                         $i++;
 | 
      ||
| 395 | if (is_string($tags) && $tags{0} === '<') {  | 
      ||
| 396 | $tags = array(substr($tags, 1) => array());  | 
      ||
| 397 | } elseif (is_string($tags)) {  | 
      ||
| 398 | $tagsTrimmed = preg_replace('/\s+/m', '', $tags);  | 
      ||
| 399 | |||
| 400 | if (preg_match('/^\*?\//', $tags, $match) && $tagsTrimmed !== '//') {  | 
      ||
| 401 | $prefix = array(null, null);  | 
      ||
| 402 | |||
| 403 | if ($match[0] === '*/') {  | 
      ||
| 404 | $prefix = array('Anything, ', '.*?');  | 
      ||
| 405 | }  | 
      ||
| 406 | $regex[] = array(  | 
      ||
| 407 | sprintf('%sClose %s tag', $prefix[0], substr($tags, strlen($match[0]))),  | 
      ||
| 408 | sprintf('%s<[\s]*\/[\s]*%s[\s]*>[\n\r]*', $prefix[1], substr($tags, strlen($match[0]))),  | 
      ||
| 409 |                                                 $i,
 | 
      ||
| 410 | );  | 
      ||
| 411 |                                         continue;
 | 
      ||
| 412 | }  | 
      ||
| 413 | if (!empty($tags) && preg_match('/^preg\:\/(.+)\/$/i', $tags, $matches)) {  | 
      ||
| 414 | $tags = $matches[1];  | 
      ||
| 415 | $type = 'Regex matches';  | 
      ||
| 416 |                                 } else {
 | 
      ||
| 417 | $tags = preg_quote($tags, '/');  | 
      ||
| 418 | $type = 'Text equals';  | 
      ||
| 419 | }  | 
      ||
| 420 | $regex[] = array(  | 
      ||
| 421 | sprintf('%s "%s"', $type, $tags),  | 
      ||
| 422 |                                         $tags,
 | 
      ||
| 423 |                                         $i,
 | 
      ||
| 424 | );  | 
      ||
| 425 |                                 continue;
 | 
      ||
| 426 | }  | 
      ||
| 427 | foreach ($tags as $tag => $attributes) {  | 
      ||
| 428 | $regex[] = array(  | 
      ||
| 429 | sprintf('Open %s tag', $tag),  | 
      ||
| 430 | sprintf('[\s]*<%s', preg_quote($tag, '/')),  | 
      ||
| 431 |                                         $i,
 | 
      ||
| 432 | );  | 
      ||
| 433 | if ($attributes === true) {  | 
      ||
| 434 | $attributes = array();  | 
      ||
| 435 | }  | 
      ||
| 436 | $attrs = array();  | 
      ||
| 437 | $explanations = array();  | 
      ||
| 438 | $i = 1;  | 
      ||
| 439 | foreach ($attributes as $attr => $val) {  | 
      ||
| 440 | if (is_numeric($attr) && preg_match('/^preg\:\/(.+)\/$/i', $val, $matches)) {  | 
      ||
| 441 | $attrs[] = $matches[1];  | 
      ||
| 442 | $explanations[] = sprintf('Regex "%s" matches', $matches[1]);  | 
      ||
| 443 |                                                 continue;
 | 
      ||
| 444 |                                         } else {
 | 
      ||
| 445 | $quotes = '["\']';  | 
      ||
| 446 | if (is_numeric($attr)) {  | 
      ||
| 447 | $attr = $val;  | 
      ||
| 448 | $val = '.+?';  | 
      ||
| 449 | $explanations[] = sprintf('Attribute "%s" present', $attr);  | 
      ||
| 450 | } elseif (!empty($val) && preg_match('/^preg\:\/(.+)\/$/i', $val, $matches)) {  | 
      ||
| 451 | $val = str_replace(  | 
      ||
| 452 | array('.*', '.+'),  | 
      ||
| 453 | array('.*?', '.+?'),  | 
      ||
| 454 | $matches[1]  | 
      ||
| 455 | );  | 
      ||
| 456 | $quotes = $val !== $matches[1] ? '["\']' : '["\']?';  | 
      ||
| 457 | |||
| 458 | $explanations[] = sprintf('Attribute "%s" matches "%s"', $attr, $val);  | 
      ||
| 459 |                                                 } else {
 | 
      ||
| 460 | $explanations[] = sprintf('Attribute "%s" == "%s"', $attr, $val);  | 
      ||
| 461 | $val = preg_quote($val, '/');  | 
      ||
| 462 | }  | 
      ||
| 463 | $attrs[] = '[\s]+' . preg_quote($attr, '/') . '=' . $quotes . $val . $quotes;  | 
      ||
| 464 | }  | 
      ||
| 465 |                                         $i++;
 | 
      ||
| 466 | }  | 
      ||
| 467 | if ($attrs) {  | 
      ||
| 468 | $regex[] = array(  | 
      ||
| 469 | 'explains' => $explanations,  | 
      ||
| 470 | 'attrs' => $attrs,  | 
      ||
| 471 | );  | 
      ||
| 472 | }  | 
      ||
| 473 | $regex[] = array(  | 
      ||
| 474 | sprintf('End %s tag', $tag),  | 
      ||
| 475 |                                         '[\s]*\/?[\s]*>[\n\r]*',
 | 
      ||
| 476 |                                         $i,
 | 
      ||
| 477 | );  | 
      ||
| 478 | }  | 
      ||
| 479 | }  | 
      ||
| 480 | foreach ($regex as $i => $assertion) {  | 
      ||
| 481 | $matches = false;  | 
      ||
| 482 | if (isset($assertion['attrs'])) {  | 
      ||
| 483 | $string = $this->_assertAttributes($assertion, $string);  | 
      ||
| 484 |                                 continue;
 | 
      ||
| 485 | }  | 
      ||
| 486 | |||
| 487 | list($description, $expressions, $itemNum) = $assertion;  | 
      ||
| 488 | foreach ((array)$expressions as $expression) {  | 
      ||
| 489 | if (preg_match(sprintf('/^%s/s', $expression), $string, $match)) {  | 
      ||
| 490 | $matches = true;  | 
      ||
| 491 | $string = substr($string, strlen($match[0]));  | 
      ||
| 492 |                                         break;
 | 
      ||
| 493 | }  | 
      ||
| 494 | }  | 
      ||
| 495 | if (!$matches) {  | 
      ||
| 496 | $this->assertTrue(false, sprintf('Item #%d / regex #%d failed: %s', $itemNum, $i, $description));  | 
      ||
| 497 | if ($fullDebug) {  | 
      ||
| 498 | debug($string, true);  | 
      ||
| 499 | debug($regex, true);  | 
      ||
| 500 | }  | 
      ||
| 501 | return false;  | 
      ||
| 502 | }  | 
      ||
| 503 | }  | 
      ||
| 504 | |||
| 505 | $this->assertTrue(true, '%s');  | 
      ||
| 506 | return true;  | 
      ||
| 507 | }  | 
      ||
| 508 | |||
| 509 | /**
 | 
      ||
| 510 |  * Check the attributes as part of an assertTags() check.
 | 
      ||
| 511 |  *
 | 
      ||
| 512 |  * @param array $assertions Assertions to run.
 | 
      ||
| 513 |  * @param string $string The HTML string to check.
 | 
      ||
| 514 |  * @return void
 | 
      ||
| 515 |  */
 | 
      ||
| 516 | protected function _assertAttributes($assertions, $string) {  | 
      ||
| 517 | $asserts = $assertions['attrs'];  | 
      ||
| 518 | $explains = $assertions['explains'];  | 
      ||
| 519 | $len = count($asserts);  | 
      ||
| 520 |                 do {
 | 
      ||
| 521 | $matches = false;  | 
      ||
| 522 | foreach ($asserts as $j => $assert) {  | 
      ||
| 523 | if (preg_match(sprintf('/^%s/s', $assert), $string, $match)) {  | 
      ||
| 524 | $matches = true;  | 
      ||
| 525 | $string = substr($string, strlen($match[0]));  | 
      ||
| 526 | array_splice($asserts, $j, 1);  | 
      ||
| 527 | array_splice($explains, $j, 1);  | 
      ||
| 528 |                                         break;
 | 
      ||
| 529 | }  | 
      ||
| 530 | }  | 
      ||
| 531 | if ($matches === false) {  | 
      ||
| 532 | $this->assertTrue(false, 'Attribute did not match. Was expecting ' . $explains[$j]);  | 
      ||
| 533 | }  | 
      ||
| 534 | $len = count($asserts);  | 
      ||
| 535 | } while ($len > 0);  | 
      ||
| 536 | return $string;  | 
      ||
| 537 | }  | 
      ||
| 538 | |||
| 539 | // @codingStandardsIgnoreStart
 | 
      ||
| 540 | |||
| 541 | /**
 | 
      ||
| 542 |  * Compatibility wrapper function for assertEquals
 | 
      ||
| 543 |  *
 | 
      ||
| 544 |  * @param mixed $result
 | 
      ||
| 545 |  * @param mixed $expected
 | 
      ||
| 546 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 547 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 548 |  * @return void
 | 
      ||
| 549 |  */
 | 
      ||
| 550 | protected static function assertEqual($result, $expected, $message = '') {  | 
      ||
| 551 | return static::assertEquals($expected, $result, $message);  | 
      ||
| 552 | }  | 
      ||
| 553 | |||
| 554 | /**
 | 
      ||
| 555 |  * Compatibility wrapper function for assertNotEquals
 | 
      ||
| 556 |  *
 | 
      ||
| 557 |  * @param mixed $result
 | 
      ||
| 558 |  * @param mixed $expected
 | 
      ||
| 559 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 560 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 561 |  * @return void
 | 
      ||
| 562 |  */
 | 
      ||
| 563 | protected static function assertNotEqual($result, $expected, $message = '') {  | 
      ||
| 564 | return static::assertNotEquals($expected, $result, $message);  | 
      ||
| 565 | }  | 
      ||
| 566 | |||
| 567 | /**
 | 
      ||
| 568 |  * Compatibility wrapper function for assertRegexp
 | 
      ||
| 569 |  *
 | 
      ||
| 570 |  * @param mixed $pattern a regular expression
 | 
      ||
| 571 |  * @param string $string the text to be matched
 | 
      ||
| 572 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 573 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 574 |  * @return void
 | 
      ||
| 575 |  */
 | 
      ||
| 576 | protected static function assertPattern($pattern, $string, $message = '') {  | 
      ||
| 577 | return static::assertRegExp($pattern, $string, $message);  | 
      ||
| 578 | }  | 
      ||
| 579 | |||
| 580 | /**
 | 
      ||
| 581 |  * Compatibility wrapper function for assertEquals
 | 
      ||
| 582 |  *
 | 
      ||
| 583 |  * @param mixed $actual
 | 
      ||
| 584 |  * @param mixed $expected
 | 
      ||
| 585 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 586 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 587 |  * @return void
 | 
      ||
| 588 |  */
 | 
      ||
| 589 | protected static function assertIdentical($actual, $expected, $message = '') {  | 
      ||
| 590 | return static::assertSame($expected, $actual, $message);  | 
      ||
| 591 | }  | 
      ||
| 592 | |||
| 593 | /**
 | 
      ||
| 594 |  * Compatibility wrapper function for assertNotEquals
 | 
      ||
| 595 |  *
 | 
      ||
| 596 |  * @param mixed $actual
 | 
      ||
| 597 |  * @param mixed $expected
 | 
      ||
| 598 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 599 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 600 |  * @return void
 | 
      ||
| 601 |  */
 | 
      ||
| 602 | protected static function assertNotIdentical($actual, $expected, $message = '') {  | 
      ||
| 603 | return static::assertNotSame($expected, $actual, $message);  | 
      ||
| 604 | }  | 
      ||
| 605 | |||
| 606 | /**
 | 
      ||
| 607 |  * Compatibility wrapper function for assertNotRegExp
 | 
      ||
| 608 |  *
 | 
      ||
| 609 |  * @param mixed $pattern a regular expression
 | 
      ||
| 610 |  * @param string $string the text to be matched
 | 
      ||
| 611 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 612 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 613 |  * @return void
 | 
      ||
| 614 |  */
 | 
      ||
| 615 | protected static function assertNoPattern($pattern, $string, $message = '') {  | 
      ||
| 616 | return static::assertNotRegExp($pattern, $string, $message);  | 
      ||
| 617 | }  | 
      ||
| 618 | |||
| 619 | /**
 | 
      ||
| 620 |  * assert no errors
 | 
      ||
| 621 |  *
 | 
      ||
| 622 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 623 |  * @return void
 | 
      ||
| 624 |  */
 | 
      ||
| 625 | protected function assertNoErrors() {  | 
      ||
| 626 | }  | 
      ||
| 627 | |||
| 628 | /**
 | 
      ||
| 629 |  * Compatibility wrapper function for setExpectedException
 | 
      ||
| 630 |  *
 | 
      ||
| 631 |  * @param mixed $expected the name of the Exception or error
 | 
      ||
| 632 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 633 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 634 |  * @return void
 | 
      ||
| 635 |  */
 | 
      ||
| 636 | protected function expectError($expected = false, $message = '') {  | 
      ||
| 637 | if (!$expected) {  | 
      ||
| 638 | $expected = 'Exception';  | 
      ||
| 639 | }  | 
      ||
| 640 | $this->setExpectedException($expected, $message);  | 
      ||
| 641 | }  | 
      ||
| 642 | |||
| 643 | /**
 | 
      ||
| 644 |  * Compatibility wrapper function for setExpectedException
 | 
      ||
| 645 |  *
 | 
      ||
| 646 |  * @param mixed $name The name of the expected Exception.
 | 
      ||
| 647 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 648 |  * @deprecated 3.0.0 This is a compatibility wrapper for 1.x. It will be removed in 3.0.
 | 
      ||
| 649 |  * @return void
 | 
      ||
| 650 |  */
 | 
      ||
| 651 | protected function expectException($name = 'Exception', $message = '') {  | 
      ||
| 652 | $this->setExpectedException($name, $message);  | 
      ||
| 653 | }  | 
      ||
| 654 | |||
| 655 | /**
 | 
      ||
| 656 |  * Compatibility wrapper function for assertSame
 | 
      ||
| 657 |  *
 | 
      ||
| 658 |  * @param mixed $first
 | 
      ||
| 659 |  * @param mixed $second
 | 
      ||
| 660 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 661 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 662 |  * @return void
 | 
      ||
| 663 |  */
 | 
      ||
| 664 | protected static function assertReference(&$first, &$second, $message = '') {  | 
      ||
| 665 | return static::assertSame($first, $second, $message);  | 
      ||
| 666 | }  | 
      ||
| 667 | |||
| 668 | /**
 | 
      ||
| 669 |  * Compatibility wrapper for assertIsA
 | 
      ||
| 670 |  *
 | 
      ||
| 671 |  * @param string $object
 | 
      ||
| 672 |  * @param string $type
 | 
      ||
| 673 |  * @param string $message
 | 
      ||
| 674 |  * @deprecated 3.0.0 This is a compatiblity wrapper for 1.x. It will be removed in 3.0
 | 
      ||
| 675 |  * @return void
 | 
      ||
| 676 |  */
 | 
      ||
| 677 | protected static function assertIsA($object, $type, $message = '') {  | 
      ||
| 678 | return static::assertInstanceOf($type, $object, $message);  | 
      ||
| 679 | }  | 
      ||
| 680 | |||
| 681 | /**
 | 
      ||
| 682 |  * Compatibility function to test if value is between an acceptable range
 | 
      ||
| 683 |  *
 | 
      ||
| 684 |  * @param mixed $result
 | 
      ||
| 685 |  * @param mixed $expected
 | 
      ||
| 686 |  * @param mixed $margin the rage of acceptation
 | 
      ||
| 687 |  * @param string $message the text to display if the assertion is not correct
 | 
      ||
| 688 |  * @return void
 | 
      ||
| 689 |  */
 | 
      ||
| 690 | protected static function assertWithinMargin($result, $expected, $margin, $message = '') {  | 
      ||
| 691 | $upper = $result + $margin;  | 
      ||
| 692 | $lower = $result - $margin;  | 
      ||
| 693 | return static::assertTrue((($expected <= $upper) && ($expected >= $lower)), $message);  | 
      ||
| 694 | }  | 
      ||
| 695 | |||
| 696 | /**
 | 
      ||
| 697 |  * Compatibility function for skipping.
 | 
      ||
| 698 |  *
 | 
      ||
| 699 |  * @param bool $condition Condition to trigger skipping
 | 
      ||
| 700 |  * @param string $message Message for skip
 | 
      ||
| 701 |  * @return bool
 | 
      ||
| 702 |  */
 | 
      ||
| 703 | protected function skipUnless($condition, $message = '') {  | 
      ||
| 704 | if (!$condition) {  | 
      ||
| 705 | $this->markTestSkipped($message);  | 
      ||
| 706 | }  | 
      ||
| 707 | return $condition;  | 
      ||
| 708 | }  | 
      ||
| 709 |         // @codingStandardsIgnoreEnd
 | 
      ||
| 710 | |||
| 711 | /**
 | 
      ||
| 712 |  * Mock a model, maintain fixtures and table association
 | 
      ||
| 713 |  *
 | 
      ||
| 714 |  * @param string $model The model to get a mock for.
 | 
      ||
| 715 |  * @param mixed $methods The list of methods to mock
 | 
      ||
| 716 |  * @param array $config The config data for the mock's constructor.
 | 
      ||
| 717 |  * @throws MissingModelException
 | 
      ||
| 718 |  * @return Model
 | 
      ||
| 719 |  */
 | 
      ||
| 720 | public function getMockForModel($model, $methods = array(), $config = array()) {  | 
      ||
| 721 | $config += ClassRegistry::config('Model');  | 
      ||
| 722 | |||
| 723 | list($plugin, $name) = pluginSplit($model, true);  | 
      ||
| 724 | App::uses($name, $plugin . 'Model');  | 
      ||
| 725 | |||
| 726 | $config = array_merge((array)$config, array('name' => $name));  | 
      ||
| 727 | unset($config['ds']);  | 
      ||
| 728 | |||
| 729 | if (!class_exists($name)) {  | 
      ||
| 730 | throw new MissingModelException(array($model));  | 
      ||
| 731 | }  | 
      ||
| 732 | $mock = $this->getMock($name, $methods, array($config));  | 
      ||
| 733 | |||
| 734 | $availableDs = array_keys(ConnectionManager::enumConnectionObjects());  | 
      ||
| 735 | |||
| 736 | if ($mock->useDbConfig !== 'test' && in_array('test_' . $mock->useDbConfig, $availableDs)) {  | 
      ||
| 737 | $mock->setDataSource('test_' . $mock->useDbConfig);  | 
      ||
| 738 |                 } else {
 | 
      ||
| 739 | $mock->useDbConfig = 'test';  | 
      ||
| 740 | $mock->setDataSource('test');  | 
      ||
| 741 | }  | 
      ||
| 742 | |||
| 743 | ClassRegistry::removeObject($name);  | 
      ||
| 744 | ClassRegistry::addObject($name, $mock);  | 
      ||
| 745 | return $mock;  | 
      ||
| 746 | }  | 
      ||
| 747 | |||
| 748 | }  |