public void WhenCombineLatest_AndSomeExistingValues_ShouldSubscribeToPropertyChanges()
        {
            // Arrange
            List <Tuple <bool, string, object> > tuples = new List <Tuple <bool, string, object> >();
            var vm = new MyObservableObject(false, null);

            vm.Something     = "Woot";
            vm.ADynamicValue = vm;

            Observable.CombineLatest(
                vm.WhenPropertyChanged(x => x.IsChecked),
                vm.WhenPropertyChanged(x => x.Something),
                vm.WhenPropertyChanged(x => x.ADynamicValue),
                Tuple.Create)
            .Throttle(TimeSpan.FromMilliseconds(100), _ctx.Default)
            .Subscribe(arg => tuples.Add(arg));

            // Act
            tuples.Clear();
            vm.IsChecked = true;

            Assert.That(tuples.Count, Is.EqualTo(1));
            Assert.That(tuples[0].Item1, Is.EqualTo(true));
            Assert.That(tuples[0].Item2, Is.EqualTo("Woot"));
            Assert.That(tuples[0].Item3, Is.EqualTo((object)vm));
        }
        public void ShouldReturnDefaultOrNullForUninitializedDynamicProperties()
        {
            // Arrange
            var obj = new MyObservableObject(false, null);

            // Assert/Assert
            Assert.That(obj.GetDynamicValue <int>("SomeProp"), Is.EqualTo(default(int)));
            Assert.That(obj.GetDynamicValue <int?>("SomeOtherProp"), Is.Null);
            Assert.That(obj.GetDynamicValue <string>("SomethingElse"), Is.Null);
        }
        public void ShouldGetSetDynamicProperties()
        {
            // Arrange
            var obj = new MyObservableObject(false, null);

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

            // Assert
            Assert.That(obj.GetDynamicValue <int>("SomeProp"), Is.EqualTo(123));
        }
        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 WhenDisposingParentShouldDispose()
        {
            // Arrange
            var container  = new UnityContainer();
            var parent     = new MyObservableObject();
            var collection = new ViewModelTraitCollection(parent, container);

            // Act
            var b0 = collection.Add <MyViewModelTrait>();

            parent.Dispose();

            // Assert
            Assert.That(b0.IsDisposed, Is.True);
        }
        public void WhenAddBehaviourShouldAdd()
        {
            // Arrange
            var container  = new UnityContainer();
            var parent     = new MyObservableObject();
            var collection = new ViewModelTraitCollection(parent, container);

            // Act
            var b = collection.Add <MyViewModelTrait>();

            // Assert
            Assert.That(b, Is.Not.Null);
            Assert.That(collection.Contains <MyViewModelTrait>(), Is.True);
            Assert.That(b.Target, Is.EqualTo(parent));
        }
        public void ShouldDisposeWith()
        {
            // Arrange
            string somethingReceived = null;
            var    vm = new MyObservableObject(false, null);

            vm.WhenPropertyChanged(x => x.Something).Subscribe(arg => somethingReceived = arg).DisposeWith(vm);

            // Act
            vm.Something = "Hello";
            vm.Dispose();
            vm.Something = "World";

            // Assert
            Assert.That(vm.IsChecked, Is.False);
            Assert.That(somethingReceived, Is.EqualTo("Hello"));
        }
        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 ShouldSubscribeToPropertyChanges()
        {
            // Arrange
            bool   boolReceived      = false;
            string somethingReceived = null;
            var    vm = new MyObservableObject(false, null);

            vm.WhenPropertyChanged(x => x.IsChecked).Subscribe(arg => boolReceived      = arg);
            vm.WhenPropertyChanged(x => x.Something).Subscribe(arg => somethingReceived = arg);

            // Act
            vm.IsChecked = true;

            // Assert
            Assert.That(vm.IsChecked, Is.True);
            Assert.That(boolReceived, Is.True);
            Assert.That(somethingReceived, Is.Null);
        }
        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 ShouldSubscribeToPropertyChanges2()
        {
            // Arrange
            bool   boolReceived      = false;
            string somethingReceived = null;
            var    vm = new MyObservableObject(false, null);

            vm.WhenPropertyChanged(x => x.IsChecked).Subscribe(arg => boolReceived      = arg);
            vm.WhenPropertyChanged(x => x.Something).Subscribe(arg => somethingReceived = arg);

            // Act
            vm.Something = "Hello";
            vm.Something = "World";

            // Assert
            Assert.That(vm.IsChecked, Is.False);
            Assert.That(boolReceived, Is.False);
            Assert.That(somethingReceived, Is.EqualTo("World"));
        }
        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" }));
        }
        public void WhenAddBehaviourTwiceShouldReplace()
        {
            // Arrange
            var container  = new UnityContainer();
            var parent     = new MyObservableObject();
            var collection = new ViewModelTraitCollection(parent, container);

            // Act
            var b0 = collection.Add <MyViewModelTrait>();

            b0.Id = "b0";
            var b1 = collection.Add <MyViewModelTrait>();

            b1.Id = "b1";

            // Assert
            Assert.That(b0, Is.Not.Null);
            Assert.That(b1, Is.Not.Null);
            Assert.That(collection.Contains <MyViewModelTrait>(), Is.True);
            Assert.That(b0.IsDisposed, Is.True);
            Assert.That(b1.IsDisposed, Is.False);
            Assert.That(b1.Target, Is.EqualTo(parent));
        }
        public void WhenCombineLatest_ShouldSubscribeToPropertyChanges()
        {
            // Arrange
            List <Tuple <bool, string, object> > tuples = new List <Tuple <bool, string, object> >();
            var vm = new MyObservableObject(false, null);

            Observable.CombineLatest(
                vm.WhenPropertyChanged(x => x.IsChecked),
                vm.WhenPropertyChanged(x => x.Something),
                vm.WhenPropertyChanged(x => x.ADynamicValue),
                Tuple.Create)
            .Throttle(TimeSpan.FromMilliseconds(100), _ctx.Default)
            .Subscribe(arg => tuples.Add(arg));

            Assert.That(tuples.Contains(Tuple.Create(false, (string)null, (object)null)));

            // Act 1
            tuples.Clear();
            vm.IsChecked = true;
            Assert.That(tuples.Contains(Tuple.Create(true, (string)null, (object)null)));

            // Act 2
            tuples.Clear();
            vm.Something = "Woot";
            Assert.That(tuples.Contains(Tuple.Create(true, "Woot", (object)null)));

            // Act 3
            tuples.Clear();
            vm.ADynamicValue = vm;
            Assert.That(tuples.Contains(Tuple.Create(true, "Woot", (object)vm)));

            // Act 3
            tuples.Clear();
            vm.IsChecked = false;
            Assert.That(tuples.Contains(Tuple.Create(false, "Woot", (object)vm)));
        }