| 
<?php
 require_once('../../../Data/Types/Set.php');
 
 use Falcraft\Data\Types;
 
 echo "Falcraft\\Data\\Types\\Set.php Test\n";
 echo "--------------------------------\n\n";
 
 echo "Instantiation -> ";
 
 $success = true;
 
 try {
 $testSet = new Types\Set(
 array(1, 2),
 array('strict' => true, 'unique' => true,)
 );
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Build -> ";
 
 $success = true;
 
 $testBuild = null;
 
 try {
 $testBuild = Types\Set::build(array(1, 2, 3, 4, 5,));
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "\nSet Internals -- \n";
 var_dump($testSet->getArray());
 
 echo "\nAdd Operation (3) -> ";
 
 $success = true;
 
 try {
 $testSet->add(3);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "\nSet Internals -- \n";
 var_dump($testSet->getArray());
 
 echo "\nAdd Operation (2) -> ";
 
 $fail = true;
 
 try {
 $testSet->add(2);
 $fail = false;
 } catch (\Exception $e) {
 
 }
 
 if ($fail) {
 echo "Failure!\n";
 } else {
 echo "Success...\n";
 }
 
 echo "\nSet Internals -- \n";
 var_dump($testSet->getArray());
 
 echo "\nRemove Operation (2) -> ";
 
 $success = true;
 
 try {
 $testSet->remove(2);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "\nSet Internals -- \n";
 var_dump($testSet->getArray());
 
 echo "\nIs 1 In Set? ";
 
 try {
 if ($testSet->in(1)) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Is Set 1 Empty? ";
 
 try {
 if ($testSet->isEmpty()) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Is Set 2 Empty? ";
 
 try {
 $testSet2 = new Types\Set();
 if ($testSet2->isEmpty()) {
 echo "Yes\n";
 } else {
 echo "No\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Size of Set 1 -> ";
 
 $success = true;
 
 $count = null;
 
 try {
 $count = $testSet->size();
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success! ($count)\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Iteration -- \n";
 
 try {
 foreach ($testSet->iterate() as $setValue) {
 echo "    \$setValue - $setValue\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Hashing -> ";
 
 $success = true;
 
 $hash = $hash2 = null;
 
 try {
 $hash = $testSet->hash();
 $testSet->add(4);
 $hash2 = $testSet->hash();
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success! ($hash, $hash2)\n";
 } else {
 echo "Failure...";
 }
 
 class testClass {
 public $publicProp;
 }
 
 $obj = new testClass();
 
 $identity = null;
 
 echo "Add Reference -> \n";
 
 try {
 $obj->publicProp = 2;
 $identity = $testSet->addReference($obj);
 $obj->publicProp = 3;
 
 echo "\nSet Internals --\n\n";
 var_dump($testSet->getArray());
 echo "\n";
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Retrieve Reference -> ";
 
 unset($obj);
 
 try {
 $obj = $testSet->retrieveReference($identity);
 $obj->publicProp = 5;
 
 echo "\n\nSet Internals -- \n\n";
 var_dump($testSet->getArray());
 echo "\n";
 } catch (\Exception $e) {
 echo "EXCEPTION CUAGHT\n";
 }
 
 echo "Remove By Identity -> ";
 
 try {
 $testSet->removeByIdentifier($identity);
 
 echo "\n\nSet Internals -- \n\n";
 var_dump($testSet->getArray());
 echo "\n";
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "\n\nSet Operations -- \n";
 
 echo "Set Equality -> ";
 
 $success = true;
 
 $comparisonSet = null;
 
 try {
 $comparisonSet = new Types\Set(array(3,1,4,));
 if (!Types\Set::equal($testSet, $comparisonSet)) {
 $success = false;
 }
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Folding -> ";
 
 $success = true;
 
 $folder = $result = null;
 
 try {
 $folder = function($result, $elem) {$result += $elem; return $result;};
 $result = Types\Set::fold($folder, $testSet);
 } catch (\Excpetion $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success! ($result)\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Filtering -> ";
 
 $success = true;
 
 $filter = $result = null;
 
 try {
 $filter = function($test) {return ($test & 1);};
 $result = Types\Set::filter($filter, $testSet);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success:\n\n";
 var_dump($result);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Map -> ";
 
 $success = true;
 
 $map = $result = null;
 
 try {
 $map = function($test) {return $test + 1;};
 $result = Types\Set::map($map, $testSet);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success:\n\n";
 var_dump($result);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Walk -> ";
 
 $success = true;
 
 $walk = null;
 
 try {
 $walk = function(&$elem, $key, $prefix) {$elem ="$prefix: $elem";};
 Types\Set::walk($testSet, $walk, "Walked: ");
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success:\n\n";
 var_dump($testSet->getArray());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Union -> ";
 
 $success = true;
 
 $result = null;
 
 try {
 $u1 = array(4, 2, 1,);
 $u2 = array('baz', 'foo', 'bar');
 $result = Types\Set::union($testSet, $u1, $u2);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success:\n\n";
 var_dump($result);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Intersection -> ";
 
 $success = true;
 
 $testSet = $otherTestSet = $testArray = $result = null;
 
 try {
 $testSet = Types\Set::build(array(1, 2, 3, 4, 5,));
 $otherTestSet = Types\Set::build(array(3, 4, 5,));
 $testArray = array(3, 4,);
 $result = Types\Set::intersection(
 $testSet,
 $otherTestSet,
 $testArray
 );
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success:\n\n";
 var_dump($result);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Difference -> ";
 
 $success = true;
 
 $testSet = $otherTestSet = $testArrray = $result = null;
 
 try {
 $testSet = Types\Set::build(array(1, 2, 3, 4, 5, 6,));
 $otherTestSet = Types\Set::build(array(2, 3, 4, 5,));
 $testArray = array(1);
 $result = Types\Set::difference($testSet, $otherTestSet, $testArray);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success:\n\n";
 var_dump($result);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Set Subset: \n";
 
 $testSet = $otherTestSet = $anotherTestSet = null;
 
 try {
 $testSet = Types\Set::build(array(1, 2, 3, 4, 5,));
 $otherTestSet = Types\Set::build(array(2, 3, 4,));
 $anotherTestSet = Types\Set::build(array(4, 5, 6,));
 if (Types\Set::subset($testSet, $otherTestSet)) {
 echo "    otherTestSet Is a Subset of testSet\n";
 } else {
 echo "    otherTestSet Is NOT a Subset of testSet\n";
 }
 
 if (Types\Set::subset($testSet, $anotherTestSet)) {
 echo "    anotherTestSet Is a Subset of testSet\n";
 } else {
 echo "    anotherTestSet Is NOT a Subset of testSet\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 |