public void Choice_OnChangeOnly_Or_Normal__OnNotify()
        {
            CObserverSubject <Test_Args> pObserverSubject = new CObserverSubject <Test_Args>();

            _TestValue = 0;
            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoRegist_Listener(AddField_HasParam_WhenApplyOnly, true); // 두번째 인자가 True일때만 계산되는 이벤트를 리스너로 등록합니다.
            pObserverSubject.DoNotify(new Test_Args(5, false));                        // 두번째 인자가 False이기 때문에 적용되지 않습니다.

            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoNotify(new Test_Args(5, true)); // 두번째 인자가 True이기 때문에 적용됩니다.
            Assert.IsTrue(_TestValue == 5);
        }
        public void HasMultipleObserver_And_GenericParams()
        {
            CObserverSubject <int> pObserverSubject = new CObserverSubject <int>();

            _TestValue = 0;

            pObserverSubject.DoRegist_Listener(AddField_HasParam);
            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoNotify(5);
            Assert.IsTrue(_TestValue == 5);

            pObserverSubject.DoRegist_Listener(MinusField_HasParam);
            pObserverSubject.DoNotify(6);
            Assert.IsTrue(_TestValue == 5); // Add 6, Minus 6을 했기 때문에 원본값 그대로입니다.

            pObserverSubject.DoRemove_Listener(AddField_HasParam);

            pObserverSubject.DoNotify(5);
            Assert.IsTrue(_TestValue == 0);
        }
        public void Regist_And_InstantNotify()
        {
            CObserverSubject <int> pObserverSubject = new CObserverSubject <int>();

            _TestValue = 0;
            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoNotify(5);
            Assert.IsTrue(_TestValue == 0);                              // 등록되있는 Listener가 없기 때문에 변동이 없습니다.

            pObserverSubject.DoRegist_Listener(AddField_HasParam, true); // 뒤늦게 요청했을 때, 2번째 인자가 true면 최신값을 받을 수 있습니다.
            Assert.IsTrue(_TestValue == 5);                              // 최신값을 받았기 때문에 값이 변했습니다.

            pObserverSubject.DoRemove_Listener(AddField_HasParam);       // 이때 Add를 지웠기 때문에 이제 리스너가 없어 TestValue는 변하지 않습니다.
            pObserverSubject.DoNotify(6);
            Assert.IsTrue(_TestValue == 5);

            pObserverSubject.DoRegist_Listener(AddField_HasParam); // 뒤늦게 요청했을 때 2번째 인자를 안넣으면 값은 갱신되지 않습니다.
            Assert.IsTrue(_TestValue == 5);

            pObserverSubject.DoNotify(-5); // AddField Listener가 하나 존재하기 때문에, 값은 0이 됩니다.
            Assert.IsTrue(_TestValue == 0);
        }
        public void HasGenericParams()
        {
            CObserverSubject <int> pObserverSubject = new CObserverSubject <int>();

            _TestValue = 0;

            pObserverSubject.DoRegist_Listener(AddField_HasParam);
            pObserverSubject.DoRegist_Listener(AddField_HasParam); // Listener는 중복되지 않습니다.

            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoNotify(5);
            Assert.IsTrue(_TestValue == 5);
        }
        public void HasMultipleObserver()
        {
            CObserverSubject pObserverSubject = new CObserverSubject();

            _TestValue = 0;

            pObserverSubject.DoRegist_Listener(AddField_1); // _TestValue = 1
            pObserverSubject.Subscribe += AddField_2;       // _TestValue = 1 + 2 = 3

            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoNotify();
            Assert.IsTrue(_TestValue == 3);
        }
        public void IsNotOverlap_Observer()
        {
            CObserverSubject pObserverSubject = new CObserverSubject();

            _TestValue = 0;

            pObserverSubject.DoRegist_Listener(AddField_1); // _TestValue  = 1
            pObserverSubject.DoRegist_Listener(AddField_1); // 등록 되있으면 _TestValue = 2, 등록이 안되었기 때문에 _TestValue = 1

            Assert.IsTrue(_TestValue == 0);

            pObserverSubject.DoNotify();
            Assert.IsTrue(_TestValue == 1);
        }