<?php
/**
 * MagicDbTest file
 *
 * PHP versions 4 and 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.libs
 * @since         CakePHP(tm) v 1.2.0
 * @license       MIT License (http://www.opensource.org/licenses/mit-license.php)
 */
if (!class_exists('MagicDb')) {
	require LIBS . 'magic_db.php';
}
/**
 * The test class for the MagicDb class
 *
 * @package       cake
 * @subpackage    cake.tests.cases.libs
 */
class MagicDbTest extends UnitTestCase {
/**
 * The MagicDb instance to be tested
 *
 * @var MagicDb
 * @access public
 */
	var $Db = null;
/**
 * Sets up a MagicDb class instance for testing
 *
 * @access public
 */
	function setUp() {
		$this->Db =& new MagicDb();
	}
/**
 * MagicDb::analyze should properly detect the file type and output additional info as requested.
 *
 * @access public
 */
	function testAnalyze() {
		$r = $this->Db->read(MagicDbTestData::get('magic.db'));
		$this->assertTrue($r === true);

		$r = $this->Db->analyze(array());
		$this->assertTrue($r === false);

		$r = $this->Db->analyze(WWW_ROOT.'img'.DS.'cake.icon.gif');
		// TODO: Check several serialized file samples for accurate detection
	}
/**
 * MagicDb::read should properly read MagicDb databases from .php-/.db-files and plain data arguments passed in and return false if the file wasn't found or
 * if the readed data did not validate.
 *
 * @access public
 */
	function testRead() {
		$this->Db->db = array();

		$r = $this->Db->read(true);
		$this->assertTrue($r === false);
		$r = $this->Db->read(5);
		$this->assertTrue($r === false);

		$this->Db->db = array('a');
		$r = $this->Db->read(array('foo' => 'bar'));
		$this->assertTrue($r === false);
		$this->assertTrue($this->Db->db === array('a'));

		$magicDb = array('header' => array(), 'database' => array());
		$r = $this->Db->read($magicDb);
		$this->assertTrue($r === true);
		$this->assertTrue($this->Db->db === $magicDb);

		// @TODO: Test parsing an actual magic.db file

		$r = $this->Db->read('does-not-exist.db');
		$this->assertTrue($r === false);
		$this->assertTrue($this->Db->db === $magicDb);

		if (file_exists(VENDORS.'magic.php')) {
			$r = $this->Db->read(VENDORS.'magic.php');
			$this->assertTrue($r === true);
			$this->assertTrue($this->Db->db === array('header' => array(), 'database' => array()));
		}

		$r = $this->Db->read(MagicDbTestData::get('magic.snippet.db'));
		$this->assertTrue($r === true);
	}
/**
 * MagicDb::toArray should either return the MagicDb::db property, or the parsed array data if a magic.db dump is passed in as the first argument
 *
 * @access public
 */
	function testToArray() {
		$this->Db->db = array();

		$r = $this->Db->toArray();
		$this->assertTrue($r === array());
		$this->Db->db = array('foo' => 'bar');
		$r = $this->Db->toArray();
		$this->assertTrue($r === array('foo' => 'bar'));

		$r = $this->Db->toArray(array('yeah'));
		$this->assertTrue($r === array('yeah'));

		$r = $this->Db->toArray("# FILE_ID DB\r\n# Date:2009-10-10\r\n# Source:xxx.php");
		$this->assertTrue($r === array());

		$r = $this->Db->toArray('foo');
		$this->assertTrue($r === array());

		$r = $this->Db->toArray(MagicDbTestData::get('magic.snippet.db'));
		$this->assertTrue($r === MagicDbTestData::get('magic.snippet.db.result'));
	}
/**
 * The MagicDb::validates function should return if the array passed to it or the local db property contains a valid MagicDb record set
 *
 * @access public
 */
	function testValidates() {
		$r = $this->Db->validates(array());
		$this->assertTrue($r === false);

		$r = $this->Db->validates(array('header' => true, 'database' => true));
		$this->assertTrue($r === false);
		$magicDb = array('header' => array(), 'database' => array());
		$r = $this->Db->validates($magicDb);
		$this->assertTrue($r === true);

		$this->Db->db = array();
		$r = $this->Db->validates();
		$this->assertTrue($r === false);

		$this->Db->db = $magicDb;
		$r = $this->Db->validates();
		$this->assertTrue($r === true);
	}
}
/**
 * Test data holding object for MagicDb tests
 *
 * @package       cake
 * @subpackage    cake.tests.cases.libs
 */
/**
 * MagicDbTestData class
 *
 * @package       cake
 * @subpackage    cake.tests.cases.libs
 */
class MagicDbTestData extends Object {
/**
 * Base64 encoded data
 *
 * @var array
 * @access public
 */
	var $data = array(
		'magic.snippet.db' => 'IyBGSUxFX0lEIERCDQojIERhdGU6MjAwNS0wMy0yOQ0KIyBTb3VyY2U6aHR0cDovL3d3dy5tYWdpY2RiLm9yZw0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBoZWxwIGZpbGUNCiY5CWJ5dGUJMHgwMgkNCj4xMCBieXRlCXgJLCB2ZXJzaW9uICVkDQo+MTEJYnl0ZQl4CS4lZA0KDQojIE1hZ2ljIElEIGZvciBXb3JkcGVyZmVjdCBmaWxlcy4NCiMgU3VibWl0dGVkIG9uIDIwMDQtMDItMTQgYnkgQ2FybA0KMAlzdHJpbmcJXFx4RkZXUEMJW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBhcHBsaWNhdGlvbiByZXNvdXJjZSBsaWJyYXJ5DQomOQlieXRlCTUxCQ0KPjEwCWJ5dGUJeAksIHZlcnNpb24gJWQNCj4xMQlieXRlCXgJLiVkDQoNCiMgTWFnaWMgSUQgZm9yIFdvcmRwZXJmZWN0IGZpbGVzLg0KIyBTdWJtaXR0ZWQgb24gMjAwNC0wMi0xNCBieSBDYXJsDQowCXN0cmluZwlcXHhGRldQQwlbZmlkPTAwMDAwMTAwOC0wMC0wMDAwMDAxO2V4dD07bWltZT07XVdvcmRwZXJmZWN0IGJsb2NrIGZpbGUNCiY5CWJ5dGUJMTMJDQo+MTAJYnl0ZQl4CSwgdmVyc2lvbiAlZA0KPjExCWJ5dGUJeAkuJWQ=',
		'magic.snippet.db.result' => 'YToyOntzOjY6ImhlYWRlciI7YToyOntzOjQ6IkRhdGUiO3M6MTA6IjIwMDUtMDMtMjkiO3M6NjoiU291cmNlIjtzOjIyOiJodHRwOi8vd3d3Lm1hZ2ljZGIub3JnIjt9czo4OiJkYXRhYmFzZSI7YToyOntpOjA7YTo0OntpOjA7YTo0OntpOjA7czoxOiIwIjtpOjE7czo2OiJzdHJpbmciO2k6MjtzOjg6IlxceEZGV1BDIjtpOjM7czo1OToiW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBoZWxwIGZpbGUiO31pOjE7YTo0OntpOjA7czoyOiImOSI7aToxO3M6NDoiYnl0ZSI7aToyO3M6NDoiMHgwMiI7aTozO3M6MDoiIjt9aToyO2E6Mzp7aTowO3M6ODoiPjEwIGJ5dGUiO2k6MTtzOjE6IngiO2k6MjtzOjEyOiIsIHZlcnNpb24gJWQiO31pOjM7YTo0OntpOjA7czozOiI+MTEiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjE6IngiO2k6MztzOjM6Ii4lZCI7fX1pOjE7YTo0OntpOjA7YTo0OntpOjA7czoxOiIwIjtpOjE7czo2OiJzdHJpbmciO2k6MjtzOjg6IlxceEZGV1BDIjtpOjM7czo3ODoiW2ZpZD0wMDAwMDEwMDgtMDAtMDAwMDAwMTtleHQ9O21pbWU9O11Xb3JkcGVyZmVjdCBhcHBsaWNhdGlvbiByZXNvdXJjZSBsaWJyYXJ5Ijt9aToxO2E6NDp7aTowO3M6MjoiJjkiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjI6IjUxIjtpOjM7czowOiIiO31pOjI7YTo0OntpOjA7czozOiI+MTAiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjE6IngiO2k6MztzOjEyOiIsIHZlcnNpb24gJWQiO31pOjM7YTo0OntpOjA7czozOiI+MTEiO2k6MTtzOjQ6ImJ5dGUiO2k6MjtzOjE6IngiO2k6MztzOjM6Ii4lZCI7fX19fQ==',
		'magic.db' => '[encoded data, 126816 characters]'
	);
/**
 * Returns the test data for a given key
 *
 * @param string $key
 * @access public
 */
	function get($key) {
/**
 * data property
 *
 * @var array
 * @access public
 */
		static $data = array();

		if (empty($data)) {
			$vars = get_class_vars(__CLASS__);
			foreach ($vars['data'] as $k => $v) {
				$data[$k] = base64_decode($v);
				if (preg_match('/^[ais]:[0-9]+/', $data[$k])) {
					$data[$k] = unserialize($data[$k]);
				}
			}
		}

		if (!isset($data[$key])) {
			return false;
		}
		return $data[$key];
	}
}
