| 
<?php
 /* SOME TESTS ARE MEANT TO FAIL!
 If the entire script runs, it works. */
 
 require_once('../../../Data/Types/Map.php');
 
 use Falcraft\Data\Types;
 
 echo "Falcraft\\Data\\Types\\Map.php Test\n";
 echo "--------------------------------\n\n";
 
 echo "Build A Map -- \n";
 echo "    Key Object -> ";
 
 $testKeyObject = new \stdClass();
 $testKeyObject->testProperty1 = true;
 $testKeyObject->testProperty2 = new \stdClass();
 $testKeyObject->testProperty2->testInnerProperty = 5;
 
 echo "\n\n";
 var_dump($testKeyObject);
 echo "\n";
 
 echo "    Key=>Value Object -> ";
 
 $testStandardObject = new \stdClass();
 $testStandardObject->key = 'stdObjectKey';
 $testStandardObject->value = 'stdObjectValue';
 
 echo "\n\n";
 var_dump($testStandardObject);
 echo "\n";
 
 echo "    \$testMap = new Types\\Map(array(
 array('key' -> \$testKeyObject, 'value' => 'testValue1'),
 \$testStandardObject,
 'testStringKey=hello',
 'straightArray' => 'straightValue',),
 array('strict' => true)) -> ";
 
 $success = true;
 
 $testMap = null;
 
 try {
 $testMap = new Types\Map(array(
 array('key' => $testKeyObject, 'value' => 'testValue1'),
 $testStandardObject,
 'testStringKey=hello',
 'straightArray' => 'straightValue',),
 array('strict' => true));
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Map Internals -- \n\n";
 var_dump($testMap);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Test Unique Key [in_array(..., \$keys) -> ";
 
 $testUniqueKey = $testNotUniqueKey = $keys = null;
 
 try {
 $testUniqueKey = 'UniqueKey';
 $testNotUniqueKey = $testKeyObject;
 $keys = $testMap->getKeys();
 if (!in_array($testUniqueKey, $keys)) {
 echo "UniqueKey IS Unique, ";
 } else {
 echo "UniqueKey IS NOT Unique, ";
 }
 
 if (!in_array($testNotUniqueKey, $keys)) {
 echo "testKeyObject IS Unique\n";
 } else {
 echo "testKeyObject IS NOT Unique\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Setting Existing Keys and Adding New Keys -- \n\n";
 
 echo "Setting New Key -> ";
 
 $success = true;
 
 $newKey = null;
 
 try {
 $newKey = 'newKey';
 $testMap->set($newKey, 'newValue');
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Map Keys -- \n\n";
 var_dump($testMap->getKeys());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Setting Old Key (object) -> ";
 
 $success = true;
 
 $oldKeyObject = null;
 
 try {
 // MIRROR PREVIOUS KEY
 $oldKeyObject = new \stdClass();
 $oldKeyObject->testProperty1 = true;
 $oldKeyObject->testProperty2 = new \stdClass();
 $oldKeyObject->testProperty2->testInnerProperty = 5;
 
 $testMap->set($oldKeyObject, 'newObjectValue');
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Map Keys -- \n\n";
 var_dump($testMap->getValues());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Retrieving newKey -> ";
 
 $success = true;
 
 $testVal = null;
 
 try {
 $testVal = $testMap->find('newKey');
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success! ($testVal)\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Retrieving oldKeyObject -> ";
 
 $success = true;
 
 $testVal = null;
 
 try {
 $testVal = $testMap->find($oldKeyObject);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success! ($testVal)\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Removing oldKeyObject -> ";
 
 $success = true;
 
 try {
 $testMap->remove($oldKeyObject);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Map Internals -- \n\n";
 var_dump($testMap->getKeys());
 echo "\n";
 var_dump($testMap->getValues());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "Iteration -- \n";
 echo "    foreach (\$k => \$v) -> \n";
 
 try {
 foreach ($testMap as $k => $v ) {
 echo "      $k => $v\n";
 }
 } catch (\Exception $e) {
 echo "EXCEPTION CAUGHT\n";
 }
 
 echo "Set Operations on Maps -- \n";
 
 echo "    Difference (newKey) -> ";
 
 $success = true;
 
 $testMapDifference = null;
 
 try {
 $testMapDifference = Types\Map::difference($testMap, array('newKey' => 'newValue'));
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Difference Internals -- \n\n";
 var_dump($testMapDifference);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "    Intersect (newKey) -> ";
 
 $success = true;
 
 $testMapIntersect = null;
 
 try {
 $testMapIntersect = Types\Map::intersect($testMap, array('newKey' => 'newValue'));
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Intersection Internals -- \n\n";
 var_dump($testMapIntersect);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "   Combine (key1, key2, key3, value1, value2, ...) -> ";
 
 $success = true;
 
 $testMapCombine = null;
 
 try {
 $testMapCombine = Types\Map::combine(
 array(
 'key1', 'key2', 'key3',),
 array(
 'value1', 'value2', 'value3',)
 );
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Combination Internals -- \n\n";
 var_dump($testMapCombine);
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "    Object Value Counting - Objects As Keys in Result -> \n";
 echo "        apple, apple, banana, apple, banana\n";
 
 $success = true;
 
 $testObject1 = $testObject2 = $testMap = $valueMap = null;
 
 try {
 $testObject1 = new \stdClass();
 $testObject1->fruit = "apple";
 
 $testObject2 = new \stdClass();
 $testObject2->fruit = "banana";
 
 $testMap = new Types\Map(array(
 array(0, $testObject1),
 array(1, $testObject1),
 array(2, $testObject2),
 array(4, $testObject1),
 array(5, $testObject2),),
 array('strict' => true));
 
 $valueMap = Types\Map::countValues($testMap);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Value Map Internals -- \n\n";
 var_dump($valueMap->getKeys());
 echo "\n";
 var_dump($valueMap->getValues());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 echo "    Merge -> ";
 
 $success = true;
 
 $testMergeMap1 = $testMergeMap2 = $mergedMap = null;
 
 try {
 $testMergeMap1 = new Types\Map(array('TESTMERGEKEY1' => 'TESTMERGEVALUE1',
 'TESTMERGEKEY2' => 'TESTMERGEVALUE2',),
 array('strict' => true));
 $testMergeMap2 = new Types\Map(array('TESTMERGEKEY2' => 'NEWTESTMERGEVALUE2',
 'TESTMERGEKEY3' => 'TESTMERGEVALUE2',),
 array('strict' => true));
 $mergeMap = Types\Map::merge($testMergeMap1, $testMergeMap2);
 } catch (\Exception $e) {
 $success = false;
 }
 
 if ($success) {
 echo "Success!\n\n";
 echo "Merged Map Internals -- \n\n";
 var_dump($mergeMap->getKeys());
 echo "\n";
 var_dump($mergeMap->getValues());
 echo "\n";
 } else {
 echo "Failure...\n";
 }
 
 |