public void CurrentStateIsReported()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Act
                model.New();

                // Assert
                Assert.AreEqual(StateMachineExample.State1, model.CurrentState);
            }
        }
        public void CtorShouldCreateTracker()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);

                // Act
                var wi = new WorkflowInstance(model);

                // Assert
                Assert.IsNotNull(wi.StateTracker);
            }
        }
        public void CurrentStateIsNullWhenNew()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Act
                var state = model.CurrentState;

                // Assert
                Assert.IsNull(state);
            }
        }
        public void HostIsNotNull()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);
                var wi = new WorkflowInstance(model);

                // Act
                wi.New();

                // Assert
                Assert.IsNotNull(wi.Host);
            }
        }
        public void TransitionsReturnCollectionWhenRun()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;
                model.New();

                // Act
                var actual = model.Transitions;

                // Assert
                Assert.AreEqual(2, actual.Count);
                AssertHelper.OccursInOrder(actual, StateTrigger.T1.ToString(), StateTrigger.T2.ToString());
            }
        }
        public void OnCompleteRemovesCurrent()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;
                var completedEvent = new AutoResetEvent(false);
                model.Workflows.CollectionChanged += (sender, args) => completedEvent.Set();
                model.New();

                // Act
                model.ResumeBookmark(StateTrigger.T1);
                var index1 = model.SelectedIndex;
                var count1 = model.Workflows.Count;

                // Complete the workflow
                model.ResumeBookmark(StateTrigger.T5);
                completedEvent.WaitOne(Globals.Timeout);

                var index2 = model.SelectedIndex;
                var count2 = model.Workflows.Count;

                // Assert
                Assert.AreEqual(1, count1);
                Assert.AreEqual(0, index1);
                Assert.AreEqual(0, count2);
                Assert.AreEqual(-1, index2);
            }
        }
        public void TrackerAccumulatesHistoryAcrossLoad()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                var triggers = new[] { ExampleTrigger.T1 };
                var activity = new StateMachineExample();
                var host = WorkflowApplicationTest.Create(activity);
                Guid id;
                StateMachineStateTracker.Attach(host.TestWorkflowApplication, testdb.CreateInstanceStore());

                // Act
                using (host)
                {
                    try
                    {
                        // Start the workflow and run until it becomes idle with at least one bookmark
                        host.TestWorkflowApplication.RunEpisode(AnyBookmark, Constants.Timeout);

                        // Play each of the triggers
                        foreach (var trigger in triggers)
                        {
                            // Resume the workflow and run until any bookmark
                            host.TestWorkflowApplication.ResumeEpisodeBookmark(
                                trigger.ToString(), Constants.Timeout, AnyBookmark);
                        }

                        host.Persist(Constants.Timeout);
                        host.Unload(Constants.Timeout);
                        id = host.Id;

                    }
                    finally
                    {
                        host.Tracking.Trace();
                    }
                }

                var tracker = StateMachineStateTracker.LoadInstance(id, activity, testdb.ConnectionString);
                var host2 = WorkflowApplicationTest.Create(activity);
                StateMachineStateTracker.Attach(host2.TestWorkflowApplication, testdb.InstanceStore, tracker: tracker);
                host2.Load(id, Constants.Timeout);
                using (host2)
                {
                    try
                    {
                        // Resume the workflow and run until any bookmark
                        host2.TestWorkflowApplication.ResumeEpisodeBookmark(
                            ExampleTrigger.T3.ToString(), Constants.Timeout, AnyBookmark);

                    }
                    finally
                    {
                        host.Tracking.Trace();
                    }
                }

                // Assert
                Assert.IsNotNull(tracker);
                Assert.AreEqual(3, tracker.StateHistory.Count);
            }
        }
        public void UnloadShouldUnloadWorkflowApp()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);

                // Create and run the workflow
                model.New();

                // Act
                // Load the instances from the datbase
                var workflowInstance = model.CurrentInstance;
                workflowInstance.Unload();
                var isLoaded = workflowInstance.IsLoaded;

                // Assert
                Assert.IsFalse(isLoaded);
            }
        }
        public void IsLoadedReturnsTrueOnNew()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);
                var wi = new WorkflowInstance(model);
                wi.New();

                // Act
                var actual = wi.IsLoaded;

                // Assert
                Assert.IsTrue(actual);
            }
        }
        public void TrackerShouldLoadInstancesWithXamlx()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Create a couple of state machines in the persistence store
                RunSampleStateMachineService(testdb, ExampleTrigger.T1, ExampleTrigger.T2);
                RunSampleStateMachineService(testdb, ExampleTrigger.T1, ExampleTrigger.T2, ExampleTrigger.T5);

                // Get the root activity of the workflow service
                var activity = XamlHelper.Load(Constants.StateMachineServiceExampleXamlx);

                var instances = StateMachineStateTracker.LoadInstances(activity, testdb.ConnectionString);

                Assert.IsNotNull(instances);
                Assert.AreEqual(2, instances.Count);
            }
        }
        public void CurrentStateMachineNameIsNullWhenNew()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Act
                var stateMachineName = model.CurrentStateMachineName;

                // Assert
                Assert.AreEqual(WorkflowModel.Unknown, stateMachineName);
            }
        }
        public void ProcedureExistsReturnsTrueWhenProcDoesExist()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Act
                var actual = testdb.ProcedureExists("LoadInstance");

                // Assert
                Assert.IsTrue(actual);
            }
        }
        public void TrackerShouldLoadInstancesWithActivity()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();
                var id = this.RunSampleStateMachine(testdb, StateTrigger.T1, StateTrigger.T3);

                // Act
                var instance = StateTracker.LoadInstance(id, testdb.ConnectionString);

                // Assert
                Assert.IsNotNull(instance);
                Assert.AreEqual(id, instance.InstanceId);
            }
        }
        public void LoadInstancesLoadsTwo()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Create a couple of state machines in the persistence store
                this.RunSampleStateMachine(testdb, StateTrigger.T1, StateTrigger.T3);
                this.RunSampleStateMachine(testdb, StateTrigger.T1, StateTrigger.T3, StateTrigger.T2);

                var instances = StateTracker.LoadInstances(testdb.ConnectionString);

                Assert.IsNotNull(instances);
                Assert.AreEqual(2, instances.Count);

                foreach (var stateTracker in instances)
                {
                    stateTracker.Trace();
                }
            }
        }
        public void ExistsTrueForExistentDatabase()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Act
                var actual = SqlWorkflowInstanceStoreManager.InstanceStoreExists(
                    testdb.DatabaseName,
                    testdb.ConnectionString);

                // Assert
                Assert.IsTrue(actual);
            }
        }
        public void DropShouldDropDatabase()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Act
                SqlWorkflowInstanceStoreManager.DropInstanceStore(
                    testdb.DatabaseName,
                    testdb.ConnectionString);

                // Assert
                Assert.IsFalse(testdb.Exists());
            }
        }
        public void TrackerShouldNotLoadInstancesWithBadId()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Act
                var instance = StateMachineStateTracker.LoadInstance(
                    Guid.NewGuid(), new StateMachineExample(), testdb.ConnectionString);

                Assert.IsNull(instance);
            }
        }
        public void IdIsNotEmptyGuid()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);
                var wi = new WorkflowInstance(model);

                // Act
                var id = wi.Id;

                // Assert
                Assert.AreEqual(Guid.Empty, id);
            }
        }
        public void ViewExistsReturnsTrueWhenViewDoesExist()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Act
                var actual = testdb.ViewExists("Instances");

                // Assert
                Assert.IsTrue(actual);
            }
        }
        public void TrackerShouldLoadInstancesWithXaml()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                testdb.CreateInstanceStore();

                // Create a couple of state machines in the persistence store
                this.RunSampleStateMachine(testdb, ExampleTrigger.T1, ExampleTrigger.T3);
                this.RunSampleStateMachine(testdb, ExampleTrigger.T1, ExampleTrigger.T3, ExampleTrigger.T2);

                var instances = StateMachineStateTracker.LoadInstances(
                    Constants.StateMachineExampleXaml, Constants.StateMachineExample, testdb.ConnectionString);

                Assert.IsNotNull(instances);
                Assert.AreEqual(2, instances.Count);
            }
        }
        public void IdIsLoadedTrackerId()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);

                // Create and run the workflow
                var id = model.New();

                // Act

                // Load the instances from the datbase
                model.LoadInstances(view);

                // Get the id from the state tracker
                var hostid = model.CurrentInstance.Id;

                // Assert
                Assert.AreEqual(hostid, id);
            }
        }
        public void IsLoadedFalseAfterCreate()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Act
                var actual = model.IsLoaded;

                // Assert
                Assert.IsFalse(actual);
            }
        }
        public void IsLoadedFiresPropertyChanged()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);
                var wi = new WorkflowInstance(model);
                var propChanged = false;

                wi.PropertyChanged += (sender, args) =>
                    {
                        if (!propChanged)
                        {
                            propChanged = args.PropertyName == "IsLoaded";
                        }
                    };

                // Act
                wi.New();

                // Assert
                Assert.IsTrue(propChanged);
            }
        }
        public void IsLoadedTrueWhenRun()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                model.New();

                // Act
                var actual = model.IsLoaded;

                // Assert
                Assert.IsTrue(actual);
            }
        }
        public void ResumeShouldResume()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);
                var wi = new WorkflowInstance(model);
                wi.New();

                // Act
                wi.Resume(StateTrigger.T1);

                // Assert
                Assert.AreEqual(StateMachineExample.State2, wi.StateTracker.CurrentState);
            }
        }
        public void LoadReturnsFalseWhenNoCurrentInstance()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Act
                var actual = model.Load();

                // Assert
                Assert.IsFalse(actual);
            }
        }
        public void LoadShouldLoadWorkflowApp()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Create and run the workflow
                model.New();
                model.Unload();

                // Act
                model.Load();
                var isLoaded = model.IsLoaded;

                // Assert
                Assert.IsTrue(isLoaded);
            }
        }
        public void ModelReturnsStateHistory()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = view.Model;

                // Act
                model.New();

                // Assert
                Assert.AreEqual(1, model.StateHistory.Count);
            }
        }
        public void IdIsHostId()
        {
            // Arrange
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                var view = new TestWorkflowView(testdb.CreateInstanceStore());
                var model = new WorkflowModel(view);
                var wi = new WorkflowInstance(model);

                // Act
                wi.New();
                var hostid = wi.Host.Id;
                var id = wi.Id;

                // Assert
                Assert.AreEqual(hostid, id);
            }
        }
        public void AttachToInitializedWorkflowServiceHostShouldThrow()
        {
            using (var testdb = new SqlWorkflowInstanceStoreTest())
            {
                // Arrange
                var store = testdb.CreateInstanceStore();
                var host = new WorkflowServiceHost(
                    new TestBookmark<int> { BookmarkName = "B1" }, ServiceTest.GetUniqueUri());
                host.DurableInstancingOptions.InstanceStore = store;
                host.Open();

                // Act / Assert
                AssertHelper.Throws<InvalidOperationException>(() => StateMachineStateTracker.Attach(host, store));
            }
        }