<?php
/**
 * A class to contain test cases and run them with shered fixtures
 *
 * PHP 5
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @package       cake
 * @subpackage    cake.cake.tests.libs
 * @since         CakePHP(tm) v 2.0
 * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)
 */
class CakeTestSuite extends PHPUnit_Framework_TestSuite {

/**
 * Instance of a fixture manager
 * @var CakeFixtureManager
 */
	protected $_fixtureManager = null;

/**
 * Sets the intances for the fixture manager that will be used by this class.
 *
 * @param CakeFixtureManager $manager the instance of the manager class
 * @return void
 * @access public
 */
	public function setFixtureManager(CakeFixtureManager $manager) {
		$this->_fixtureManager = $manager;
	}

/**
 * Adds all the files in a directory to the test suite. Does not recurse through directories.
 *
 * @param string $directory The directory to add tests from.
 * @return void
 */
	public function addTestDirectory($directory = '.') {
		$files = new DirectoryIterator($directory);

		foreach ($files as $file) {
			if (!$file->isFile()) {
				continue;
			}
			$file = $file->getRealPath();
			$this->addTestFile($file);
		}
	}

/**
 * Recursively adds all the files in a directory to the test suite.
 *
 * @param string $directory The directory subtree to add tests from.
 * @return void
 */
	public function addTestDirectoryRecursive($directory = '.') {
		$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

		foreach ($files as $file) {
			if (!$file->isFile()) {
				continue;
			}
			$file = $file->getRealPath();
			$this->addTestFile($file);
		}
	}

/**
 * Method that is called before the tests of this test suite are run.
 * It will load fixtures accordingly for each test.
 *
 * @return void
 * @access protected
 */
	protected function setUp() {
		parent::setUp();
		if (!$this->_fixtureManager) {
			return;
		}
		$classes = array();
		foreach ($this->getIterator() as $test) {
			$this->_fixtureManager->fixturize($test);
			$test->fixtureManager = $this->_fixtureManager;
		}
	}

/**
 * Method that is called after all the tests of this test suite are run.
 *
 * @return void
 * @access protected
 */
	protected function tearDown() {
		parent::tearDown();
		if ($this->_fixtureManager) {
			$this->_fixtureManager->shutDown();
		}
	}
}