public void GetExtensionsReturnsExtensionsCollection()
        {
            const string BookmarkName = "Test";

            var activity = new Sequence
                {
                    Activities =
                        {
                            new ActivityExtensionTest { AddExtensionProvider = true },
                            new TestBookmark<int> { BookmarkName = BookmarkName },
                            new ActivityExtensionTest { AddExtensionProvider = true },
                        }
                };

            var traceTrackingParticipant = new TraceTrackingParticipant();
            var listTrackingParticipant = new ListTrackingParticipant();

            var workflowApplication = new WorkflowApplication(activity);

            // Add a couple of singleton extensions
            workflowApplication.Extensions.Add(traceTrackingParticipant);
            workflowApplication.Extensions.Add(listTrackingParticipant);

            // foreach (var extension in workflowApplication.Extensions)
            // {
            // Doh! this won't work
            // foreach statement cannot operate on variables of type
            // 'System.Activities.Hosting.WorkflowInstanceExtensionManager'
            // because 'System.Activities.Hosting.WorkflowInstanceExtensionManager'
            // does not contain a public definition for 'GetEnumerator'
            // }

            // Run it so that the activity will create an extension
            workflowApplication.RunEpisode(BookmarkName, Constants.Timeout);

            // Resume and run to completion
            workflowApplication.ResumeEpisodeBookmark(BookmarkName, 1);

            // Now I can get the Singleton Extensions as a collection
            var extensions = workflowApplication.GetSingletonExtensions();
            Assert.IsNotNull(extensions);
            Assert.AreEqual(2, extensions.Count);

            // Note: Extensions created by AddDefaultExtensionProvider will not appear in the collection
            Assert.IsTrue(extensions.Contains(traceTrackingParticipant));
            Assert.IsTrue(extensions.Contains(listTrackingParticipant));

            foreach (var extension in extensions)
            {
                Debug.WriteLine("Found singleton extension " + extension);
            }
        }
        public void WhenPersistedInstanceLoadedRunEpisodeShouldComplete()
        {
            var activity = new TestBookmark<int> { BookmarkName = "Test" };

            var workflowApplication = new WorkflowApplication(activity)
                {
                   InstanceStore = new MemoryStore(), PersistableIdle = args => PersistableIdleAction.Unload,
                };

            // Episodes can end with until unloaded, aborted, completed, timeout
            // Run episode until unloaded because of persistable idle event
            var workflowIdleEpisodeResult =
                workflowApplication.RunEpisode(Constants.Timeout) as WorkflowIdleEpisodeResult;

            Assert.IsNotNull(workflowIdleEpisodeResult);

            // Cannot resume the same WorkflowApplication - it will cause a System.InvalidOperationException
            // Message=WorkflowInstance (guid) cannot be modified after it has started running.
            var workflowApplicationResume = new WorkflowApplication(activity) { InstanceStore = new MemoryStore(), };

            // Load the instance with a new WorkflowApplication
            workflowApplicationResume.Load(workflowIdleEpisodeResult.InstanceId);

            // Resume and complete
            var result = workflowApplicationResume.ResumeEpisodeBookmark("Test", 1);

            Assert.IsInstanceOfType(result, typeof(WorkflowCompletedEpisodeResult));
            Assert.AreEqual(ActivityInstanceState.Closed, result.State);
            AssertOutArgument.AreEqual(((WorkflowCompletedEpisodeResult)result).Outputs, "Result", 1);
        }
        public void WhenActivityRunsToTargetResumeContinuesUntilTrackingReportsActivityState()
        {
            const string WaitForBookmarkName = "TestBookmark";

            var workflowApplication =
                new WorkflowApplication(
                    new Sequence
                        {
                            Activities =
                                {
                                    new Delay { Duration = TimeSpan.FromMilliseconds(1) },
                                    new Delay { Duration = TimeSpan.FromMilliseconds(1) },
                                    new Delay { Duration = TimeSpan.FromMilliseconds(1) },
                                    new TestBookmark<int> { BookmarkName = WaitForBookmarkName },
                                    new Delay { Duration = TimeSpan.FromMilliseconds(1) },
                                    new Delay { Duration = TimeSpan.FromMilliseconds(1) },
                                    new Delay { Duration = TimeSpan.FromMilliseconds(1) },
                                    new TestBookmark<int> { BookmarkName = WaitForBookmarkName },
                                }
                        });

            // Run through three idle events and end the episode when idle with a bookmark "TestBookmark"
            Assert.AreEqual(
                ActivityInstanceState.Executing,
                workflowApplication.RunEpisode(WaitForBookmarkName, Constants.Timeout).State);

            // Assert.AreEqual(ActivityInstanceState.Executing, workflowApplication.RunEpisode(WaitForBookmarkName, TimeSpan.FromHours(1)).State);
            Debug.WriteLine("Running to idle second time TestBookmark");

            // var result = workflowApplication.ResumeEpisodeBookmark(WaitForBookmarkName, 1, WaitForBookmarkName, this.DefaultTimeout);
            var result = workflowApplication.ResumeEpisodeBookmark(
                WaitForBookmarkName, 1, WaitForBookmarkName, TimeSpan.FromHours(1));

            Assert.IsInstanceOfType(result, typeof(WorkflowIdleEpisodeResult));
            Assert.AreEqual(ActivityInstanceState.Executing, result.State);
        }