--- /dev/null
+<?php
+
+// Same namespace as target class
+namespace CoreFramework\Configuration;
+
+// Inport framework stuff
+use CoreFramework\Loader\ClassLoader;
+use CoreFramework\Generic\NullPointerException;
+
+// Import PHPUnit stuff
+use PHPUnit\Framework\Error\Notice;
+use PHPUnit\Framework\TestCase;
+
+// Import SPL stuff
+use \InvalidArgumentException;
+
+/*
+ * Copyright (C) 2017 Roland Haeder<roland@mxchange.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 FrameworkConfigurationTest extends TestCase {
+
+ /**
+ * The configuration instance being tested
+ */
+ private static $configInstance = NULL;
+
+ /**
+ * Setup test case
+ */
+ public function setUp() {
+ // Trace message
+ //* NOISY-DEBUG: */ printf('[%s:%d]: CALLED!' . PHP_EOL, __METHOD__, __LINE__);
+
+ // Call parent method
+ parent::setUp();
+
+ // Trace message
+ //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__);
+
+ }
+
+ /**
+ * Setup test case
+ */
+ public static function setUpBeforeClass() {
+ // Trace message
+ //* NOISY-DEBUG: */ printf('[%s:%d]: CALLED!' . PHP_EOL, __METHOD__, __LINE__);
+
+ // Call parent method
+ parent::setUpBeforeClass();
+
+ // Init instance
+ self::$configInstance = FrameworkConfiguration::getSelfInstance();
+
+ /*
+ * Disable strict naming-convention check in own class loader, because
+ * PHP_Invoker doesn't have namespaces.
+ */
+ ClassLoader::enableStrictNamingConventionCheck(FALSE);
+
+ // Trace message
+ //* NOISY-DEBUG: */ printf('[%s:%d]: EXIT!' . PHP_EOL, __METHOD__, __LINE__);
+ }
+
+ /**
+ * Tests if __toString() returns proper name
+ */
+ public function testConfigToStringClassName () {
+ // Get it
+ $className = self::$configInstance->__toString();
+
+ // Should be equal
+ $this->assertEquals('CoreFramework\Configuration\FrameworkConfiguration', $className);
+ }
+
+ /**
+ * Tests getting a singleton instance
+ */
+ public function testGettingSelfConfigInstance () {
+ // Get instance
+ $dummyInstance = FrameworkConfiguration::getSelfInstance();
+
+ // Should be equal to own instance
+ $this->assertEquals(self::$configInstance, $dummyInstance);
+ }
+
+ /**
+ * Tests equals() method
+ */
+ public function testEqualsConfigInstance () {
+ // Get instance
+ $dummyInstance = FrameworkConfiguration::getSelfInstance();
+
+ // Should return TRUE
+ $this->assertTrue(self::$configInstance->equals($dummyInstance));
+ }
+
+ /**
+ * Tests hashCode() method
+ */
+ public function testHashCodeConfigInstance () {
+ // Get instance
+ $dummyInstance = FrameworkConfiguration::getSelfInstance();
+
+ // Get hash code from both
+ $hashCodeExpected = self::$configInstance->hashCode();
+ $hashCodeActual = $dummyInstance->hashCode();
+
+ // Should be equal
+ $this->assertEquals($hashCodeExpected, $hashCodeActual);
+ }
+
+ /**
+ * Tests if getting configuration entry returns an array
+ */
+ public function testGettingConfigurationArray () {
+ // Get it
+ $config = self::$configInstance->getConfigurationArray();
+
+ // Should be an array
+ $this->assertTrue(is_array($config));
+ }
+
+ /**
+ * Tests if getting configuration entry returns a filled array
+ */
+ public function testGettingfilledConfigurationArray () {
+ // Get it
+ $config = self::$configInstance->getConfigurationArray();
+
+ // Should be an array
+ $this->assertTrue(count($config) > 0);
+ }
+
+ /**
+ * Tests if getting whole configuration entry is the same for another
+ * singleton instance
+ */
+ public function testSameConfigurationArrayGetter () {
+ // Get instance
+ $dummyInstance = FrameworkConfiguration::getSelfInstance();
+
+ // Get it from both instances
+ $config1 = self::$configInstance->getConfigurationArray();
+ $config2 = $dummyInstance->getConfigurationArray();
+
+ // Should be the same
+ $this->assertEquals($config1, $config2);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when check for a NULL key
+ */
+ public function testCheckingNullConfigKey () {
+ // Will throw this exception
+ $this->expectException(NullPointerException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet(NULL);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking a boolean key
+ */
+ public function testCheckingBooleanConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet(FALSE);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking an empty key
+ */
+ public function testCheckingEmptyConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet('');
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking an array key
+ */
+ public function testCheckingArrayConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet(array());
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking a decimal key
+ */
+ public function testCheckingDecimalConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet(12345);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking a float key
+ */
+ public function testCheckingFloatConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet(123.45);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking an object key
+ */
+ public function testCheckingObjectConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet($this);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when checking a resource key
+ */
+ public function testCheckingResourceConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Init some resource
+ $resource = fopen(__FILE__, 'r');
+
+ // Test it
+ $dummy = self::$configInstance->isConfigurationEntrySet($resource);
+ }
+
+ /**
+ * Tests if checking an existing (well-known) key can be found and returns
+ * TRUE.
+ */
+ public function testCheckingExistingConfigKey () {
+ // Should return TRUE
+ $this->assertTrue(self::$configInstance->isConfigurationEntrySet('application_base_path'));
+ }
+
+ /**
+ * Tests if checking a non-existing key will return FALSE.
+ */
+ public function testCheckingNonExistingConfigKey () {
+ // Should return FALSE
+ $this->assertFalse(self::$configInstance->isConfigurationEntrySet('__non_existing_key__'));
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting a NULL key
+ */
+ public function testGettingNullConfigKey () {
+ // Will throw this exception
+ $this->expectException(NullPointerException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry(NULL);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting a boolean key
+ */
+ public function testGettingBooleanConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry(FALSE);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting an empty key
+ */
+ public function testGettingEmptyConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry('');
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting a decimal key
+ */
+ public function testGettingDecimalConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry(12345);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting a float key
+ */
+ public function testGettingFloatConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry(123.45);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting an array key
+ */
+ public function testGettingArrayConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry(array());
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting an object key
+ */
+ public function testGettingObjectConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry($this);
+ }
+
+ /**
+ * Tests if a proper exception is thrown when getting a resource key
+ */
+ public function testGettingResourceConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Init some resource
+ $resource = fopen(__FILE__, 'r');
+
+ // Test it
+ $dummy = self::$configInstance->getConfigEntry($resource);
+ }
+
+ /**
+ * Tests if getting a non-existing key will cause a proper exception been
+ * thrown.
+ */
+ public function testGettingNonExistingConfigKey () {
+ // Should cause this exception
+ $this->expectException(NoConfigEntryException::class);
+
+ // Get non-existing key
+ $dummy = self::$configInstance->getConfigEntry('__non_existing_key__');
+ }
+
+ /**
+ * Tests if a generic key 'application_base_path' can be found.
+ */
+ public function testGettingConfigKeyApplicationBasePathExists () {
+ // Get it from config instance
+ $value = self::$configInstance->getConfigEntry('application_base_path');
+
+ // Is it a readable path?
+ $this->assertDirectoryIsReadable($value);
+ }
+
+ /**
+ * Tests setting a NULL key (value doesn't matter)
+ */
+ public function testSettingNullConfigKey () {
+ // Will throw this exception
+ $this->expectException(NullPointerException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry(NULL, 'foo');
+ }
+
+ /**
+ * Tests setting a boolean key (value doesn't matter)
+ */
+ public function testSettingBooleanConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry(FALSE, 'foo');
+ }
+
+ /**
+ * Tests setting an empty key (value doesn't matter)
+ */
+ public function testSettingEmptyConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry('', 'foo');
+ }
+
+ /**
+ * Tests setting a decimal key (value doesn't matter)
+ */
+ public function testSettingDecimalConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry(12345, 'foo');
+ }
+
+ /**
+ * Tests setting a float key (value doesn't matter)
+ */
+ public function testSettingFloatConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry(123.45, 'foo');
+ }
+
+ /**
+ * Tests setting an array key (value doesn't matter)
+ */
+ public function testSettingArrayConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry(array(), 'foo');
+ }
+
+ /**
+ * Tests setting an object key (value doesn't matter)
+ */
+ public function testSettingObjectConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry($this, 'foo');
+ }
+
+ /**
+ * Tests setting a resource key (value doesn't matter)
+ */
+ public function testSettingResourceConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Init some resource
+ $resource = fopen(__FILE__, 'r');
+
+ // Test it
+ self::$configInstance->setConfigEntry($resource, 'foo');
+ }
+
+ /**
+ * Tests setting a valid key but array for value
+ */
+ public function testSettingArrayValueConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry('foo', array());
+ }
+
+ /**
+ * Tests setting a valid key but object for value
+ */
+ public function testSettingObjectValueConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setConfigEntry('foo', $this);
+ }
+
+ /**
+ * Tests setting a valid key but resource for value
+ */
+ public function testSettingResourceValueConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Init some resource
+ $resource = fopen(__FILE__, 'r');
+
+ // Test it
+ self::$configInstance->setConfigEntry('foo', $resource);
+ }
+
+ /**
+ * Tests unsetting NULL key
+ */
+ public function testUnsettingNullConfigKey () {
+ // Will throw this exception
+ $this->expectException(NullPointerException::class);
+
+ // Test it
+ self::$configInstance->unsetConfigEntry(NULL);
+ }
+
+ /**
+ * Tests unsetting an empty key
+ */
+ public function testUnettingEmptyConfigKey () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->unsetConfigEntry('');
+ }
+
+ /**
+ * Tests unsetting a non-existing key
+ */
+ public function testUnettingNonExistingConfigKey () {
+ // Will throw this exception
+ $this->expectException(NoConfigEntryException::class);
+
+ // Test it
+ self::$configInstance->unsetConfigEntry('__non_existing_key__');
+ }
+
+ /**
+ * Tests setting and getting a key will return same value of same type
+ * (NULL). This unit test does also unset the then existing key.
+ */
+ public function testSettingGettiingNullConfigKey () {
+ // Set test value
+ self::$configInstance->setConfigEntry('__test_key', NULL);
+
+ // Get it
+ $value = self::$configInstance->getConfigEntry('__test_key');
+
+ // Must be equal
+ $this->assertEquals(NULL, $value);
+
+ // Unset it
+ self::$configInstance->unsetConfigEntry('__test_key');
+ }
+
+ /**
+ * Tests setting and getting a key will return same value of same type.
+ * This unit test does also unset the then existing key.
+ */
+ public function testSettingGettiingConfigKey () {
+ // Set test value
+ self::$configInstance->setConfigEntry('__test_key', 'foo');
+
+ // Get it
+ $value = self::$configInstance->getConfigEntry('__test_key');
+
+ // Must be equal
+ $this->assertEquals('foo', $value);
+
+ // Unset it
+ self::$configInstance->unsetConfigEntry('__test_key');
+ }
+
+ /**
+ * Tests setting a NULL default timezone
+ */
+ public function testSettingNullDefaultTimezone () {
+ // Will throw this exception
+ $this->expectException(NullPointerException::class);
+
+ // Test it
+ self::$configInstance->setDefaultTimezone(NULL);
+ }
+
+ /**
+ * Tests setting an empty default timezone
+ */
+ public function testSettingEmptyDefaultTimezone () {
+ // Will throw this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setDefaultTimezone('');
+ }
+
+ /**
+ * Tests setting invalid timezone
+ */
+ public function testSettingInvalidDefaultTimezone () {
+ // Expect Notice
+ $this->expectException(Notice::class);
+
+ // Try to set it
+ self::$configInstance->setDefaultTimezone('!invalid!');
+ }
+
+ /**
+ * Tests setting valid timezone
+ */
+ public function testSettingValidDefaultTimezone () {
+ // Will be true
+ $this->assertTrue(self::$configInstance->setDefaultTimezone('Europe/Berlin'));
+ }
+
+ /**
+ * Tests if detectServerAddress is returning what it should for tests.
+ * This will always be 127.0.0.1.
+ */
+ public function testConfigDetectServerAddress () {
+ // Call it
+ $serverAddress = self::$configInstance->detectServerAddress();
+
+ // Should be the same
+ $this->assertEquals('127.0.0.1', $serverAddress);
+ }
+
+ /**
+ * Re-tests if detectServerAddress is returning what it should for tests.
+ * This will always be 127.0.0.1. This call should not invoke
+ * ConsoleTools's method as the configuration entry is already cached.
+ */
+ public function testConfigDetectServerAddressCached () {
+ // Call it
+ $serverAddress = self::$configInstance->detectServerAddress();
+
+ // Should be the same
+ $this->assertEquals('127.0.0.1', $serverAddress);
+ }
+
+ /**
+ * Tests setting a NULL server address
+ */
+ public function testConfigSettingNullServerAddress () {
+ // Expect this exception
+ $this->expectException(NullPointerException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress(NULL);
+ }
+
+ /**
+ * Tests setting a boolean server address
+ */
+ public function testConfigSettingBooleanServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress(FALSE);
+ }
+
+ /**
+ * Tests setting a decimal server address
+ */
+ public function testConfigSettingDecimalServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress(12345);
+ }
+
+ /**
+ * Tests setting a float server address
+ */
+ public function testConfigSettingFloatServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress(123.45);
+ }
+
+ /**
+ * Tests setting an array server address
+ */
+ public function testConfigSettingArrayServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress(array());
+ }
+
+ /**
+ * Tests setting an object server address
+ */
+ public function testConfigSettingObjectServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress($this);
+ }
+
+ /**
+ * Tests setting a resource server address
+ */
+ public function testConfigSettingResourceServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Init some resource
+ $resource = fopen(__FILE__, 'r');
+
+ // Test it
+ self::$configInstance->setServerAddress($resource);
+ }
+
+ /**
+ * Tests setting an empty server address
+ */
+ public function testConfigSettingEmptyServerAddress () {
+ // Expect this exception
+ $this->expectException(InvalidArgumentException::class);
+
+ // Test it
+ self::$configInstance->setServerAddress('');
+ }
+
+ /**
+ * Tests setting a valid server address and getting it back
+ */
+ public function testConfigGettingValidServerAddress () {
+ // Test it
+ self::$configInstance->setServerAddress('127.0.0.1');
+
+ // Get it back
+ $serverAddress = self::$configInstance->getServerAddress();
+
+ // Should be equal
+ $this->assertEquals('127.0.0.1', $serverAddress);
+ }
+
+}