public IEnumerator INVTest()
    {
        SetupScene();
        yield return(new WaitForSecondsRealtime(1));

        GameObject INVChip = Resources.Load <GameObject>("Prefabs/Lab/INVChip");

        Assert.NotNull(INVChip);
        GameObject InvGO     = GameObject.Instantiate <GameObject>(INVChip);
        INVGate    InvGate   = InvGO.GetComponent <INVGate>();
        string     device_id = INVGate.LOGIC_DEVICE_ID;

        yield return(new WaitForSecondsRealtime(1));

        Dictionary <string, GameObject> nandNodes = InvGate.GetLogicDictionary();
        List <GameObject> otherNodes = new List <GameObject>();

        for (int i = 0; i < 14; i++)
        {
            GameObject newNode = new GameObject("OtherNODE_" + i);
            otherNodes.Add(newNode);
        }
        List <LogicNode> otherLogic = new List <LogicNode>();

        for (int i = 0; i < 14; i++)
        {
            otherLogic.Add(otherNodes[i].AddComponent <LogicNode>());
        }
        List <GameObject> nandNodeList = new List <GameObject>();

        for (int i = 0; i < 14; i++)
        {
            GameObject DeviceNode;
            if (nandNodes.TryGetValue(device_id + i, out DeviceNode))
            {
                nandNodeList.Add(DeviceNode);
                otherNodes[i].transform.position = nandNodeList[i].transform.position;
            }
            else
            {
                Assert.Fail();
            }
        }
        yield return(new WaitForSecondsRealtime(1));

        Assert.IsTrue(!InvGate.IsDeviceOn());
        otherLogic[6].SetLogicState((int)LOGIC.LOW);
        otherLogic[13].SetLogicState((int)LOGIC.HIGH);
        yield return(new WaitForSecondsRealtime(1));

        Assert.IsTrue(!InvGate.IsDeviceOn());
        InvGate.SetSnapped(true);
        Assert.IsTrue(InvGate.IsDeviceOn());

        otherLogic[0].SetLogicState((int)LOGIC.LOW);
        otherLogic[2].SetLogicState((int)LOGIC.LOW);
        otherLogic[4].SetLogicState((int)LOGIC.LOW);
        otherLogic[8].SetLogicState((int)LOGIC.LOW);
        otherLogic[10].SetLogicState((int)LOGIC.LOW);
        otherLogic[12].SetLogicState((int)LOGIC.LOW);
        yield return(new WaitForSecondsRealtime(1));

        Assert.AreEqual((int)LOGIC.HIGH, nandNodeList[1].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.HIGH, nandNodeList[3].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.HIGH, nandNodeList[5].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.HIGH, nandNodeList[7].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.HIGH, nandNodeList[9].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.HIGH, nandNodeList[11].GetComponent <LogicNode>().GetLogicState());

        otherLogic[0].SetLogicState((int)LOGIC.HIGH);
        otherLogic[2].SetLogicState((int)LOGIC.HIGH);
        otherLogic[4].SetLogicState((int)LOGIC.HIGH);
        otherLogic[8].SetLogicState((int)LOGIC.HIGH);
        otherLogic[10].SetLogicState((int)LOGIC.HIGH);
        otherLogic[12].SetLogicState((int)LOGIC.HIGH);
        yield return(new WaitForSecondsRealtime(1));

        Assert.AreEqual((int)LOGIC.LOW, nandNodeList[1].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.LOW, nandNodeList[3].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.LOW, nandNodeList[5].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.LOW, nandNodeList[7].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.LOW, nandNodeList[9].GetComponent <LogicNode>().GetLogicState());
        Assert.AreEqual((int)LOGIC.LOW, nandNodeList[11].GetComponent <LogicNode>().GetLogicState());


        yield break;
    }