| 
<?php
 require_once('../../../Data/Types/Restrictions.php');
 require_once('../../../Data/Types/Type.php');
 
 use Falcraft\Data\Types;
 use Falcraft\Data\Types\Type;
 
 echo "Falcraft\\Data\\Types\\Restrictions.php Test\n";
 echo "-----------------------------------------\n\n";
 
 echo "Instantiation (Bool, String, Int) -> ";
 
 $success = true;
 
 $testRestrictions = null;
 
 try {
 $testRestrictions = new Types\Restrictions(array(
 Type::BASIC_BOOL,
 Type::BASIC_STRING,
 Type::BASIC_INT,),
 array(),
 array('autoload' => false));
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\nAllowed Types -- \n\n";
 var_dump($testRestrictions->getAllowedTypes());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Test Restrictions Class (without autoload) -> ";
 
 $fail = true;
 
 $testRestrictions = null;
 
 try {
 $testRestrictions = new Types\Restrictions(
 array(Type::TYPED_OBJECT,),
 array('Falcraft\\Data\\Types\\Range',),
 array('autoload' => false));
 $fail = false;
 } catch (\Exception $e) {
 
 }
 
 if ($fail) {
 echo "Failure! [Expected]\n";
 } else {
 echo "Success...\n";
 }
 
 echo "\nTest Restrictions Class (WITH autoload) -> ";
 
 $success = true;
 
 $testRestrictions = null;
 
 try {
 $testRestrictions = new Types\Restrictions(
 array(Type::TYPED_OBJECT,),
 array('Falcraft\\Data\\Types\\Range',),
 array('autoload' => true));
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "--- NOTE: If appropriate autoloader function missing, this fails expectedly\n\n";
 
 echo "Get Default Restrictions -> ";
 
 $success = true;
 
 $defaultRestrictions = null;
 
 try {
 $defaultRestrictions = Types\Restrictions::getDefaultRestrictions();
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\nAllowed Types -- \n\n";
 var_dump($defaultRestrictions->getAllowedTypes());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Predicate Retrieval -> ";
 
 $success = true;
 
 $testRestrictions = $allowedTypes = $allowedClasses = null;
 
 require_once('../../../Data/Types/Set.php');
 require_once('../../../Data/Types/Range.php');
 
 try {
 $testRestrictions = new Types\Restrictions(
 array(Type::TYPED_OBJECT,),
 array('Falcraft\\Data\\Types\\Set',
 'Falcraft\\Data\\Types\\Range',),
 array('autoload' => false));
 $allowedTypes = $testRestrictions->getAllowedTypes();
 $allowedClasses = $testRestrictions->getAllowedClasses();
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Allowed Types -- \n\n";
 var_dump($allowedTypes);
 echo "\nAllowed Classes -- \n\n";
 var_dump($allowedClasses);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Allowances -> \n";
 echo "    Boolean (new Type(Type::BASIC_BOOL)): ";
 if ($testRestrictions->isAllowed(new Type(Type::BASIC_BOOL))) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 
 echo "    String (Type::BASIC_STRING): ";
 if ($testRestrictions->isAllowed(Type::BASIC_STRING)) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 
 echo "    Int (array(Type::BASIC_INT,)): ";
 if ($testRestrictions->isAllowed(Type::BASIC_INT)) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 
 $set = new Types\Set();
 $range = new Types\Range();
 
 echo "    Types\\Set (\$set): ";
 if ($testRestrictions->isAllowed($set)) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 
 echo "    Types\\Set (array(Type::TYPED_OBJECT, \$set,)): ";
 if ($testRestrictions->isAllowed(array(Type::TYPED_OBJECT, $set,))) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 
 echo "    Types\\Range (array(Type::TYPED_OBJECT, \$range,)): ";
 if ($testRestrictions->isAllowed(array(Type::TYPED_OBJECT, $range,))) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 
 echo "    Types\\Set (array(Type::TYPED_OBJECT, 'Falcraft\\Data\\Types\\Set',)): ";
 if ($testRestrictions->isAllowed(
 array(Type::TYPED_OBJECT, 'Falcraft\\Data\\Types\\Set',))
 ) {
 echo "Yes\n";
 }  else {
 echo "No\n";
 }
 
 echo "    Type\\Range (array(Type::TYPED_OBJECT, 'Falcraft\\Data\\Types\\Stack',)): ";
 try {
 if ($testRestrictions->isAllowed(
 array(Type::TYPED_OBJECT, 'Falcraft\\Data\\Types\\Stack',))
 ) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 require_once('../../../Data/Types/Stack.php');
 
 echo "    Type\\Range (array(Type::TYPED_OBJECT, 'Falcraft\\Data\\Types\\Stack',)): ";
 try {
 if ($testRestrictions->isAllowed(
 array(Type::TYPED_OBJECT, 'Falcraft\\Data\\Types\\Stack',))
 ) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 |