using Moq; using NUnit.Framework; using Stylet; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StyletUnitTests { [TestFixture] public class ConductorNavigatingTests { private Conductor.StackNavigation conductor; [SetUp] public void SetUp() { this.conductor = new Conductor.StackNavigation(); } [Test] public void ActiveItemIsNullBeforeAnyItemsActivated() { Assert.IsNull(this.conductor.ActiveItem); Assert.That(this.conductor.GetChildren(), Is.EquivalentTo(new IScreen[] { null })); } [Test] public void InitialActivateSetsItemAsActiveItem() { var screen = new Mock(); this.conductor.ActivateItem(screen.Object); Assert.AreEqual(screen.Object, this.conductor.ActiveItem); } [Test] public void InitialActivateDoesNotActivateItemIfConductorIsNotActive() { var screen = new Mock(); this.conductor.ActivateItem(screen.Object); screen.Verify(x => x.Activate(), Times.Never); } [Test] public void InitialActivateActivatesItemIfConductorIsActive() { ((IActivate)this.conductor).Activate(); var screen = new Mock(); this.conductor.ActivateItem(screen.Object); screen.Verify(x => x.Activate()); } [Test] public void ActivatesActiveItemWhenActivated() { var screen = new Mock(); this.conductor.ActivateItem(screen.Object); screen.Verify(x => x.Activate(), Times.Never); ((IActivate)this.conductor).Activate(); screen.Verify(x => x.Activate()); } [Test] public void DeactivatesActiveItemWhenDeactivated() { ((IActivate)this.conductor).Activate(); var screen = new Mock(); this.conductor.ActivateItem(screen.Object); ((IDeactivate)this.conductor).Deactivate(); screen.Verify(x => x.Deactivate()); } [Test] public void ActivateDeactivatesPreviousItemIfConductorIsActiveAndPreviousItemCanClose() { var screen1 = new Mock(); var screen2 = new Mock(); ((IActivate)this.conductor).Activate(); this.conductor.ActivateItem(screen1.Object); screen1.Setup(x => x.CanCloseAsync()).Returns(Task.FromResult(true)); this.conductor.ActivateItem(screen2.Object); screen1.Verify(x => x.Deactivate()); } [Test] public void ActivatingCurrentScreenReactivatesScreen() { var screen = new Mock(); ((IActivate)this.conductor).Activate(); this.conductor.ActivateItem(screen.Object); this.conductor.ActivateItem(screen.Object); screen.Verify(x => x.Activate(), Times.Exactly(2)); screen.Verify(x => x.Close(), Times.Never); } [Test] public void CloseItemDoesNothingIfToldToDeactiveInactiveItem() { var screen1 = new Mock(); var screen2 = new Mock(); ((IActivate)this.conductor).Activate(); this.conductor.ActivateItem(screen1.Object); this.conductor.CloseItem(screen2.Object); screen1.Verify(x => x.Close(), Times.Never); screen2.Verify(x => x.Activate(), Times.Never); } [Test] public void DeactiveDoesNotChangeActiveItem() { var screen = new Mock(); ((IActivate)this.conductor).Activate(); this.conductor.ActivateItem(screen.Object); this.conductor.DeactivateItem(screen.Object); screen.Verify(x => x.Deactivate()); Assert.AreEqual(this.conductor.ActiveItem, screen.Object); } [Test] public void ActivateSetsConductorAsItemsParent() { var screen = new Mock(); this.conductor.ActivateItem(screen.Object); screen.VerifySet(x => x.Parent = this.conductor); } [Test] public void SettingActiveItemActivatesItem() { var screen = new Mock(); ((IActivate)this.conductor).Activate(); this.conductor.ActiveItem =screen.Object; screen.Verify(x => x.Activate()); Assert.AreEqual(this.conductor.ActiveItem, screen.Object); } [Test] public void CloseRemovesItemsParent() { var screen = new Mock(); screen.Setup(x => x.CanCloseAsync()).Returns(Task.FromResult(true)); screen.Setup(x => x.Parent).Returns(this.conductor); this.conductor.ActivateItem(screen.Object); this.conductor.CloseItem(screen.Object); screen.VerifySet(x => x.Parent = null); } [Test] public void CanCloseReturnsTrueIfNoActiveItem() { Assert.IsTrue(this.conductor.CanCloseAsync().Result); } [Test] public void CanCloseReturnsAllItemsCanClose() { var screen1 = new Mock(); var screen2 = new Mock(); this.conductor.ActivateItem(screen1.Object); this.conductor.ActivateItem(screen2.Object); screen1.Setup(x => x.CanCloseAsync()).Returns(Task.FromResult(true)); screen2.Setup(x => x.CanCloseAsync()).Returns(Task.FromResult(false)); Assert.IsFalse(this.conductor.CanCloseAsync().Result); } [Test] public void DeactivatingActiveItemGoesBack() { ((IActivate)this.conductor).Activate(); var screen1 = new Mock(); var screen2 = new Mock(); this.conductor.ActivateItem(screen1.Object); screen1.Verify(x => x.Activate()); this.conductor.ActivateItem(screen2.Object); screen2.Verify(x => x.Activate()); this.conductor.DeactivateItem(screen2.Object); screen2.Verify(x => x.Deactivate(), Times.Once); screen1.Verify(x => x.Activate(), Times.Once); } [Test] public void ClearClosesAllItemsExceptCurrent() { ((IActivate)this.conductor).Activate(); var screen1 = new Mock(); var screen2 = new Mock(); this.conductor.ActivateItem(screen1.Object); this.conductor.ActivateItem(screen2.Object); this.conductor.Clear(); Assert.AreEqual(screen2.Object, this.conductor.ActiveItem); screen2.Setup(x => x.CanCloseAsync()).Returns(Task.FromResult(true)); this.conductor.GoBack(); Assert.IsNull(this.conductor.ActiveItem); } [Test] public void CloseClosesAllItems() { var screen1 = new Mock(); screen1.SetupGet(x => x.Parent).Returns(this.conductor); var screen2 = new Mock(); screen2.SetupGet(x => x.Parent).Returns(this.conductor); this.conductor.ActivateItem(screen1.Object); this.conductor.ActivateItem(screen2.Object); ((IClose)this.conductor).Close(); screen1.Verify(x => x.Close()); screen1.VerifySet(x => x.Parent = null); screen2.Verify(x => x.Close()); screen2.VerifySet(x => x.Parent = null); } [Test] public void ClosesItemIfItemRequestsClose() { var screen = new Mock(); this.conductor.ActivateItem(screen.Object); screen.Setup(x => x.CanCloseAsync()).Returns(Task.FromResult(true)); ((IChildDelegate)this.conductor).CloseItem(screen.Object); screen.Verify(x => x.Close()); Assert.Null(this.conductor.ActiveItem); } } }