public IEnumerator _Finds_All_Unconnected_Adaptors()
    {
        GameObject testGameObject = new GameObject();

        testGameObject.name = "TESTGAMEOBJECT";
        GameObject testGameObject1 = new GameObject();

        testGameObject1.name = "TESTGAMEOBJECT";

        WeaponPart testPart = testGameObject1.AddComponent <WeaponPart>();

        Adaptor adaptorLoadingMechanism  = testGameObject1.AddComponent <Adaptor>();
        Adaptor adaptorLoadingMechnaism2 = testGameObject1.AddComponent <Adaptor>();

        testPart.Adaptors = new List <Adaptor> {
            adaptorLoadingMechanism, adaptorLoadingMechnaism2
        };


        testPart.TestSetup("NotSearchedPart", WeaponPartType.Trigger, null);

        WeaponStructure weaponStructure = testGameObject.AddComponent <WeaponStructure>();

        weaponStructure.trigger          = testPart;
        testGameObject1.transform.parent = testGameObject.transform;

        yield return(null);

        List <Adaptor> result = weaponStructure.FindUnconnectedAdaptorsRecursively();

        Assert.Contains(adaptorLoadingMechanism, result);
        Assert.Contains(adaptorLoadingMechnaism2, result);
        Assert.AreEqual(2, result.Count);
    }
    public IEnumerator _Replaces_WeaponPart_Correctly()
    {
        var testData = createTestWeaponStructure();

        yield return(null);

        WeaponPart      replacedPart    = (WeaponPart)testData[1];
        WeaponStructure weaponStructure = (WeaponStructure)testData[0];

        GameObject testGameObject = new GameObject();

        testGameObject.name = "TESTGAMEOBJECT";

        WeaponPart replacementPart = testGameObject.AddComponent <WeaponPart>();

        replacementPart.Adaptors = new List <Adaptor>();
        replacementPart.TestSetup("ReplacementPart", WeaponPartType.FiringMechanism, null);

        WeaponPart parent = replacedPart.Parent;

        weaponStructure.ReplaceWeaponPart(replacedPart, replacementPart);

        yield return(null);

        Assert.AreSame(replacementPart, parent.Children[0]);
        Assert.Contains(replacementPart, parent.Children);

        Assert.AreSame(replacementPart.transform.parent, parent.Adaptors[0].ChildPartTransform);
    }
    public IEnumerator _Replaces_TopLevel_WeaponPart_Correctly()
    {
        var testData = createTestWeaponStructure();

        yield return(null);

        WeaponPart      replacedPart    = (WeaponPart)testData[2];
        WeaponStructure weaponStructure = (WeaponStructure)testData[0];

        GameObject testGameObject = new GameObject();

        testGameObject.name = "TESTGAMEOBJECT";

        WeaponPart replacementPart = testGameObject.AddComponent <WeaponPart>();

        Adaptor adaptorLoadingMechanism  = testGameObject.AddComponent <Adaptor>();
        Adaptor adaptorLoadingMechnaism2 = testGameObject.AddComponent <Adaptor>();

        adaptorLoadingMechanism.ChildPartTransform   = adaptorLoadingMechanism.transform;
        adaptorLoadingMechnaism2.ChildPartTransform  = adaptorLoadingMechnaism2.transform;
        adaptorLoadingMechanism.WeaponTypeOfAdaptor  = WeaponPartType.LoadingMechanism;
        adaptorLoadingMechnaism2.WeaponTypeOfAdaptor = WeaponPartType.LoadingMechanism;

        replacementPart.Adaptors = new List <Adaptor> {
            adaptorLoadingMechanism, adaptorLoadingMechnaism2
        };
        replacementPart.TestSetup("ReplacementPart", WeaponPartType.Trigger, null);

        WeaponPart parent = replacedPart.Parent;

        weaponStructure.ReplaceWeaponPart(replacedPart, replacementPart);

        yield return(null);

        Assert.AreSame(((WeaponPart)testData[3]).Parent, replacementPart); //child's parent is replaced correctly
        Assert.Contains((WeaponPart)testData[3], replacementPart.Children);
        Assert.AreSame(((WeaponPart)testData[4]).Parent, replacementPart); //child's parent is replaced correctly
        Assert.Contains((WeaponPart)testData[4], replacementPart.Children);
    }
    public IEnumerator _Adds_Part_To_Adaptor_Correctly()
    {
        var testData = createTestWeaponStructure();

        yield return(null);

        WeaponStructure weaponStructure = (WeaponStructure)testData[0];
        WeaponPart      firingMechanism = (WeaponPart)testData[1];
        Adaptor         adaptor         = firingMechanism.Adaptors[0];

        GameObject testGameObject = new GameObject();

        testGameObject.name = "TESTGAMEOBJECT";

        WeaponPart newPart = testGameObject.AddComponent <WeaponPart>();

        newPart.Adaptors = new List <Adaptor>();
        newPart.TestSetup("NewPart", WeaponPartType.Barrel, null);

        weaponStructure.AddWeaponPart(adaptor, newPart);

        Assert.Contains(newPart, firingMechanism.Children);
        Assert.AreSame(newPart.transform.parent, adaptor.ChildPartTransform);
    }
    public Object[] createTestWeaponStructure()
    {
        GameObject testGameObject = new GameObject();

        testGameObject.name = "TESTGAMEOBJECT";
        GameObject testGameObject1 = new GameObject();

        testGameObject1.name = "TESTGAMEOBJECT";
        GameObject testGameObject2 = new GameObject();

        testGameObject2.name = "TESTGAMEOBJECT";
        GameObject testGameObject3 = new GameObject();

        testGameObject3.name = "TESTGAMEOBJECT";
        GameObject testGameObject4 = new GameObject();

        testGameObject4.name = "TESTGAMEOBJECT";


        WeaponPart notSearchedPart  = testGameObject1.AddComponent <WeaponPart>();
        WeaponPart notSearchedPart2 = testGameObject2.AddComponent <WeaponPart>();
        WeaponPart notSearchedPart3 = testGameObject3.AddComponent <WeaponPart>();
        WeaponPart searchedPart     = testGameObject4.AddComponent <WeaponPart>();

        Adaptor adaptorLoadingMechanism  = testGameObject1.AddComponent <Adaptor>();
        Adaptor adaptorLoadingMechnaism2 = testGameObject1.AddComponent <Adaptor>();
        Adaptor adaptorFiringMechanism   = testGameObject2.AddComponent <Adaptor>();
        Adaptor adaptorBarrel            = testGameObject4.AddComponent <Adaptor>();

        adaptorFiringMechanism.ChildPartTransform   = adaptorFiringMechanism.transform;
        adaptorLoadingMechanism.ChildPartTransform  = adaptorLoadingMechanism.transform;
        adaptorLoadingMechnaism2.ChildPartTransform = adaptorLoadingMechanism.transform;
        adaptorBarrel.ChildPartTransform            = adaptorBarrel.transform;

        adaptorFiringMechanism.WeaponTypeOfAdaptor   = WeaponPartType.FiringMechanism;
        adaptorLoadingMechanism.WeaponTypeOfAdaptor  = WeaponPartType.LoadingMechanism;
        adaptorLoadingMechnaism2.WeaponTypeOfAdaptor = WeaponPartType.LoadingMechanism;
        adaptorBarrel.WeaponTypeOfAdaptor            = WeaponPartType.Barrel;


        notSearchedPart.Adaptors = new List <Adaptor> {
            adaptorLoadingMechanism, adaptorLoadingMechnaism2
        };
        notSearchedPart2.Adaptors = new List <Adaptor> {
            adaptorFiringMechanism
        };
        searchedPart.Adaptors = new List <Adaptor> {
            adaptorBarrel
        };

        notSearchedPart.TestSetup("NotSearchedPart", WeaponPartType.Trigger, null);
        notSearchedPart2.TestSetup("NotSearchedPart2", WeaponPartType.LoadingMechanism, notSearchedPart);
        notSearchedPart3.TestSetup("NotSearchedPart3", WeaponPartType.LoadingMechanism, notSearchedPart);
        searchedPart.TestSetup("searchedPart", WeaponPartType.FiringMechanism, notSearchedPart2);



        notSearchedPart.AddChild(notSearchedPart2);
        notSearchedPart.AddChild(notSearchedPart3);
        notSearchedPart2.AddChild(searchedPart);



        notSearchedPart.ConnectChildToAdaptor(adaptorLoadingMechanism, notSearchedPart2);
        notSearchedPart.ConnectChildToAdaptor(adaptorLoadingMechnaism2, notSearchedPart3);
        notSearchedPart2.ConnectChildToAdaptor(adaptorFiringMechanism, searchedPart);

        WeaponStructure weaponStructure = testGameObject.AddComponent <WeaponStructure>();

        weaponStructure.trigger = notSearchedPart;

        testGameObject1.transform.parent = testGameObject.transform;
        testGameObject2.transform.parent = testGameObject1.transform;
        testGameObject3.transform.parent = testGameObject1.transform;
        testGameObject4.transform.parent = testGameObject2.transform;

        Object[] result = new Object[5];
        result[0] = weaponStructure;
        result[1] = searchedPart;
        result[2] = notSearchedPart;
        result[3] = notSearchedPart2;
        result[4] = notSearchedPart3;

        return(result);
    }