public void GetNotVisible()
        {
            var myNativeProperty = new MyWritableNativePropertyClass();

            // ReSharper disable once ObjectCreationAsStatement we want to see the constructor throw an exception
            Action thrower = () => new NativeWritableProperty <string>(myNativeProperty, nameof(myNativeProperty.SetOnly));

            thrower.Should().Throw <ArgumentException>();
        }
        public void WrongType()
        {
            var myNativeProperty = new MyWritableNativePropertyClass {
                Greeting = "hi"
            };

            // ReSharper disable once ObjectCreationAsStatement we want to see the constructor throw an exception
            Action thrower = () => new NativeWritableProperty <int>(myNativeProperty, nameof(myNativeProperty.Greeting));

            thrower.Should().Throw <ArgumentException>();
        }
        public void InitialValue()
        {
            int nativeEvents = 0, kokoEvents = 0;
            var myNativeProperty = new MyWritableNativePropertyClass();

            myNativeProperty.PropertyChanged += delegate { nativeEvents++; };

            myNativeProperty.Greeting = "hello";
            nativeEvents.Should().Be(1);

            var kokoProperty = new NativeReadableProperty <string>(myNativeProperty, nameof(myNativeProperty.Greeting));

            kokoProperty.PropertyChanged += delegate { kokoEvents++; };
            kokoProperty.Value.Should().Be("hello");
            kokoEvents.Should().Be(0, "not changed while koko property existed yet");
        }
        public void WrongPropertyNativeChange()
        {
            int nativeEvents = 0, kokoEvents = 0;
            var myNativeProperty = new MyWritableNativePropertyClass();

            myNativeProperty.PropertyChanged += delegate { nativeEvents++; };
            myNativeProperty.PartingPhrase    = "goodbye";

            var kokoProperty = new NativeWritableProperty <string>(myNativeProperty, nameof(myNativeProperty.Greeting));

            kokoProperty.PropertyChanged += delegate { kokoEvents++; };
            kokoProperty.Value.Should().BeNull();
            kokoEvents.Should().Be(0);

            myNativeProperty.PartingPhrase = "arrivederci";
            kokoProperty.Value.Should().BeNull();
            kokoEvents.Should().Be(0);
            nativeEvents.Should().Be(2);
        }
        public void NativeChange()
        {
            int nativeEvents = 0, kokoEvents = 0;
            var myNativeProperty = new MyWritableNativePropertyClass();

            myNativeProperty.PropertyChanged += delegate { nativeEvents++; };
            myNativeProperty.Greeting         = "hello";

            var kokoProperty = new NativeWritableProperty <string>(myNativeProperty, nameof(myNativeProperty.Greeting));

            kokoProperty.PropertyChanged += delegate { kokoEvents++; };
            kokoProperty.Value.Should().Be("hello");
            kokoEvents.Should().Be(0);

            myNativeProperty.Greeting = "howdy";
            kokoProperty.Value.Should().Be("howdy");
            kokoEvents.Should().Be(1);
            nativeEvents.Should().Be(2);
        }