From 1b7df549b9e8eb283d201606489c0e388c7917a2 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
Date: Wed, 11 Jun 2008 22:45:54 +0000
Subject: [PATCH] Tests added, dublicate classes removed

---
 .gitattributes                                |   9 +-
 .../main/controller/registration/.htaccess    |   1 -
 .../class_DefaultRegistrationController.php   |  71 ---
 inc/classes/main/database/classes/.htaccess   |   1 -
 .../classes/class_LocalFileDatabase.php       | 465 ------------------
 tests/ConfigTest.php                          |  41 +-
 tests/RegistryTest.php                        |  94 ++++
 tests/RequestTest.php                         | 102 ++++
 tests/Test.php                                |  54 ++
 tests/all-tests.sh                            |   3 +
 tests/unittest.sh                             |   5 +
 11 files changed, 295 insertions(+), 551 deletions(-)
 delete mode 100644 inc/classes/main/controller/registration/.htaccess
 delete mode 100644 inc/classes/main/controller/registration/class_DefaultRegistrationController.php
 delete mode 100644 inc/classes/main/database/classes/.htaccess
 delete mode 100644 inc/classes/main/database/classes/class_LocalFileDatabase.php
 create mode 100644 tests/RegistryTest.php
 create mode 100644 tests/RequestTest.php
 create mode 100644 tests/Test.php
 create mode 100644 tests/all-tests.sh
 create mode 100644 tests/unittest.sh

diff --git a/.gitattributes b/.gitattributes
index 63a4f43a18..49f206fb04 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -177,16 +177,12 @@ inc/classes/main/controller/default/class_WebDefaultController.php -text
 inc/classes/main/controller/default/class_WebDefaultNewsController.php -text
 inc/classes/main/controller/form/.htaccess -text
 inc/classes/main/controller/form/class_WebDoFormController.php -text
-inc/classes/main/controller/registration/.htaccess -text
-inc/classes/main/controller/registration/class_DefaultRegistrationController.php -text
 inc/classes/main/criteria/.htaccess -text
 inc/classes/main/criteria/class_SearchCriteria.php -text
 inc/classes/main/database/.htaccess -text
 inc/classes/main/database/class_ -text
 inc/classes/main/database/class_BaseDatabaseFrontend.php -text
 inc/classes/main/database/class_BaseDatabaseWrapper.php -text
-inc/classes/main/database/classes/.htaccess -text
-inc/classes/main/database/classes/class_LocalFileDatabase.php -text
 inc/classes/main/database/databases/.htaccess -text
 inc/classes/main/database/databases/class_LocalFileDatabase.php -text
 inc/classes/main/database/wrapper/.htaccess -text
@@ -277,3 +273,8 @@ templates/de/code/footer_msg.ctp -text
 templates/de/code/header.ctp -text
 templates/de/html/.htaccess -text
 tests/ConfigTest.php -text
+tests/RegistryTest.php -text
+tests/RequestTest.php -text
+tests/Test.php -text
+tests/all-tests.sh -text
+tests/unittest.sh -text
diff --git a/inc/classes/main/controller/registration/.htaccess b/inc/classes/main/controller/registration/.htaccess
deleted file mode 100644
index 3a42882788..0000000000
--- a/inc/classes/main/controller/registration/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Deny from all
diff --git a/inc/classes/main/controller/registration/class_DefaultRegistrationController.php b/inc/classes/main/controller/registration/class_DefaultRegistrationController.php
deleted file mode 100644
index 2f15e400db..0000000000
--- a/inc/classes/main/controller/registration/class_DefaultRegistrationController.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/**
- * A default registration controller which is suitable for most applications
- * with a registration form.
- *
- * @author		Roland Haeder <webmaster@ship-simu.org>
- * @version		0.0.0
- * @copyright	Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license		GNU GPL 3.0 or any newer version
- * @link		http://www.ship-simu.org
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class DefaultRegistrationController extends BaseController implements Controller {
-	/**
-	 * Private constructor
-	 *
-	 * @return	void
-	 */
-	protected function __construct () {
-		// Call parent constructor
-		parent::__construct(__CLASS__);
-
-		// Set part description
-		$this->setObjectDescription("Ein Standart-Anmelde-Controller");
-
-		// Create unique ID number
-		$this->createUniqueID();
-
-		// Clean up a little
-		$this->removeSystemArray();
-	}
-
-	/**
-	 * Creates an instance of this class
-	 *
-	 * @return	$controllerInstance		A prepared instance of this class
-	 */
-	public final static function createDefaultRegistrationController () {
-		// Create the instance
-		$controllerInstance = new DefaultRegistrationController();
-
-		// Return the prepared instance
-		return $controllerInstance;
-	}
-
-	/**
-	 * Handles the given request and response
-	 *
-	 * @param	$requestInstance	An instance of a request class
-	 * @param	$responseInstance	An instance of a response class
-	 * @return	void
-	 */
-	public function handleRequest (Requestable $requestInstance, Responseable $responseInstance) {
-		die(__METHOD__.": Stub!");
-	}
-}
-
-// [EOF]
-?>
diff --git a/inc/classes/main/database/classes/.htaccess b/inc/classes/main/database/classes/.htaccess
deleted file mode 100644
index 3a42882788..0000000000
--- a/inc/classes/main/database/classes/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Deny from all
diff --git a/inc/classes/main/database/classes/class_LocalFileDatabase.php b/inc/classes/main/database/classes/class_LocalFileDatabase.php
deleted file mode 100644
index 432a168f04..0000000000
--- a/inc/classes/main/database/classes/class_LocalFileDatabase.php
+++ /dev/null
@@ -1,465 +0,0 @@
-<?php
-/**
- * Database backend class for storing objects in locally created files.
- *
- * This class serializes objects and saves them to local files.
- *
- * @author		Roland Haeder <webmaster@ship-simu.org>
- * @version		0.0.0
- * @copyright	Copyright(c) 2007, 2008 Roland Haeder, this is free software
- * @license		GNU GPL 3.0 or any newer version
- * @link 		http://www.ship-simu.org
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontendInterface {
-	/**
-	 * Save path for "file database"
-	 */
-	private $savePath = "";
-
-	/**
-	 * The file's extension
-	 */
-	private $fileExtension = "serialized";
-
-	/**
-	 * The last read file's name
-	 */
-	private $lastFile = "";
-
-	/**
-	 * The last read file's content including header information
-	 */
-	private $lastContents = array();
-
-	/**
-	 * The private constructor. Do never instance from outside!
-	 * You need to set a local file path. The class will then validate it.
-	 *
-	 * @return	void
-	 */
-	protected function __construct() {
-		// Call parent constructor
-		parent::__construct(__CLASS__);
-
-		// Set description
-		$this->setObjectDescription("Class for local file databases");
-
-		// Create unique ID
-		$this->createUniqueID();
-
-		// Clean up a little
-		$this->removeSystemArray();
-	}
-
-	/**
-	 * Create an object of LocalFileDatabase and set the save path for local files.
-	 * This method also validates the given file path.
-	 *
-	 * @param		$savePath					The local file path string
-	 * @param		$ioInstance				The input/output handler. This
-	 *									should be FileIoHandler
-	 * @return	$dbInstance				An instance of LocalFileDatabase
-	 * @throws	SavePathIsEmptyException		If the given save path is an
-	 *									empty string
-	 * @throws	SavePathIsNoDirectoryException	If the save path is no
-	 *										path (e.g. a file)
-	 * @throws	SavePathReadProtectedException	If the save path is read-
-	 *										protected
-	 * @throws	SavePathWriteProtectedException	If the save path is write-
-	 *										protected
-	 */
-	public final static function createLocalFileDatabase ($savePath, FileIoHandler $ioInstance) {
-		// Get an instance
-		$dbInstance = new LocalFileDatabase();
-
-		if (empty($savePath)) {
-			// Empty string
-			throw new SavePathIsEmptyException($dbInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING);
-		} elseif (!is_dir($savePath)) {
-			// Is not a dir
-			throw new SavePathIsNoDirectoryException($savePath, self::EXCEPTION_INVALID_PATH_NAME);
-		} elseif (!is_readable($savePath)) {
-			// Path not readable
-			throw new SavePathReadProtectedException($savePath, self::EXCEPTION_READ_PROTECED_PATH);
-		} elseif (!is_writeable($savePath)) {
-			// Path not writeable
-			throw new SavePathWriteProtectedException($savePath, self::EXCEPTION_WRITE_PROTECED_PATH);
-		}
-
-		// Set save path and IO instance
-		$dbInstance->setSavePath($savePath);
-		$dbInstance->setFileIoInstance($ioInstance);
-
-		// Return database instance
-		return $dbInstance;
-	}
-
-	/**
-	 * Setter for save path
-	 *
-	 * @param		$savePath		The local save path where we shall put our serialized classes
-	 * @return	void
-	 */
-	public final function setSavePath ($savePath) {
-		// Secure string
-		$savePath = (string) $savePath;
-
-		// Set save path
-		$this->savePath = $savePath;
-	}
-
-	/**
-	 * Getter for save path
-	 *
-	 * @return	$savePath		The local save path where we shall put our serialized classes
-	 */
-	public final function getSavePath () {
-		return $this->savePath;
-	}
-
-	/**
-	 * Saves a given object to the local file system by serializing and
-	 * transparently compressing it
-	 *
-	 * @param		$object				The object we shall save to the local file system
-	 * @return	void
-	 * @throws	NullPointerException	If the object instance is null
-	 * @throws	NoObjectException		If the parameter $object is not
-	 *								an object
-	 */
-	public final function saveObject ($object) {
-		// Some tests on the parameter...
-		if (is_null($object)) {
-			// Is null, throw exception
-			throw new NullPointerException($object, self::EXCEPTION_IS_NULL_POINTER);
-		} elseif (!is_object($object)) {
-			// Is not an object, throw exception
-			throw new NoObjectException($object, self::EXCEPTION_IS_NO_OBJECT);
-		} elseif (!method_exists($object, '__toString')) {
-			// A highly required method was not found... :-(
-			throw new MissingMethodException(array($object, '__toString'), self::EXCEPTION_MISSING_METHOD);
-		}
-
-		// Get a string containing the serialized object. We cannot exchange
-		// $this and $object here because $object does not need to worry
-		// about it's limitations... ;-)
-		$serialized = $this->serializeObject($object);
-
-		// Get a path name plus file name and append the extension
-		$fqfn = $this->getSavePath() . $object->getPathFileNameFromObject() . "." . $this->getFileExtension();
-
-		// Save the file to disc we don't care here if the path is there,
-		// this must be done in later methods.
-		$this->getFileIoInstance()->saveFile($fqfn, array($this->getCompressorChannel()->getCompressorExtension(), $serialized));
-	}
-
-	/**
-	 * Get a serialized string from the given object
-	 *
-	 * @param		$object		The object we want to serialize and transparently
-	 *						compress
-	 * @return	$serialized	A string containing the serialzed/compressed object
-	 * @see		ObjectLimits	An object holding limition information
-	 * @see		SerializationContainer	A special container class for e.g.
-	 *								attributes from limited objects
-	 */
-	private function serializeObject ($object) {
-		// If there is no limiter instance we serialize the whole object
-		// otherwise only in the limiter object (ObjectLimits) specified
-		// attributes summarized in a special container class
-		if ($this->getLimitInstance() === null) {
-			// Serialize the whole object. This tribble call is the reason
-			// why we need a fall-back implementation in CompressorChannel
-			// of the methods compressStream() and decompressStream().
-			$serialized = $this->getCompressorChannel()->getCompressor()->compressStream(serialize($object));
-		} else {
-			// Serialize only given attributes in a special container
-			$container = SerializationContainer::createSerializationContainer($this->getLimitInstance(), $object);
-
-			// Serialize the container
-			$serialized = $this->getCompressorChannel()->getCompressor()->compressStream(serialize($container));
-		}
-
-		// Return the serialized object string
-		return $serialized;
-	}
-
-	/**
-	 * Analyses if a unique ID has already been used or not by search in the
-	 * local database folder.
-	 *
-	 * @param		$uniqueID		A unique ID number which shall be checked
-	 *						before it will be used
-	 * @param		$inConstructor	If we got called in a de/con-structor or
-	 *						from somewhere else
-	 * @return	$isUnused		true	= The unique ID was not found in the database,
-	 *						false = It is already in use by an other object
-	 * @throws	NoArrayCreatedException	If explode() fails to create an array
-	 * @throws	InvalidArrayCountException	If the array contains less or
-	 *									more than two elements
-	 */
-	public function isUniqueIdUsed ($uniqueID, $inConstructor = false) {
-		// Currently not used... ;-)
-		$isUsed = false;
-
-		// Split the unique ID up in path and file name
-		$pathFile = explode("@", $uniqueID);
-
-		// Are there two elements? Index 0 is the path, 1 the file name + global extension
-		if (!is_array($pathFile)) {
-			// No array found
-			if ($inConstructor) {
-				return false;
-			} else {
-				throw new NoArrayCreatedException(array($this, "pathFile"), self::EXCEPTION_ARRAY_EXPECTED);
-			}
-		} elseif (count($pathFile) != 2) {
-			// Invalid ID returned!
-			if ($inConstructor) {
-				return false;
-			} else {
-				throw new InvalidArrayCountException(array($this, "pathFile", count($pathFile), 2), self::EXCEPTION_ARRAY_HAS_INVALID_COUNT);
-			}
-		}
-
-		// Create full path name
-		$pathName = $this->getSavePath() . $pathFile[0];
-
-		// Check if the file is there with a file handler
-		if ($inConstructor) {
-			// No exceptions in constructors and destructors!
-			$dirInstance = FrameworkDirectoryPointer::createFrameworkDirectoryPointer($pathName, true);
-
-			// Has an object being created?
-			if (!is_object($dirInstance)) return false;
-		} else {
-			// Outside a constructor
-			try {
-				$dirInstance = FrameworkDirectoryPointer::createFrameworkDirectoryPointer($pathName);
-			} catch (PathIsNoDirectoryException $e) {
-				// Okay, path not found
-				return false;
-			}
-		}
-
-		// Initialize the search loop
-		$isValid = false;
-		while ($dataFile = $dirInstance->readDirectoryExcept(array(".", ".."))) {
-			// Generate FQFN for testing
-			$fqfn = sprintf("%s/%s", $pathName, $dataFile);
-			$this->setLastFile($fqfn);
-
-			// Get instance for file handler
-			$inputHandler = $this->getFileIoInstance();
-
-			// Try to read from it. This makes it sure that the file is
-			// readable and a valid database file
-			$this->setLastFileContents($inputHandler->loadFileContents($fqfn));
-
-			// Extract filename (= unique ID) from it
-			$ID = substr(basename($fqfn), 0, -(strlen($this->getFileExtension()) + 1));
-
-			// Is this the required unique ID?
-			if ($ID == $pathFile[1]) {
-				// Okay, already in use!
-				$isUsed = true;
-			}
-		}
-
-		// Close the directory handler
-		$dirInstance->closeDirectory();
-
-		// Now the same for the file...
-		return $isUsed;
-	}
-
-	/**
-	 * Setter for the last read file
-	 *
-	 * @param		$fqfn	The FQFN of the last read file
-	 * @return	void
-	 */
-	private final function setLastFile ($fqfn) {
-		// Cast string
-		$fqfn = (string) $fqfn;
-		$this->lastFile = $fqfn;
-	}
-
-	/**
-	 * Getter for last read file
-	 *
-	 * @return	$lastFile		The last read file's name with full path
-	 */
-	public final function getLastFile () {
-		return $this->lastFile;
-	}
-
-	/**
-	 * Setter for contents of the last read file
-	 *
-	 * @param		$contents		An array with header and data elements
-	 * @return	void
-	 */
-	private final function setLastFileContents ($contents) {
-		// Cast array
-		$contents = (array) $contents;
-		$this->lastContents = $contents;
-	}
-
-	/**
-	 * Getter for last read file's content as an array
-	 *
-	 * @return	$lastContent	The array with elements 'header' and 'data'.
-	 */
-	public final function getLastContents () {
-		return $this->lastContents;
-	}
-
-	/**
-	 * Getter for file extension
-	 *
-	 * @return	$fileExtension	The array with elements 'header' and 'data'.
-	 */
-	public final function getFileExtension () {
-		return $this->fileExtension;
-	}
-
-	/**
-	 * Get cached (last fetched) data from the local file database
-	 *
-	 * @param		$uniqueID		The ID number for looking up the data
-	 * @return	$object		The restored object from the maybe compressed
-	 *						serialized data
-	 * @throws	MismatchingCompressorsException	If the compressor from
-	 *										the loaded file
-	 *										mismatches with the
-	 *										current used one.
-	 * @throws	NullPointerException			If the restored object
-	 *										is null
-	 * @throws	NoObjectException				If the restored "object"
-	 *										is not an object instance
-	 * @throws	MissingMethodException			If the required method
-	 *										toString() is missing
-	 */
-	public final function getObjectFromCachedData ($uniqueID) {
-		// Get instance for file handler
-		$inputHandler = $this->getFileIoInstance();
-
-		// Get last file's name and contents
-		$fqfn = $this->repairFQFN($this->getLastFile(), $uniqueID);
-		$contents = $this->repairContents($this->getLastContents(), $fqfn);
-
-		// Let's decompress it. First we need the instance
-		$compressInstance = $this->getCompressorChannel();
-
-		// Is the compressor's extension the same as the one from the data?
-		if ($compressInstance->getCompressorExtension() != $contents['header'][0]) {
-			/**
-			 * @todo	For now we abort here but later we need to make this a little more dynamic.
-			 */
-			throw new MismatchingCompressorsException(array($this, $contents['header'][0], $fqfn, $compressInstance->getCompressorExtension()), self::EXCEPTION_MISMATCHING_COMPRESSORS);
-		}
-
-		// Decompress the data now
-		$serialized = $compressInstance->getCompressor()->decompressStream($contents['data']);
-
-		// And unserialize it...
-		$object = unserialize($serialized);
-
-		// This must become a valid object, so let's check it...
-		if (is_null($object)) {
-			// Is null, throw exception
-			throw new NullPointerException($object, self::EXCEPTION_IS_NULL_POINTER);
-		} elseif (!is_object($object)) {
-			// Is not an object, throw exception
-			throw new NoObjectException($object, self::EXCEPTION_IS_NO_OBJECT);
-		} elseif (!method_exists($object, '__toString')) {
-			// A highly required method was not found... :-(
-			throw new MissingMethodException(array($object, '__toString'), self::EXCEPTION_MISSING_METHOD);
-		}
-
-		// And return the object
-		return $object;
-	}
-
-	/**
-	 * Private method for re-gathering (repairing) the FQFN
-	 *
-	 * @param		$fqfn		The current FQFN we shall validate
-	 * @param		$uniqueID		The unique ID number
-	 * @return	$fqfn		The repaired FQFN when it is empty
-	 * @throws	NoArrayCreatedException		If explode() has not
-	 *									created an array
-	 * @throws	InvalidArrayCountException	If the array count is not
-	 *									as the expected
-	 */
-	private function repairFQFN ($fqfn, $uniqueID) {
-		// Cast both strings
-		$fqfn     = (string) $fqfn;
-		$uniqueID = (string) $uniqueID;
-
-		// Is there pre-cached data available?
-		if (empty($fqfn)) {
-			// Split the unique ID up in path and file name
-			$pathFile = explode("@", $uniqueID);
-
-			// Are there two elements? Index 0 is the path, 1 the file name + global extension
-			if (!is_array($pathFile)) {
-				// No array found
-				throw new NoArrayCreatedException(array($this, "pathFile"), self::EXCEPTION_ARRAY_EXPECTED);
-			} elseif (count($pathFile) != 2) {
-				// Invalid ID returned!
-				throw new InvalidArrayCountException(array($this, "pathFile", count($pathFile), 2), self::EXCEPTION_ARRAY_HAS_INVALID_COUNT);
-			}
-
-			// Create full path name
-			$pathName = $this->getSavePath() . $pathFile[0];
-
-			// Nothing cached, so let's create a FQFN first
-			$fqfn = sprintf("%s/%s.%s", $pathName, $pathFile[1], $this->getFileExtension());
-			$this->setLastFile($fqfn);
-		}
-
-		// Return repaired FQFN
-		return $fqfn;
-	}
-
-	/**
-	 * Private method for re-gathering the contents of a given file
-	 *
-	 * @param		$contents		The (maybe) already cached contents as an array
-	 * @param		$fqfn		The current FQFN we shall validate
-	 * @return	$contents		The repaired contents from the given file
-	 */
-	private function repairContents ($contents, $fqfn) {
-		// Is there some content and header (2 indexes) in?
-		if ((!is_array($contents)) || (count($contents) != 2) || (!isset($contents['header'])) || (!isset($contents['data']))) {
-			// No content found so load the file again
-			$contents = $inputHandler->loadFileContents($fqfn);
-
-			// And remember all data for later usage
-			$this->setLastContents($contents);
-		}
-
-		// Return the repaired contents
-		return $contents;
-	}
-
-	/* DUMMY */ public final function loadObject () {}
-}
-
-// [EOF]
-?>
diff --git a/tests/ConfigTest.php b/tests/ConfigTest.php
index 84b245d496..1091a5b8a9 100644
--- a/tests/ConfigTest.php
+++ b/tests/ConfigTest.php
@@ -1,28 +1,51 @@
 <?php
+print (basename(__FILE__).": Init...\n");
+
 // Change directory
 @chdir("..");
 
 // Load config file
-require(dirname(dirname(__FILE__)) . "/inc/config.php");
+require(dirname(dirname(__FILE__)) . '/inc/config.php');
 
 // Load all include files
-require(PATH . "inc/includes.php");
+require(PATH . 'inc/includes.php');
 
 // Load all game classes
-require(PATH . "inc/classes.php");
+require(PATH . 'inc/classes.php');
 
 // Set default application
-FrameworkConfiguration::getInstance()->setConfigEntry("default_application", "ship-simu");
+FrameworkConfiguration::getInstance()->setConfigEntry('default_application', 'ship-simu');
 
 // Set testing mode (no starter.php will be loaded!)
 define('TEST_MODE', true);
 
 // Load the PHPUnit framework
-require_once("PHPUnit/Framework.php");
+require_once('PHPUnit/Framework.php');
+
+print (basename(__FILE__).": Init completed.\n\n");
 
 /**
  * A test case for the configuration sub system
  *
+ * @author		Roland Haeder <webmaster@mxchange.org>
+ * @version		0.0.0
+ * @copyright	Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license		GNU GPL 3.0 or any newer version
+ * @link 		http://www.ship-simu.org
+ * @see			http://www.phpunit.de
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 class ConfigTest extends PHPUnit_Framework_TestCase {
 	/**
@@ -39,7 +62,7 @@ class ConfigTest extends PHPUnit_Framework_TestCase {
 			$cfg = FrameworkConfiguration::getInstance();
 
 			// Now find a configuration variable that does not exist
-			$dummy = $cfg->readConfig("does_not_exist");
+			$dummy = $cfg->readConfig('does_not_exist');
 		} catch (ConfigEntryNotFoundException $expected) {
 			// This exception was expected, so it is fine
 			$testPassed = true;
@@ -97,7 +120,7 @@ class ConfigTest extends PHPUnit_Framework_TestCase {
 			$cfg = FrameworkConfiguration::getInstance();
 
 			// Try to read an empty configuration variable
-			$cfg->setConfigEntry("", "will_never_be_set");
+			$cfg->setConfigEntry("", 'will_never_be_set');
 		} catch (ConfigEntryIsEmptyException $expected) {
 			// This exception was expected, so it is fine
 			$testPassed = true;
@@ -125,10 +148,10 @@ class ConfigTest extends PHPUnit_Framework_TestCase {
 			$cfg = FrameworkConfiguration::getInstance();
 
 			// Try to read an empty configuration variable
-			$cfg->setConfigEntry("test_key", "{$value}");
+			$cfg->setConfigEntry('test_key', "{$value}");
 
 			// Read the config entry we have just written
-			$readValue = $cfg->readConfig("test_key");
+			$readValue = $cfg->readConfig('test_key');
 
 			// Now test the values
 			$this->assertEquals($value, $readValue);
diff --git a/tests/RegistryTest.php b/tests/RegistryTest.php
new file mode 100644
index 0000000000..4efbbb0168
--- /dev/null
+++ b/tests/RegistryTest.php
@@ -0,0 +1,94 @@
+<?php
+print (basename(__FILE__).": Init...\n");
+
+// Change directory
+@chdir("..");
+
+// Load config file
+require(dirname(dirname(__FILE__)) . '/inc/config.php');
+
+// Load all include files
+require(PATH . 'inc/includes.php');
+
+// Load all game classes
+require(PATH . 'inc/classes.php');
+
+// Set default application
+FrameworkConfiguration::getInstance()->setConfigEntry('default_application', 'ship-simu');
+
+// Set testing mode (no starter.php will be loaded!)
+define('TEST_MODE', true);
+
+// Load the PHPUnit framework
+require_once('PHPUnit/Framework.php');
+
+print (basename(__FILE__).": Init completed.\n\n");
+
+/**
+ * A test case for the registry
+ *
+ * @author		Roland Haeder <webmaster@mxchange.org>
+ * @version		0.0.0
+ * @copyright	Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license		GNU GPL 3.0 or any newer version
+ * @link 		http://www.ship-simu.org
+ * @see			http://www.phpunit.de
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class RegistryTest extends PHPUnit_Framework_TestCase {
+	/**
+	 * Tests if we can store an instance to the registry
+	 *
+	 * @return void
+	 */
+	public function testInstanceRegistryAdd () {
+		// Get a registry instance
+		$registryInstance = Registry::getRegistry();
+
+		// Create a User instance
+		$userInstance = User::createUserByEmail("webmaster@mxchange.org");
+
+		// Now store the instance in the registry
+		$registryInstance->addInstance('user', $userInstance);
+
+		// Test if the registry key is there
+		if (!$registryInstance->instanceExists('user')) {
+			$this->fail("Registry test failed: Cannot locate our user instance in registry!");
+		}
+	}
+
+	/**
+	 * Tests if we can store an instance to the registry
+	 *
+	 * @return void
+	 */
+	public function testInstanceRegistryCompare () {
+		// Get a registry instance
+		$registryInstance = Registry::getRegistry();
+
+		// And get it back
+		$userInstance = $registryInstance->getInstance('user');
+
+		// Compare both unique keys
+		$testPassed = ($userInstance instanceof ManageableUser);
+
+		// Test passed?
+		if (!$testPassed) {
+			$this->fail("Registry test failed: Method getInstance() returned a non-object.");
+		}
+	}
+}
+
+?>
diff --git a/tests/RequestTest.php b/tests/RequestTest.php
new file mode 100644
index 0000000000..75107b4398
--- /dev/null
+++ b/tests/RequestTest.php
@@ -0,0 +1,102 @@
+<?php
+print (basename(__FILE__).": Init...\n");
+
+// Change directory
+@chdir("..");
+
+// Load config file
+require(dirname(dirname(__FILE__)) . '/inc/config.php');
+
+// Load all include files
+require(PATH . 'inc/includes.php');
+
+// Load all game classes
+require(PATH . 'inc/classes.php');
+
+// Set default application
+FrameworkConfiguration::getInstance()->setConfigEntry('default_application', 'ship-simu');
+
+// Set testing mode (no starter.php will be loaded!)
+define('TEST_MODE', true);
+
+// Load the PHPUnit framework
+require_once('PHPUnit/Framework.php');
+
+print (basename(__FILE__).": Init completed.\n\n");
+
+/**
+ * A test case for faked HTTP requests. This is faked because we *set*
+ * $_REQUEST here. This should be made better in PHP6... :(
+ *
+ * @author		Roland Haeder <webmaster@mxchange.org>
+ * @version		0.0.0
+ * @copyright	Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license		GNU GPL 3.0 or any newer version
+ * @link 		http://www.ship-simu.org
+ * @see			http://www.phpunit.de
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class RequestTest extends PHPUnit_Framework_TestCase {
+	/**
+	 * A non-exist request element is being asked for. null is the expected
+	 * result from the class
+	 *
+	 * @return	void
+	 */
+	public function testMissingRequestElement () {
+		// Get a request instance
+		$requestInstance = HttpRequest::createHttpRequest();
+
+		// Get the element
+		$nonExist = $requestInstance->getRequestElement('never_there');
+
+		// Is this null?
+		if (!is_null($nonExist)) {
+			// Is not null!
+			$this->fail(sprintf("[%s:] Unexpected type %s received from request handler.",
+				$requestInstance->__toString(),
+				gettype($nonExists)
+			));
+		}
+	}
+
+	/**
+	 * Now fake a request array and try the test on it again
+	 *
+	 * @return	void
+	 */
+	public function testFakeRequestElement () {
+		// Fake the request here
+		$_REQUEST = array('test_key' => "test_value");
+
+		// Again get an instance
+		$requestInstance = HttpRequest::createHttpRequest();
+
+		// Get the element
+		$testValue = $requestInstance->getRequestElement('test_key');
+
+		// Is it the same?
+		if ($testValue !== "test_value") {
+			// Something went wrong
+			$this->fail(sprintf("[%s] Unexpected value %s (%s) from test key received.",
+				$requestInstance->__toString(),
+				$testValue,
+				gettype($testValue)
+			));
+		}
+	}
+}
+
+?>
diff --git a/tests/Test.php b/tests/Test.php
new file mode 100644
index 0000000000..284f9b22a1
--- /dev/null
+++ b/tests/Test.php
@@ -0,0 +1,54 @@
+<?php
+print (basename(__FILE__).": Init...\n");
+
+// Change directory
+@chdir("..");
+
+// Load config file
+require(dirname(dirname(__FILE__)) . '/inc/config.php');
+
+// Load all include files
+require(PATH . 'inc/includes.php');
+
+// Load all game classes
+require(PATH . 'inc/classes.php');
+
+// Set default application
+FrameworkConfiguration::getInstance()->setConfigEntry('default_application', 'ship-simu');
+
+// Set testing mode (no starter.php will be loaded!)
+define('TEST_MODE', true);
+
+// Load the PHPUnit framework
+require_once('PHPUnit/Framework.php');
+
+print (basename(__FILE__).": Init completed.\n\n");
+die("You need to remove this line (".__LINE__.") and implement this test!\n");
+
+/**
+ * A test case for 
+ *
+ * @author		Roland Haeder <webmaster@mxchange.org>
+ * @version		0.0.0
+ * @copyright	Copyright(c) 2007, 2008 Roland Haeder, this is free software
+ * @license		GNU GPL 3.0 or any newer version
+ * @link 		http://www.ship-simu.org
+ * @see			http://www.phpunit.de
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+class Test extends PHPUnit_Framework_TestCase {
+}
+
+?>
diff --git a/tests/all-tests.sh b/tests/all-tests.sh
new file mode 100644
index 0000000000..13c704a648
--- /dev/null
+++ b/tests/all-tests.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+find -type f -name "*Test.php" -not -name "Test.php" -exec sh ./unittest.sh {} \;
diff --git a/tests/unittest.sh b/tests/unittest.sh
new file mode 100644
index 0000000000..18e210c5a9
--- /dev/null
+++ b/tests/unittest.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+FILE=`echo $1 | cut -d "/" -f 2`
+
+phpunit --wait $FILE
-- 
2.39.5