public void QueuePop()
    {
        // Create empty agent
        AI_Agent agent = AI_Agent.CreateAgent();

        // BB params
        AI_Agent.BlackBoard local = AI_Agent.BlackBoard.local;
        AI_Agent.BlackBoard global = AI_Agent.BlackBoard.global;

        string queueP1 = "TestQueue";
        string qCompare = "TestQueueComparer";

        // Create queue and populate
        fc.Queue<int> queue1 = new fc.Queue<int>();
        queue1.Add(1);
        queue1.Add(2);
        queue1.Add(3);

        // Populate the board
        agent[queueP1, local] = queue1;
        agent[qCompare, local] = -1;

        // Check size
        Assert.That(agent.NewTreeTick(T.qSize(queueP1, local, 3)) == Status.Succes);
        //errorCheck(T.qSize(queueP1, local, 3), Status.Succes, ref errors, agent);

        // Check push
        Assert.That(agent.NewTreeTick(T.qPush(queueP1, local, 4)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.qSize(queueP1, local, 4)) == Status.Succes);
        //errorCheck(T.qPush(queueP1, local, 4), Status.Succes, ref errors, agent);
        //errorCheck(T.qSize(queueP1, local, 4), Status.Succes, ref errors, agent);

        //// Check pop
        Assert.That(agent.NewTreeTick(T.qPop(queueP1, local, qCompare, local)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.qSize(queueP1, local, 3)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.eqBB(qCompare, local, 1)) == Status.Succes);
        //errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //errorCheck(T.qSize(queueP1, local, 3), Status.Succes, ref errors, agent);
        //errorCheck(T.eqBB(qCompare, local, 1), Status.Succes, ref errors, agent);

        Assert.That(agent.NewTreeTick(T.qPop(queueP1, local, qCompare, local)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.eqBB(qCompare, local, 2)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.qPop(queueP1, local, qCompare, local)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.eqBB(qCompare, local, 3)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.qPop(queueP1, local, qCompare, local)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.eqBB(qCompare, local, 4)) == Status.Succes);

        Assert.That(agent.NewTreeTick(T.qPop(queueP1, local, qCompare, local)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.qPop(queueP1, local, qCompare, local)) == Status.Succes);
        Assert.That(agent.NewTreeTick(T.eqBB(qCompare, local, 0)) == Status.Succes);

        

        //errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //errorCheck(T.eqBB(qCompare, local, 2), Status.Succes, ref errors, agent);
        //errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //errorCheck(T.eqBB(qCompare, local, 3), Status.Succes, ref errors, agent);
        //errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //errorCheck(T.eqBB(qCompare, local, 4), Status.Succes, ref errors, agent);
        //errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //errorCheck(T.qSize(queueP1, local, 0), Status.Succes, ref errors, agent);
    }
    public void TestBTBasicCompontents(AI_Agent agent)
    {
        int errors = 0;

        #region Standard nodes

        BT_TreeNode f = T.UDel(T.failUpdate, "Fail");
        BT_TreeNode s = T.UDel(T.succesUpdate, "Succes");
        BT_TreeNode r = T.UDel(T.runningUpdate, "Running");
        BT_TreeNode b = T.UDel(T.pauseUpdate, "Pause");

        #endregion

        //if ((int)agent["Depth"] != 0)
        //    errors++;

        //SetAgentDebug(true);

        #region Composits: TC.selector, Sequencer

        // Check the TC.selector
        errorCheck(T.sel(f, f, r, s), Status.Running, ref errors, agent);
        errorCheck(T.sel(f, f, f, f), Status.Failed, ref errors, agent);
        errorCheck(T.sel(f, f, s, f), Status.Succes, ref errors, agent);

        // Check the sequencer
        errorCheck(T.seq(s, s, r, f), Status.Running, ref errors, agent);
        errorCheck(T.seq(s, s, r, s), Status.Running, ref errors, agent);
        errorCheck(T.seq(f, f, f, f), Status.Failed, ref errors, agent);
        errorCheck(T.seq(s, s, s, s), Status.Succes, ref errors, agent);

        #endregion

        #region Depth test

        // Generic depth test
        //TestDepth(agent);

        #endregion

        #region Decorators: TC.invert & alwaysFail

        // Check the TC.inverter
        errorCheck(T.inv(s), Status.Failed, ref errors, agent);
        errorCheck(T.inv(f), Status.Succes, ref errors, agent);
        errorCheck(T.inv(r), Status.Running, ref errors, agent);

        // Check the alwaysFailed
        errorCheck(T.fail(s), Status.Failed, ref errors, agent);
        errorCheck(T.fail(f), Status.Failed, ref errors, agent);
        errorCheck(T.fail(r), Status.Failed, ref errors, agent);

        #endregion

        //BT_TreeNode node = new BT_TreeNode(new BT_Decorator());

        #region Condition: CheckEqualBBParameter

        // Things to compare
        int int1 = 0;
        int int2 = 0;
        int int3 = 1;
        string str1 = "bla";
        string str2 = "bla";
        string str3 = "notbla";
        Vector3 v1 = Vector3.zero;
        Vector3 v2 = Vector3.zero;
        Vector3 v3 = Vector3.up;

        // BB params
        string p1 = "TestParam1";
        string p2 = "TestParam2";
        AI_Agent.BlackBoard local = AI_Agent.BlackBoard.local;
        AI_Agent.BlackBoard global = AI_Agent.BlackBoard.global;

        // Simple int check
        agent[p1, local] = int1;
        agent[p2, local] = int2;

        errorCheck(T.eqBB(p1, local, p2, local), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p1, local, 0), Status.Succes, ref errors, agent);

        agent[p2, local] = int3;
        errorCheck(T.eqBB(p1, local, p2, local), Status.Failed, ref errors, agent);
        errorCheck(T.eqBB(p1, local, 1), Status.Failed, ref errors, agent);

        // cross global and local int check
        agent[p1, global] = int1;
        agent[p2, global] = int3;
        errorCheck(T.eqBB(p1, local, p1, global), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p1, local, p2, global), Status.Failed, ref errors, agent);

        // string check
        agent[p1, local] = str1;
        agent[p2, local] = str2;

        errorCheck(T.eqBB(p1, local, p2, local), Status.Succes, ref errors, agent);

        agent[p2, local] = int3;
        errorCheck(T.eqBB(p1, local, p2, local), Status.Failed, ref errors, agent);

        // cross global and local int check
        agent[p1, global] = str1;
        agent[p2, global] = str3;
        errorCheck(T.eqBB(p1, local, p1, global), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p1, local, p2, global), Status.Failed, ref errors, agent);

        // Vector3 check
        agent[p1, local] = v1;
        agent[p2, local] = v2;

        errorCheck(T.eqBB(p1, local, p2, local), Status.Succes, ref errors, agent);

        agent[p2, local] = v3;
        errorCheck(T.eqBB(p1, local, p2, local), Status.Failed, ref errors, agent);

        // cross global and local int check
        agent[p1, global] = v1;
        agent[p2, global] = v3;
        errorCheck(T.eqBB(p1, local, p1, global), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p1, local, p2, global), Status.Failed, ref errors, agent);


        #endregion

        #region Action: TC.copy BB value

        // int TC.copy
        // Check first
        agent[p1, local] = int1;
        agent[p2, local] = int2;

        errorCheck(T.eqBB(p1, local, p2, local), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p1, local, 0), Status.Succes, ref errors, agent);

        // now TC.copy in 3
        errorCheck(T.copy(p1, local, 3), Status.Succes, ref errors, agent);
        // Check if it went allright
        errorCheck(T.eqBB(p1, local, p2, local), Status.Failed, ref errors, agent);
        errorCheck(T.eqBB(p1, local, 3), Status.Succes, ref errors, agent);

        // now TC.copy from p1 to p2
        errorCheck(T.copy(p2, local, p1, local), Status.Succes, ref errors, agent);

        // Check
        errorCheck(T.eqBB(p1, local, p2, local), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p1, local, 3), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(p2, local, 3), Status.Succes, ref errors, agent);

        #endregion

        #region Action: Queue push, pop, checkSize

        string queueP1 = "TestQueue";
        string qCompare = "TestQueueComparer";

        // Create queue and populate
        fc.Queue<int> queue1 = new fc.Queue<int>();
        queue1.Add(1);
        queue1.Add(2);
        queue1.Add(3);

        // Populate the board
        agent[queueP1, local] = queue1;
        agent[qCompare, local] = -1;

        // Check size
        errorCheck(T.qSize(queueP1, local, 3), Status.Succes, ref errors, agent);

        // Check push
        errorCheck(T.qPush(queueP1, local, 4), Status.Succes, ref errors, agent);
        errorCheck(T.qSize(queueP1, local, 4), Status.Succes, ref errors, agent);

        // Check pop
        errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        errorCheck(T.qSize(queueP1, local, 3), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(qCompare, local, 1), Status.Succes, ref errors, agent);
        errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(qCompare, local, 2), Status.Succes, ref errors, agent);
        errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(qCompare, local, 3), Status.Succes, ref errors, agent);
        errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        errorCheck(T.eqBB(qCompare, local, 4), Status.Succes, ref errors, agent);
        errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        //Debug.Log(agent[qCompare, local]);
        errorCheck(T.qPop(queueP1, local, qCompare, local), Status.Succes, ref errors, agent);
        errorCheck(T.qSize(queueP1, local, 0), Status.Succes, ref errors, agent);

        #region Test stuff
        //Queue<int> q = new Queue<int>();
        //q.Enqueue(6);
        //q.Enqueue(4);
        //q.Enqueue(2);

        //BT_QueuePop whatev = new BT_QueuePop("test", local, "test2", local);
        ////int testooh = (int)whatev.GetFromGenericQueue(q);
        //Debug.Log((int)whatev.GetFromGenericQueue(q));
        //Debug.Log((int)whatev.GetFromGenericQueue(q));
        //Debug.Log((int)whatev.GetFromGenericQueue(q));

        //List<int> test = new List<int>() { 1, 2, 3 };
        //IList list = (IList)test;
        //Debug.Log(list[0]);


        //fc.Stack<int> stack1 = new fc.Stack<int>();
        //fc.Stack<string> stack2 = new fc.Stack<string>();
        //stack1.Add(1);
        //stack1.Add(2);
        //stack1.Add(3);

        //Debug.Log(stack1.GetType().GetGenericTypeDefinition() + " - " + stack1.Get() + " " + stack1.Get() + " " + stack1.Get() + " " + stack1.Get());
        //fc.Queue<int> queue1 = new fc.Queue<int>();
        //queue1.Add(1);
        //queue1.Add(2);
        //queue1.Add(3);

        //fc.IQueue queueI = queue1;
        //Debug.Log(queue1.GetType().GetGenericTypeDefinition() == typeof(fc.Queue<>));
        //Debug.Log(queue1.GetType().GetGenericTypeDefinition());// + " - " + queue1.Get() + " " + queue1.Get() + " " + queue1.Get() + " " + queue1.Get());
        //Debug.Log(queueI.GetType().GetGenericTypeDefinition() + " - " + queueI.Get() + " " + queueI.Get() + " " + queueI.Get() + " " + queueI.Get());
        
        #endregion

        #endregion

        //Debug.Log("Depth" + (int)agent["Depth"]);
        //if ((int)agent["Depth"] != 0)
        //    errors++;

        if (errors != 0)
            Debug.Log("Behavior Tree test FAILED - " + errors + " Errors.");
        else
            Debug.Log("Behavior Tree test SUCCES - 0 Errors.");
    }
 public void IQueueTest()
 {
     fc.Queue<int> queue = new fc.Queue<int>();
     for (int i = 0; i < 5; i++)
     {
         queue.Add(i);
     }
     for (int i = 0; i < 5; i++)
     {
         Assert.That(((int)queue.Get()) == i);
     }
     Assert.That(((int)queue.Get()) == 0);
 }