public IEnumerator UndoLogic_Is_Working_OnDestroyManager()
            {
                // 이걸 안하면 테스트를 동시에 여러번 했을 때
                // 인스턴스가 이미 있기 때문에 OnInit_ManagerLogic을 호출하지 않습니다.
                CanvasManager_ForLogicTest.DoDestroy_Manager(true);

                Transform pTransformParents = new GameObject(nameof(UndoLogic_Is_Working_OnDestroyManager)).transform;

                // 로직은 실행되면 특정 트렌스폼에 차일드 게임오브젝트를 붙이고
                // 로직을 취소할 경우 마지막 차일드 오브젝트를 Destroy합니다.
                CanvasManagerLogicFactory pLogicFactory = new CanvasManagerLogicFactory();

                pLogicFactory.DoAddLogic_PossibleUndo(EUIObjectState.Process_Before_ShowCoroutine, EUIObjectState.Process_Before_HideCoroutine, new Logic_CreateObject_And_SetParents_And_Undo_Is_Destroy(pTransformParents));
                DoInit(pLogicFactory);

                int iRandomShow = Random.Range(3, 7);
                List <UICommandHandle <Canvas_ForLogicTest> > listHandle = new List <UICommandHandle <Canvas_ForLogicTest> >();

                for (int i = 0; i < iRandomShow; i++)
                {
                    listHandle.Add(CanvasManager_ForLogicTest.DoShow_Multiple <Canvas_ForLogicTest>(ECanvasName.Single));
                }

                yield return(listHandle[listHandle.Count - 1].Yield_WaitForAnimation());

                Assert.AreEqual(pTransformParents.childCount, iRandomShow);
                CanvasManager_ForLogicTest.DoDestroy_Manager(true);

                yield return(null);

                Assert.AreEqual(pTransformParents.childCount, 0);

                yield break;
            }
            public IEnumerator 캔버스의_Undologic_기능테스트_YieldSecond()
            {
                // Arrange
                // 이걸 안하면 테스트를 동시에 여러번 했을 때
                // 인스턴스가 이미 있기 때문에 OnInit_ManagerLogic을 호출하지 않습니다.
                CanvasManager_ForLogicTest.DoDestroy_Manager(true);

                float fWaitSecond      = Random.Range(0.1f, 0.2f);
                float fWaitSecond_Undo = Random.Range(0.1f, 0.2f);



                // Action
                // 로직은 실행되면 Canvas의 원래 값에 어떠한 값을 더하고,
                // 로직을 취소할 경우 원래값으로 복구합니다.
                CanvasManagerLogicFactory pLogicFactory = new CanvasManagerLogicFactory();

                pLogicFactory.DoAddLogic_PossibleUndo(EUIObjectState.Process_After_ShowCoroutine, EUIObjectState.Process_After_HideCoroutine, new Logic_WaitForSecond(fWaitSecond, fWaitSecond_Undo));
                DoInit(pLogicFactory);

                System.Diagnostics.Stopwatch pWatch = new System.Diagnostics.Stopwatch();

                pWatch.Start();
                var pHandle_Show = CanvasManager_ForLogicTest.DoShow <Canvas_ForLogicTest>(ECanvasName.Single);

                yield return(pHandle_Show.Yield_WaitForAnimation());

                pWatch.Stop();

                float fTimeOffset = (Time.deltaTime * 2f);

                // 기다렸는지 체크하는 로직은
                // 실제 기다리는 시간을 지정한 시간의 +- 오차 time.DeltaTime이면 True
                Assert.Greater(pWatch.Elapsed.TotalSeconds, fWaitSecond - fTimeOffset);
                // Assert.Less(pWatch.Elapsed.TotalSeconds, fWaitSecond + Time.deltaTime);

                pWatch.Reset();
                pWatch.Start();
                var pHandle_Hide = CanvasManager_ForLogicTest.DoHide <Canvas_ForLogicTest>(ECanvasName.Single);

                yield return(pHandle_Hide.Yield_WaitForAnimation());

                pWatch.Stop();

                Assert.Greater(pWatch.Elapsed.TotalSeconds, fWaitSecond_Undo - fTimeOffset);
                // Assert.Less(pWatch.Elapsed.TotalSeconds, fWaitSecond + Time.deltaTime);
            }
            public IEnumerator UndoLogic_Is_Working()
            {
                // 이걸 안하면 테스트를 동시에 여러번 했을 때
                // 인스턴스가 이미 있기 때문에 OnInit_ManagerLogic을 호출하지 않습니다.
                CanvasManager_ForLogicTest.DoDestroy_Manager(true);

                int iRandomRange = 100;
                int iRandomValue = Random.Range(-iRandomRange, iRandomRange);

                // 로직은 실행되면 Canvas의 원래 값에 어떠한 값을 더하고,
                // 로직을 취소할 경우 원래값으로 복구합니다.
                CanvasManagerLogicFactory pLogicFactory = new CanvasManagerLogicFactory();

                pLogicFactory.DoAddLogic_PossibleUndo(EUIObjectState.Process_Before_ShowCoroutine, EUIObjectState.Process_Before_HideCoroutine, new Logic_Calculate_Add_And_Undo(iRandomValue));

                DoInit(pLogicFactory);

                int iOriginValue = Random.Range(int.MinValue + iRandomRange, int.MaxValue - iRandomRange);

                var pHandle_Show = CanvasManager_ForLogicTest.DoShow <Canvas_ForLogicTest>(ECanvasName.Single);

                yield return(pHandle_Show.Yield_WaitForSetUIObject());

                var pUICanvas = pHandle_Show.pUIObject;

                pUICanvas.iValue = iOriginValue;

                yield return(pHandle_Show.Yield_WaitForAnimation());

                Assert.AreEqual(pUICanvas.iValue, iOriginValue + iRandomValue);

                CanvasManager_ForLogicTest.DoHide <Canvas_ForLogicTest>(ECanvasName.Single);
                yield return(null);

                Assert.AreEqual(pUICanvas.iValue, iOriginValue);

                yield break;
            }
            public IEnumerator Logic_Is_Working()
            {
                // 이걸 안하면 테스트를 동시에 여러번 했을 때
                // 인스턴스가 이미 있기 때문에 OnInit_ManagerLogic을 호출하지 않습니다.
                CanvasManager_ForLogicTest.DoDestroy_Manager(true);

                // 로직은 string을 Canvas에 Set하는 기능입니다.
                CanvasManagerLogicFactory pLogicFactory = new CanvasManagerLogicFactory();

                pLogicFactory.DoAddLogic(EUIObjectState.Process_Before_ShowCoroutine, new Logic_SetString_ForTest(nameof(EUIObjectState.Process_Before_ShowCoroutine)));
                pLogicFactory.DoAddLogic(EUIObjectState.Process_After_ShowCoroutine, new Logic_SetString_ForTest(nameof(EUIObjectState.Process_After_ShowCoroutine)));
                pLogicFactory.DoAddLogic(EUIObjectState.Process_Before_HideCoroutine, new Logic_SetString_ForTest(nameof(EUIObjectState.Process_Before_HideCoroutine)));
                pLogicFactory.DoAddLogic(EUIObjectState.Process_After_HideCoroutine, new Logic_SetString_ForTest(nameof(EUIObjectState.Process_After_HideCoroutine)));
                DoInit(pLogicFactory);

                var pHandle_Show = CanvasManager_ForLogicTest.DoShow <Canvas_ForLogicTest>(ECanvasName.Single);

                Assert.IsNull(pHandle_Show.pUIObject);

                yield return(pHandle_Show.Yield_WaitForSetUIObject());

                Assert.IsNotNull(pHandle_Show.pUIObject);
                var pUICanvas = pHandle_Show.pUIObject;

                yield return(pHandle_Show.Yield_WaitForAnimation());

                Assert.AreEqual(pUICanvas.strText, nameof(EUIObjectState.Process_After_ShowCoroutine));

                var pHandle_Hide = CanvasManager_ForLogicTest.DoHide <Canvas_ForLogicTest>(ECanvasName.Single);

                yield return(null);

                Assert.AreEqual(pUICanvas.strText, nameof(EUIObjectState.Process_Before_HideCoroutine));

                yield return(pHandle_Hide.Yield_WaitForAnimation());

                Assert.AreEqual(pUICanvas.strText, nameof(EUIObjectState.Process_After_HideCoroutine));


                // UI Object에게 직접 명령 후 Handle 및 Logic 동작 이벤트 테스트
                pHandle_Show = pUICanvas.DoShowCoroutine();
                yield return(pHandle_Show.Yield_WaitForAnimation());

                Assert.AreEqual(pUICanvas.strText, nameof(EUIObjectState.Process_After_ShowCoroutine));

                pHandle_Hide = pUICanvas.DoHide_Coroutine();
                yield return(null);

                Assert.AreEqual(pUICanvas.strText, nameof(EUIObjectState.Process_Before_HideCoroutine));

                yield return(pHandle_Hide.Yield_WaitForAnimation());

                try
                {
                    Assert.AreEqual(pUICanvas.strText, nameof(EUIObjectState.Process_After_HideCoroutine));
                }
                catch
                {
                    pHandle_Hide = pUICanvas.DoHide_Coroutine();
                }

                yield break;
            }