public void ShouldSetSetGetDynamicProperties()
        {
            // Arrange
            var obj = new MyObservableObject(false, null);

            // Act
            obj.SetDynamicValue <int>("SomeProp", 123);
            obj.SetDynamicValue <int>("SomeProp", 456);
            obj.SetDynamicValue <int>("SomeProp", 789);

            // Assert
            Assert.That(obj.GetDynamicValue <int>("SomeProp"), Is.EqualTo(789));
        }
        public void ShouldRaisePropertyChangedOnDynamicValueSet()
        {
            // Arrange
            var           obj = new MyObservableObject(false, null);
            List <string> propertiesNotified = new List <string>();

            obj.PropertyChanged += (s, e) => propertiesNotified.Add(e.PropertyName);

            // Act
            obj.SetDynamicValue <int>("SomeProp", 123);
            obj.SetDynamicValue <int>("SomeOtherProp", 456);
            obj.SetDynamicValue <int>("SomeProp", 789);

            // Assert
            Assert.That(propertiesNotified.Count, Is.EqualTo(3));
            Assert.That(propertiesNotified, Is.EquivalentTo(new[] { "SomeProp", "SomeOtherProp", "SomeProp" }));
        }
        public void ShouldFireObservableEventsOnDynamicValueSet()
        {
            // Arrange
            var           obj             = new MyObservableObject(false, null);
            List <object> objectsReceived = new List <object>();

            obj.WhenPropertyChanged(x => x.ADynamicValue).Subscribe(v => objectsReceived.Add(v));
            objectsReceived.Clear();

            // Act
            obj.SetDynamicValue <object>("ADynamicValue", 123);
            obj.ADynamicValue = "Testing";
            obj.SetDynamicValue <object>("ADynamicValue", "Dynamic");

            // Assert
            Assert.That(objectsReceived.Count, Is.EqualTo(3));
            Assert.That(objectsReceived, Is.EquivalentTo(new object[] { 123, "Testing", "Dynamic" }));
        }
        public void ShouldClearDynamicPropertiesOnDispose()
        {
            // Arrange
            var obj = new MyObservableObject(false, null);

            obj.SetDynamicValue <object>("ObjectProp", new ObservableObjectBase());
            Assert.That(obj.GetDynamicValue <object>("ObjectProp"), Is.Not.Null);

            // Act
            obj.Dispose();

            // Assert
            Assert.That(obj.GetDynamicValue <object>("ObjectProp"), Is.Null);
        }
        public void ShouldNotRaisePropertyChangedOnDynamicValueSetToSameValue()
        {
            // Arrange
            var           obj = new MyObservableObject(false, null);
            List <string> propertiesNotified = new List <string>();

            obj.PropertyChanged += (s, e) => propertiesNotified.Add(e.PropertyName);

            // Act
            obj.SetDynamicValue <string>("Hi there!", "SomeProp");
            obj.SetDynamicValue <string>("Hi there!", "SomeProp");
            obj.SetDynamicValue <int>(456, "SomeOtherProp");
            obj.SetDynamicValue <int>(456, "SomeOtherProp");
            obj.SetDynamicValue <bool?>(true, "SomeNullableProp");
            obj.SetDynamicValue <bool?>(true, "SomeNullableProp");

            // Assert
            Assert.That(propertiesNotified.Count, Is.EqualTo(3));
            Assert.That(propertiesNotified, Is.EquivalentTo(new[] { "SomeProp", "SomeOtherProp", "SomeNullableProp" }));
        }