| <?php
require_once('../../../Data/Types/Restrictions.php');
require_once('../../../Data/Types/Type.php');
require_once('../../../Data/Types/RestrictedSet.php');
require_once('../../../Data/Types/UnorderedNode.php');
require_once('../../../Data/Types/OrderedNode.php');
use Falcraft\Data\Types;
use Falcraft\Data\Types\Type;
echo "Falcraft\\Data\\Types\\OrderedNode.php Test\n";
echo "----------------------------------------\n\n";
echo "Empty Instantiation -> ";
$success = true;
$testOrderedNode1 = null;
try {
    $testOrderedNode1 = new Types\OrderedNode();
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n";
} else {
    echo "Failure...\n";
}
echo "Instantiating Incorrect Ordered Node (correctSet1, incorrectSet1) -> ";
$failure = true;
$testIncorrectRestrictions = $testIncorrectRestrictedSet = $testIncorrectOrderedNode = null;
try
{
    $testIncorrectRestrictions = new Types\Restrictions(array(Types\Type::BASIC_BOOL));
    $testIncorrectRestrictedSet = Types\RestrictedSet::build(array(), $testIncorrectRestrictions);
    $testIncorrectOrderedNode = new Types\OrderedNode(
        $testCorrectRestrictedSet1, array(), $testIncorrectRestrictedSet
    );
    
    $failure = false;
} catch ( \InvalidArgumentException $e ) {
    $failure = true;
}
if ($failure) {
    echo "Failure!\n";
} else {
    echo "Success...\n";
}
echo "Instantiating Incorrect Ordered Node (correctSet2, incorrectSet2) -> ";
$failure = true;
$testIncorrectRestrictions2 = $testIncorrectRestrictedSet2 = $testIncorrectOrderedNode2 = null;
try
{
    $testIncorrectRestrictions2 = new Types\Restrictions(
        array(Types\Type::TYPED_OBJECT ),
        array( 'Falcraft\Data\Types\Edge')
    );
    
    $testIncorrectRestrictedSet2 = Types\RestrictedSet::build(array(), $testIncorrectRestrictions2);
    $testIncorrectOrderedNode2 = new Types\OrderedNode(
        $testCorrectRestrictedSet2, array(), $testIncorrectRestrictedSet2
    );
    
    $failure = false;
} catch ( \InvalidArgumentException $e ) {
    $failure = true;
}
if ($failure) {
    echo "Failure!\n";
} else {
    echo "Success...\n";
}
echo "Instantiating Correct Ordered Node -> ";
$testCorrectRestrictions = $testCorrectRestrictedSet1 = null;
$testCorrectRestrictedSet2 = $testCorrectOrderedNode = null;
$success = true;
try {
    $testCorrectRestrictions = new Types\Restrictions(
        array(Types\Type::TYPED_OBJECT),
        array( 'Falcraft\Data\Types\Resource\VertexInterface')
    );
    
    $testCorrectRestrictedSet1 = Types\RestrictedSet::build(array(), $testCorrectRestrictions);
    $testCorrectRestrictedSet2 = Types\RestrictedSet::build(array(), $testCorrectRestrictions);
    $testCorrectOrderedNode = new Types\OrderedNode(
        $testCorrectRestrictedSet1, array(), $testCorrectRestrictedSet2
    );
    
} catch (\Exception $e) {
    $success = false;
}
    
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
echo "Retrieving Restrictions -> \n\n";
    
var_dump($testCorrectOrderedNode->getRestrictions());
echo "\n\n";
echo "Creating Vertices -- \n";
echo "UnorderedNodes: parentNode, rightNode, middleNode, leftNode, offsideNode, auxiliaryNode\n";
$success = true;
$parentNode = $rightNode = $middleNode = $leftNode = $offsideNode = $auxiliaryNode = null;
try {
    echo "    \$parentNode = new Types\\UnorderedNode(): identifier = ";
    $parentNode = new Types\UnorderedNode(); echo $parentNode->getIdentifier() . "\n";
    
    echo "    \$rightNode = new Types\\UnorderedNode(): identifier = ";
    $rightNode  = new Types\UnorderedNode(); echo $rightNode->getIdentifier() . "\n";
    
    echo "    \$middleNode = new Types\\UnorderedNode(): identifier = ";
    $middleNode  = new Types\UnorderedNode(); echo $middleNode->getIdentifier() . "\n";
    
    echo "    \$leftNode = new Types\\UnorderedNode(): identifier = ";
    $leftNode = new Types\UnorderedNode(); echo $leftNode->getIdentifier() . "\n";
    
    echo "    \$offsideNode = new Types\\UnorderedNode(): identifier = ";
    $offsideNode = new Types\UnorderedNode(); echo $offsideNode->getIdentifier() . "\n";
    
    echo "    \$auxiliaryNode = new Types\\UnorderedNode(): identifier = " ;
    $auxiliaryNode = new Types\UnorderedNode(); echo $auxiliaryNode->getIdentifier() . "\n";
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "\n    Success!\n\n";
} else {
    echo "\n    Failure...\n\n";
}
echo "Attaching parentNode As Parent (Incoming) [Reciprocate As Well] -> ";
$success = true;
try {
    $testCorrectOrderedNode->connectIncoming($parentNode);
    $parentNode->connectOutgoing($testCorrectOrderedNode);
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n";
} else {
    echo "Failure...\n";
}
    
echo "    Test Result: ";
    
if ($parentNode->isOutgoing($testCorrectOrderedNode) &&
        $testCorrectOrderedNode->isIncoming($parentNode)) {
    echo "Successful Bidirectional Link\n\n";
} else {
    echo "Failure To Establish Bidirectional Link\n\n";
}
echo "Attaching offsideNode as Sibling (Mutual) -> ";
$success = true;
try {
    $testCorrectOrderedNode->connectMutual($offsideNode);
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n";
} else {
    echo "Failure...\n";
}
echo "    Test Result: ";
if ($offsideNode->isConnected($testCorrectOrderedNode) &&
        $testCorrectOrderedNode->isConnected($offsideNode)) {
    echo "Successful Bidirectional Link\n\n";
} else {
    echo "Failure to Establish Bidirectional Link\n\n";
}
       
echo "Attaching Children: Right, Middle, Left -> ";
$success = true;
try {
    $testCorrectOrderedNode->connectOutgoing($rightNode);
    $rightNode->connectIncoming($testCorrectOrderedNode);
    
    $testCorrectOrderedNode->connectOutgoing($middleNode);
    $middleNode->connectIncoming($testCorrectOrderedNode);
    
    $testCorrectOrderedNode->connectOutgoing($leftNode);
    $leftNode->connectIncoming($testCorrectOrderedNode);
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n";
} else {
    echo "Failure...\n";
}
echo "    Test Result:\n";
if ($testCorrectOrderedNode->isConnected($rightNode) &&
        $rightNode->isConnected($testCorrectOrderedNode)) {
    echo "        rightNode parent-child link successful\n";
} else {
    echo "        rightNode parent-child link unsuccessful\n";
}
if ($testCorrectOrderedNode->isConnected($middleNode) &&
        $middleNode->isConnected($testCorrectOrderedNode)) {
    echo "        middleNode parent-child link successful\n";
} else {
    echo "        middleNode parent-child link unsuccessful\n";
}
if ($testCorrectOrderedNode->isConnected($leftNode) &&
        $leftNode->isConnected($testCorrectOrderedNode)) {
    echo "        leftNode parent-child link succssful\n\n";
} else {
    echo "        leftNode parent-child link unsuccessful\n\n";
}
echo "OrderedNode Specific Functionality Tests --\n";
echo "    Retrieval:\n";
$retrieval = null;
echo "        getFirstOutgoing -> ";
$success = true;
try {
    $retrieval = $testCorrectOrderedNode->getFirstOutgoing();
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n";
} else {
    echo "Failure...\n";
}
    
echo "          \$rightNode: " . $rightNode->getIdentifier() .
     " retrieved node: " . $retrieval->getIdentifier() . "\n";
echo "          reference sanity check -- ";
$retrieval = new Types\UnorderedNode();
echo "               \$rightNode: " . $rightNode->getIdentifier() .
     " retrieved node: " . $retrieval->getIdentifier() . "\n";
$retrieval = null;
echo "        getLastOutgoing -> ";
$success = true;
try {
    $retrieval = $testCorrectOrderedNode->getLastOutgoing();
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n";
} else {
    echo "Failure...\n";
}
echo "            \$leftNode: " . $leftNode->getIdentifier() .
     " retrieved node: " . $retrieval->getIdentifier() . "\n\n";
    
echo "Vertices -- \n\n";
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
echo "\nPush - ";
$success = true;
try {
    $testCorrectOrderedNode->push(new Types\UnorderedNode());
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
$retrieval = null;
echo "\nPop - ";
$success = true;
try {
    $retrieval = $testCorrectOrderedNode->pop();
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success! Identifier: " . $retrieval->getIdentifier() . "\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
$retrieval = null;
echo "\nShift - ";
$success = true;
try {
    $retrieval = $testCorrectOrderedNode->shift();
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success! Identifier: " . $retrieval->getIdentifier() . "\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
echo "Unshift ->  ";
$success = true;
try {
    $testCorrectOrderedNode->unshift(new Types\UnorderedNode());
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
echo "insertAfter 7 -> ";
$success = true;
try {
    $testCorrectOrderedNode->insertAfter(new Types\UnorderedNode, 7);
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
echo "insertBefore 14 -> ";
$success = true;
try {
    $testCorrectOrderedNode->insertBefore(new Types\UnorderedNode, 14);
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
echo "delete 15 -> ";
$success = true;
try {
    $testCorrectOrderedNode->delete(15);
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
var_dump($testCorrectOrderedNode->getOutgoingArrayIdentifiers());
echo "Count -> " . $testCorrectOrderedNode->count() . "\n";
echo "Is Empty? " . ($testCorrectOrderedNode->isEmpty() ? "true\n" : "false\n");
echo "Clear Outgoing -> ";
$success = true;
try {
    $testCorrectOrderedNode->clearOutgoing();
} catch (\Exception $e) {
    $success = false;
}
if ($success) {
    echo "Success!\n\n";
} else {
    echo "Failure...\n\n";
}
echo "Is Empty? " . ($testCorrectOrderedNode->isEmpty() ? "true\n" : "false\n");
 |