async Task IDialogStack.Forward <R, T>(IDialog <R> child, ResumeAfter <R> resume, T item, CancellationToken token) { // put the child on the stack IDialogStack stack = this; stack.Call(child, resume); // run the loop IEventLoop loop = this; await loop.PollAsync(token); // forward the item this.fiber.Post(item); // run the loop again await loop.PollAsync(token); }
public async Task DialogTaskManager_TwoParallelDialogTasks() { var dialog = new Mock <DialogTaskTests.IDialogFrames <string> >(MockBehavior.Strict); var secondStackDialog = new Mock <DialogTaskTests.IDialogFrames <object> >(MockBehavior.Strict); dialog .Setup(d => d.StartAsync(It.IsAny <IDialogContext>())) .Returns <IDialogContext>(async context => { context.Wait(dialog.Object.ItemReceived); }); dialog .Setup(d => d.ItemReceived(It.IsAny <IDialogContext>(), It.IsAny <IAwaitable <IMessageActivity> >())) .Returns <IDialogContext, IAwaitable <IMessageActivity> >(async(context, message) => { var msg = await message; await context.PostAsync(msg.Text); context.Wait(dialog.Object.ItemReceived); }); var promptMessage = "Say something!"; secondStackDialog .Setup(d => d.StartAsync(It.IsAny <IDialogContext>())) .Returns <IDialogContext>( async context => { context.Wait(secondStackDialog.Object.ItemReceived <IMessageActivity>); }); secondStackDialog .Setup(d => d.ItemReceived(It.IsAny <IDialogContext>(), It.IsAny <IAwaitable <IMessageActivity> >())) .Returns <IDialogContext, IAwaitable <IMessageActivity> >(async(context, message) => { PromptDialog.Text(context, secondStackDialog.Object.ItemReceived, promptMessage); }); secondStackDialog .Setup(d => d.ItemReceived(It.IsAny <IDialogContext>(), It.IsAny <IAwaitable <string> >())) .Returns <IDialogContext, IAwaitable <string> >(async(context, message) => { await context.PostAsync($"from prompt {await message}"); context.Wait(secondStackDialog.Object.ItemReceived <IMessageActivity>); }); Func <IDialog <object> > makeRoot = () => dialog.Object; Func <IDialog <object> > secondStackMakeRoot = () => secondStackDialog.Object; var toBot = MakeTestMessage(); using (new FiberTestBase.ResolveMoqAssembly(dialog.Object, secondStackDialog.Object)) using (var container = Build(Options.MockConnectorFactory, dialog.Object, secondStackDialog.Object)) { string foo = "foo"; string bar = "bar"; Queue <IMessageActivity> queue; using (var scope = DialogModule.BeginLifetimeScope(container, toBot)) { toBot.Text = foo; DialogModule_MakeRoot.Register(scope, makeRoot); await scope.Resolve <IPostToBot>().PostAsync(toBot, CancellationToken.None); var botData = scope.Resolve <IBotData>(); await botData.LoadAsync(CancellationToken.None); var dialogTaskManager = scope.Resolve <IDialogTaskManager>(); //create second dialog task var secondDialogTask = dialogTaskManager.CreateDialogTask(); var reactiveDialogTask = new ReactiveDialogTask(secondDialogTask, secondStackMakeRoot); IEventLoop loop = reactiveDialogTask; await loop.PollAsync(CancellationToken.None); IEventProducer <IActivity> producer = reactiveDialogTask; producer.Post(toBot); await loop.PollAsync(CancellationToken.None); await botData.FlushAsync(CancellationToken.None); queue = scope.Resolve <Queue <IMessageActivity> >(); Assert.AreEqual(foo, queue.Dequeue().Text); Assert.AreEqual(promptMessage, queue.Dequeue().Text); } using (var scope = DialogModule.BeginLifetimeScope(container, toBot)) { toBot.Text = bar; DialogModule_MakeRoot.Register(scope, makeRoot); await scope.Resolve <IPostToBot>().PostAsync(toBot, CancellationToken.None); var dialogTaskManager = scope.Resolve <IDialogTaskManager>(); Assert.AreEqual(2, dialogTaskManager.DialogTasks.Count); var secondDialogTask = dialogTaskManager.DialogTasks[1]; await secondDialogTask.PollAsync(CancellationToken.None); secondDialogTask.Post(toBot); await secondDialogTask.PollAsync(CancellationToken.None); queue = scope.Resolve <Queue <IMessageActivity> >(); Assert.AreEqual(bar, queue.Dequeue().Text); Assert.AreEqual($"from prompt {bar}", queue.Dequeue().Text); } } }