public IEnumerator SubstanceTweenPlayTestWithEnumeratorPasses()
    {
        // Use the Assert class to test conditions.
        // yield to skip a frame

        //SETUP SCENE/OBJECT
        SetupScene();
        SpawnAndSetupObject();
        yield return(new WaitForSeconds(0.5f));

        //LOAD PROCEDURAL MATERIALS
        LoadAllProceduralMaterialsFromFolder();
        SetSpecificProceduralMaterial("Crystal1-11");
        yield return(new WaitForSeconds(1));

        // ADD MAIN TOOL TO SELECTED OBJECT
        AddEditorToolToObject();

        //REMEMBER CURRENT MATERIAL AS THE STARTUP/BEFORE CHANGE
        materialVariablesBeforeChange = materialBeforeChange.GetProceduralPropertyDescriptions();
        AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange);
        AddSetProceduralVariablesBeforeChangeToKeyValue(materialAtStartup, materialVariablesAtStartup, materialKeysAtStartup, materialValuesAtStartup);
        materialVariablesAtStartup = materialAtStartup.GetProceduralPropertyDescriptions();
        yield return(new WaitForSeconds(0.5f));

        // RANDOMIZE VALUES
        SubstanceTweenSetParameterUtility.RandomizeProceduralValues(testingScript.substanceMaterialParams, testingScript.randomizeSettings);
        yield return(new WaitForSeconds(0.5f));

        // SET TO MINIMUM
        AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange);
        SubstanceTweenSetParameterUtility.SetAllProceduralValuesToMin(testingScript.substanceMaterialParams);
        yield return(new WaitForSeconds(0.5f));

        //SET TO MAXIMUM
        CheckForChangedMaterialParams(materialVariablesBeforeChange);
        AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange);
        SubstanceTweenSetParameterUtility.SetAllProceduralValuesToMax(testingScript.substanceMaterialParams);
        CheckForChangedMaterialParams(materialVariablesBeforeChange);
        yield return(new WaitForSeconds(0.5f));

        // RESET MATERIAL
        SubstanceTweenSetParameterUtility.ResetAllProceduralValues(testingScript.substanceDefaultMaterialParams, testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams);
        CheckForNoChangeInMaterialParams(materialAtStartup, materialVariablesAtStartup, materialKeysAtStartup, materialValuesAtStartup);
        AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange);
        yield return(new WaitForSeconds(0.5f));

        //CREATE KEYFRAMES
        SetSpecificMaterialParamsAndCreateKeyframes(5, "Crystal_Disorder", "Grunge_Map5_Contrast", "Base_Color");
        CheckForChangedMaterialParams(materialVariablesBeforeChange);
        ReWriteAllKeyframeTimes(1, testingScript.substanceMaterialParams, testingScript.animationParams);

        testingScript.substanceToolParams.selectedPrefabScript.animationToggle = true;
        yield return(new WaitForSeconds(40f));

        // START TESTING CURVES
        testingScript.substanceToolParams.testingCurve = true;
        float addKey = 19;

        testingScript.animationParams.substanceCurve.AddKey(addKey, addKey);                                                                                                                               // ADD KEY TO CURVE
        Assert.That(testingScript.animationParams.substanceCurve.keys.Count() != testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key count matches backup ");
        SubstanceTweenKeyframeUtility.CheckForAddKeyFromCurveEditor(testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams, testingScript.flickerValues); // checks if a key was added on the curve. if a curve key was added I add a keyframe for the material
        Assert.That(testingScript.animationParams.substanceCurve.keys.Count() == testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key does not count matches backup ");
        for (int i = 0; i <= testingScript.animationParams.substanceCurve.keys.Count() - 1; i++)
        {
            if (testingScript.animationParams.substanceCurve.keys[i].time == addKey)
            {
                testingScript.animationParams.substanceCurve.RemoveKey(i);
            }
        }
        Assert.That(testingScript.animationParams.substanceCurve.keys.Count() != testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key count matches backup ");
        SubstanceTweenKeyframeUtility.CheckForRemoveOrEditFromCurveEditor(testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams, testingScript.flickerValues); // checks if a key was removed/edited on the curve. if a curve key was removed/edited I reflect the changes to the material keyframes.

        Assert.That(testingScript.animationParams.substanceCurve.keys.Count() == testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key does not count matches backup ");

        //CREATE UNDO STATE
        Undo.RegisterCompleteObjectUndo(new UnityEngine.Object[] { testingScript.referenceToEditorScript }, "Edited Curve");

        //SIMULATE EDITING MULTIPLE CURVE KEYS TO A NEW VALUE THAT DOES NOT ALREADY EXIST ON THE CURVE
        testingScript.animationParams.substanceCurve.RemoveKey(2);
        testingScript.animationParams.substanceCurve.RemoveKey(1);
        testingScript.animationParams.substanceCurve.AddKey(4, 4);

        Assert.That(testingScript.animationParams.substanceCurve.keys.Count() != testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key count matches backup ");
        SubstanceTweenKeyframeUtility.CheckForRemoveOrEditFromCurveEditor(testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams, testingScript.flickerValues);
        Assert.That(testingScript.animationParams.substanceCurve.keys.Count() == testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key does not count matches backup ");

        yield return(new WaitForSeconds(10));

        // UNDO TO A PREVIOUS STATE
        Undo.PerformUndo();

        // STOP TESTING CURVES
        testingScript.substanceToolParams.testingCurve = false;

        yield return(new WaitForSeconds(50));

        //END TEST
        yield break;
    }