public void RaisesViewsCollectionChangedOnConnectAndDisconnect()
        {
            var connected = new object();
            var view      = new object();
            var match     = Substitute.For <IViewModelViewMatch>();

            match.View.Returns(view);
            this._viewMatcher.Match(connected).Returns(match);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(new object());             // чтобы проверяемый индекс отличался от нуля.

            NotifyCollectionChangedEventArgs args = null;

            connector.Views.CollectionChanged += (sender, e) => args = e;

            connector.Connect(connected);

            Assert.AreEqual(NotifyCollectionChangedAction.Add, args.Action);
            Assert.AreEqual(1, args.NewStartingIndex);
            CollectionAssert.Contains(args.NewItems, view);

            connector.Disconnect(connected);

            Assert.AreEqual(NotifyCollectionChangedAction.Remove, args.Action);
            Assert.AreEqual(1, args.OldStartingIndex);
            CollectionAssert.Contains(args.OldItems, view);
        }
        public void AvoidsUIEffectWhileDisconnecting()
        {
            // О целях данного теста, см. AvoidsUIEffectWhileConnecting.

            var connected1 = new object();
            var connected2 = new object();
            var connected3 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);
            connector.Connect(connected3);

            connector.Active = connected2;

            connector.Views.CollectionChanged += (sender, e) =>
            {
                ((ICollectionView)sender).MoveCurrentToFirst();
            };
            connector.ActiveChanged += (sender, e) =>
            {
                Assert.AreEqual(connected2, e.OldValue);
                Assert.AreEqual(connected3, e.NewValue);
            };

            connector.Disconnect(connected2);
        }
        public void MovesViewInRespectToConnected()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();
            var view2 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();
            var match2 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);
            match2.View.Returns(view2);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns(match2);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            connector.MoveConnected(connected1, 1);

            Assert.AreEqual(1, connector.Views.Cast <object>().ToList().IndexOf(view1));
        }
        public void RemovesDisconnectedViewFromViews()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();
            var view2 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();
            var match2 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);
            match2.View.Returns(view2);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns(match2);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);
            connector.Disconnect(connected1);

            Assert.IsFalse(connector.Views.Contains(view1));
            Assert.IsTrue(connector.Views.Contains(view2));
        }
        public void ActivatesOnConnectWhenActivateOnConnectFlagSet()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();
            var view2 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();
            var match2 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);
            match2.View.Returns(view2);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns(match2);

            IItemsPlacementConnector connector = this.CreateTestObject(ItemsPlacementConnectorFlags.ActivateOnConnect);

            connector.Connect(connected1);

            Assert.AreEqual(connected1, connector.Active);
            Assert.AreEqual(view1, connector.Views.CurrentItem);

            connector.Connect(connected2);

            Assert.AreEqual(connected2, connector.Active);
            Assert.AreEqual(view2, connector.Views.CurrentItem);
        }
        public void AvoidsUIEffectWhileConnecting()
        {
            // Задача теста: убедиться, что внешнее влияние на Views
            // в процессе вызова Connect игнорируется. Почему это важно?
            // Ряд контролов WPF, унаследованных от Selector, форсируют
            // выбор добавленного объекта, когда SelectedItem содержит null.
            // Это приводит к неожиданным событиям OnActiveChanged, а также
            // может нарушить синхронизацию между потребителями коннектора
            // и пользовательским интерфейсом.

            var connected1 = new object();
            var connected2 = new object();
            var connected3 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            connector.Views.CollectionChanged += (sender, e) =>
            {
                ((ICollectionView)sender).MoveCurrentToFirst();
            };
            connector.ActiveChanged += (sender, e) =>
            {
                Assert.Fail("Вызвано событие ActiveChanged");
            };

            connector.Connect(connected3);
        }
        public void RaisesActiveChangedWhenActiveAssigned()
        {
            var connected1 = new object();
            var connected2 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            ActiveChangedEventArgs args = null;

            connector.ActiveChanged += (sender, e) => args = e;

            connector.Active = connected1;

            Assert.IsNull(args.OldValue);
            Assert.AreEqual(connected1, args.NewValue);

            connector.Active = connected2;

            Assert.AreEqual(connected1, args.OldValue);
            Assert.AreEqual(connected2, args.NewValue);

            connector.Active = null;

            Assert.AreEqual(connected2, args.OldValue);
            Assert.IsNull(args.NewValue);
        }
        public void ExposesConnectedInConnected()
        {
            var connected1 = new object();
            var connected2 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            Assert.IsTrue(connector.Connected.Contains(connected1));
            Assert.IsTrue(connector.Connected.Contains(connected2));
        }
        public void RemovesDisconnectedFromConnected()
        {
            var connected1 = new object();
            var connected2 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);
            connector.Disconnect(connected2);

            Assert.IsTrue(connector.Connected.Contains(connected1));
            Assert.IsFalse(connector.Connected.Contains(connected2));
        }
        public void ExposesViewFromDragDropData()
        {
            var connected = new object();
            var view      = Substitute.For <IDisposable>();

            this._connectedDragDrop.IsDragging(connected).Returns(true);
            this._connectedDragDrop.GetData(ConnectedDragDropKeys.UriConnectedView).Returns(view);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected);
            Assert.IsTrue(connector.Views.Contains(view));

            this._viewMatcher.DidNotReceiveWithAnyArgs().Match(null);
        }
        public void MovesConnectedWithinConnected()
        {
            var connected1 = new object();
            var connected2 = new object();
            var connected3 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);
            connector.Connect(connected3);

            connector.MoveConnected(connected1, 2);

            Assert.AreEqual(2, connector.Connected.ToList().IndexOf(connected1));
        }
        public void DoesntRaiseActiveChangedWhenTheSameActiveAssigned()
        {
            var connected = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected);

            connector.Active = connected;

            var wasRaised = false;

            connector.ActiveChanged += (sender, e) => wasRaised = true;

            connector.Active = connected;

            Assert.IsFalse(wasRaised);
        }
        public void DoesntConnectWhenMatchRaiseException()
        {
            this._viewMatcher.Match(null).ReturnsForAnyArgs(ci => { throw new Exception(); });

            IItemsPlacementConnector connector = this.CreateTestObject();

            try
            {
                var resolved = new object();
                connector.Connect(resolved);
            }
            catch (Exception)
            {
            }
            Assert.IsFalse(connector.Connected.Any());
            Assert.IsTrue(connector.Views.IsEmpty);
            Assert.IsTrue(connector.IsPlacementEmpty);
        }
        public void ExposesAssignedActiveAndItsView()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();
            var view2 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();
            var match2 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);
            match2.View.Returns(view2);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns(match2);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            Assert.IsNull(connector.Active);
            Assert.IsNull(connector.Views.CurrentItem);

            connector.Active = connected1;

            Assert.AreEqual(connected1, connector.Active);
            Assert.AreEqual(view1, connector.Views.CurrentItem);
            Assert.AreEqual(0, connector.Views.CurrentPosition);

            connector.Active = connected2;

            Assert.AreEqual(connected2, connector.Active);
            Assert.AreEqual(view2, connector.Views.CurrentItem);
            Assert.AreEqual(1, connector.Views.CurrentPosition);

            connector.Active = null;

            Assert.IsNull(connector.Active);
            Assert.IsNull(connector.Views.CurrentItem);
            Assert.AreEqual(-1, connector.Views.CurrentPosition);
        }
        public void DoesntRaiseConnectedChangedOnMoveConnectedToTheSameIndex()
        {
            var connected1 = new object();
            var connected2 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            var wasRaised = false;

            connector.ConnectedChanged += (sender, e) => wasRaised = true;

            connector.MoveConnected(connected1, 0);
            Assert.IsFalse(wasRaised);

            connector.MoveConnected(connected2, 1);
            Assert.IsFalse(wasRaised);
        }
        public void MakesActiveNullWhenActiveIsSingleAndHaveDisconnected()
        {
            var connected = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected);

            connector.Active = connected;

            ActiveChangedEventArgs args = null;

            connector.ActiveChanged += (sender, e) => args = e;

            connector.Disconnect(connected);

            Assert.IsNull(connector.Active);
            Assert.AreEqual(connected, args.OldValue);
            Assert.IsNull(args.NewValue);
        }
        public void ActivatesConnectedWhenViewsCurrentChanged()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();
            var view2 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();
            var match2 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);
            match2.View.Returns(view2);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns(match2);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            ActiveChangedEventArgs args = null;

            connector.ActiveChanged += (sender, e) => args = e;

            connector.Views.MoveCurrentTo(view2);
            Assert.AreEqual(connected2, connector.Active);
            Assert.IsNull(args.OldValue);
            Assert.AreEqual(connected2, args.NewValue);

            connector.Views.MoveCurrentTo(view1);
            Assert.AreEqual(connected1, connector.Active);
            Assert.AreEqual(connected2, args.OldValue);
            Assert.AreEqual(connected1, args.NewValue);

            connector.Views.MoveCurrentTo(null);
            Assert.IsNull(connector.Active);
            Assert.AreEqual(connected1, args.OldValue);
            Assert.IsNull(args.NewValue);
        }
        public void RaisesConnectedChangedOnMoveConnected()
        {
            var connected1 = new object();
            var connected2 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            ConnectedChangedEventArgs args = null;

            connector.ConnectedChanged += (sender, e) => args = e;

            connector.MoveConnected(connected1, 1);
            Assert.AreEqual(ConnectedChangedAction.Move, args.Action);
            Assert.AreEqual(connected1, args.Changed);

            connector.MoveConnected(connected2, 1);
            Assert.AreEqual(ConnectedChangedAction.Move, args.Action);
            Assert.AreEqual(connected2, args.Changed);
        }
        public void ExposesConnectedAsViewWhenViewModelHasNoMatchedView()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns((IViewModelViewMatch)null);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            Assert.IsFalse(connector.Views.Contains(connected1));
            Assert.IsTrue(connector.Views.Contains(connected2));
        }
        public void RaisesViewsCollectionChangedOnMoveConnected()
        {
            var connected1 = new object();
            var connected2 = new object();

            var view1 = new object();
            var view2 = new object();

            var match1 = Substitute.For <IViewModelViewMatch>();
            var match2 = Substitute.For <IViewModelViewMatch>();

            match1.View.Returns(view1);
            match2.View.Returns(view2);

            this._viewMatcher.Match(connected1).Returns(match1);
            this._viewMatcher.Match(connected2).Returns(match2);

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);

            NotifyCollectionChangedEventArgs args = null;

            connector.Views.CollectionChanged += (sender, e) => args = e;

            connector.MoveConnected(connected1, 1);

            Assert.AreEqual(NotifyCollectionChangedAction.Move, args.Action);
            Assert.AreEqual(1, args.NewStartingIndex);
            CollectionAssert.Contains(args.NewItems, view1);

            connector.MoveConnected(connected2, 1);

            Assert.AreEqual(NotifyCollectionChangedAction.Move, args.Action);
            Assert.AreEqual(1, args.NewStartingIndex);
            CollectionAssert.Contains(args.NewItems, view2);
        }
Exemple #21
0
        public MainWindowViewModel(Func <IItemsPlacementConnector> itemsPlacementConnectorFactory, IShell shell)
        {
            this._figurePlacementConnector = itemsPlacementConnectorFactory();
            this._shell = shell;

            this._shell.AddUriPlacementResolver(this);

            this.SquareLength     = 125;
            this.SquareBackground = "DeepSkyBlue";
            this.CircleDiameter   = 150;
            this.CircleBackground = "Lime";

            this.AddSquareCommand = new DelegateCommand(() =>
            {
                var uri = ShellUriBuilder.StartUri()
                          .Placement("figures")
                          .Module("main")
                          .Item("square")
                          .Parameter("length", this.SquareLength.ToString())
                          .Parameter("background", this.SquareBackground)
                          .End();

                this._shell.Resolve(uri).Open();
            });

            this.AddCircleCommand = new DelegateCommand(() =>
            {
                var uri = ShellUriBuilder.StartUri()
                          .Placement("figures")
                          .Module("main")
                          .Item("circle")
                          .Parameter("diameter", this.CircleDiameter.ToString())
                          .Parameter("background", this.CircleBackground)
                          .End();

                this._shell.Resolve(uri).Open();
            });
        }
        public void ActivatesPreviousWhenActiveIsLastAndHaveDisconnected()
        {
            var connected1 = new object();
            var connected2 = new object();
            var connected3 = new object();

            IItemsPlacementConnector connector = this.CreateTestObject();

            connector.Connect(connected1);
            connector.Connect(connected2);
            connector.Connect(connected3);

            connector.Active = connected3;

            ActiveChangedEventArgs args = null;

            connector.ActiveChanged += (sender, e) => args = e;

            connector.Disconnect(connected3);

            Assert.AreEqual(connected2, connector.Active);
            Assert.AreEqual(connected3, args.OldValue);
            Assert.AreEqual(connected2, args.NewValue);
        }