public async Task TestPropertyChangedSubjectGetter()
 {
     var test2 = new TestMyPropertyChanged2Impl();
     var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2);
     /**/
     var test1 = new TestMyPropertyChanged1Impl();
     var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1);
     /**/
     //var temp1 = test2.PropertyChangedSubject;
     var temp2 = proxy2.PropertyChangedSubject;
     await Task.Delay(500).ConfigureAwait(false);
 }
 public async Task TestPropertyChangedSubjectGetter()
 {
     var test2  = new TestMyPropertyChanged2Impl();
     var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2);
     /**/
     var test1  = new TestMyPropertyChanged1Impl();
     var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1);
     /**/
     //var temp1 = test2.PropertyChangedSubject;
     var temp2 = proxy2.PropertyChangedSubject;
     await Task.Delay(500).ConfigureAwait(false);
 }
        public async Task Test1()
        {
            var test2  = new TestMyPropertyChanged2Impl();
            var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2);
            /**/
            var test1  = new TestMyPropertyChanged1Impl();
            var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1);

            //var proxyProxy1 = MyNotifyPropertyChangedImpl.GetProxy(proxy1);
            using (proxy1.PropertyChangedSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(i =>
            {
                _output.WriteLine(
                    $"proxy1 {i.PropertyName} changed {(i.InnerArgs as MyNotifyPropertyChangedArgs).With(_ => _ == null ? "" : _.PropertyName)}"
                    );
            }))
            {
                _output.WriteLine("----------0");
                proxy1.P1 = 10;
                _output.WriteLine("----------1");
                proxy1.P3 = test2;
                _output.WriteLine("----------2");
                using (proxy2.PropertyChangedSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(i =>
                {
                    _output.WriteLine(string.Format("proxy2 {0} changed", i.PropertyName));
                }))
                {
                    proxy1.P3.P1 = 150;
                    _output.WriteLine("----------3");
                    proxy1.P3 = proxy2;
                    _output.WriteLine("----------4");
                    proxy2.P1 = 200;
                    _output.WriteLine("----------5");
                    proxy2.P1 = 10;
                    _output.WriteLine("----------6");
                }
            }
        }

        [Fact]
        public async Task TestSerialization()
        {
            var test2  = new TestMyPropertyChanged2Impl();
            var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2);
            /**/
            var test1  = new TestMyPropertyChanged1Impl();
            var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1);

            proxy1.P3 = proxy2;
        public async Task Test1()
        {
            var test2 = new TestMyPropertyChanged2Impl();
            var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2);
            /**/
            var test1 = new TestMyPropertyChanged1Impl();
            var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1);
            //var proxyProxy1 = MyNotifyPropertyChangedImpl.GetProxy(proxy1);
            using (proxy1.PropertyChangedSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(i =>
            {
                _output.WriteLine(
                    $"proxy1 {i.PropertyName} changed {(i.InnerArgs as MyNotifyPropertyChangedArgs).With(_ => _ == null ? "" : _.PropertyName)}"
                    );
            }))
            {
                _output.WriteLine("----------0");
                proxy1.P1 = 10;
                _output.WriteLine("----------1");
                proxy1.P3 = test2;
                _output.WriteLine("----------2");
                using (proxy2.PropertyChangedSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(i =>
                {
                    _output.WriteLine(string.Format("proxy2 {0} changed", i.PropertyName));
                }))
                {
                    proxy1.P3.P1 = 150;
                    _output.WriteLine("----------3");
                    proxy1.P3 = proxy2;
                    _output.WriteLine("----------4");
                    proxy2.P1 = 200;
                    _output.WriteLine("----------5");
                    proxy2.P1 = 10;
                    _output.WriteLine("----------6");
                    
                }
            }
        }

        [Fact]
        public async Task TestSerialization()
        {
            var test2 = new TestMyPropertyChanged2Impl();
            var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2);
            /**/
            var test1 = new TestMyPropertyChanged1Impl();
            var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1);
            proxy1.P3 = proxy2;