diff --git a/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs b/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs index db60307..0f29c79 100644 --- a/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs +++ b/WpfViewModelFirst.Tests/MainWindowViewModelTests.cs @@ -9,26 +9,45 @@ namespace WpfViewModelFirst.Tests [Fact] public void Part1WillSetPart1ViewModelToCurrentViewModel() { - Part1ViewModel part1ViewModel = new(() => _ = true); + Part1ViewModel part1ViewModel = new(() => Task.CompletedTask); Mock mockViewModelFactory = new Mock(); - mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny())) + mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny>())) .Returns(part1ViewModel); MainWindowViewModel main = new(mockViewModelFactory.Object); main.Part1(null); Assert.Equal(part1ViewModel, main.CurrentViewModel); } [Fact] - public void Part1CallbackIsSuccessfull() + public async Task Part1CallbackIsSuccessfull() { + TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); Mock mockViewModelFactory = new Mock(); - mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny())) - .Returns(() => new Part1ViewModel(() => Task.Delay(0))) - .Callback(c => c.Invoke()); + mockViewModelFactory.Setup(vmf => vmf.GetPart1ViewModel(It.IsAny>())) + + .Returns(() => new Part1ViewModel(() => + { + taskCompletionSource.SetResult(true); + return Task.CompletedTask; + })) + .Callback>(c => + { + c.Invoke().ContinueWith(t => + { + taskCompletionSource.SetResult(true); + }); + }) + ; mockViewModelFactory.Setup(vmf => vmf.GetPart2ViewModel()) .Returns(() => new Part2ViewModel()); MainWindowViewModel main = new(mockViewModelFactory.Object); main.Part1(null); + await taskCompletionSource.Task.WaitAsync(CancellationToken.None); Assert.IsType(main.CurrentViewModel); } + + Func Part1Func() + { + return () => Task.CompletedTask; + } } } \ No newline at end of file diff --git a/WpfViewModelFirst/IViewModelFactory.cs b/WpfViewModelFirst/IViewModelFactory.cs index bc55a85..7e71f78 100644 --- a/WpfViewModelFirst/IViewModelFactory.cs +++ b/WpfViewModelFirst/IViewModelFactory.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using WpfViewModelFirst.Part1; using WpfViewModelFirst.Part2; @@ -6,7 +7,7 @@ namespace WpfViewModelFirst { public interface IViewModelFactory { - Part1ViewModel GetPart1ViewModel(Action finishAction); + Part1ViewModel GetPart1ViewModel(Func finishAction); Part2ViewModel GetPart2ViewModel(); } } \ No newline at end of file diff --git a/WpfViewModelFirst/MainWindowViewModel.cs b/WpfViewModelFirst/MainWindowViewModel.cs index 82c682f..d9c96cb 100644 --- a/WpfViewModelFirst/MainWindowViewModel.cs +++ b/WpfViewModelFirst/MainWindowViewModel.cs @@ -27,22 +27,21 @@ namespace WpfViewModelFirst public void Part1(object? e) { CurrentViewModel = null; - CurrentViewModel = _viewModelFactory.GetPart1ViewModel(Part1Action); + CurrentViewModel = _viewModelFactory.GetPart1ViewModel(async () => await Part1Action()); } - private void Part1Action() + private Task Part1Action() { var currentDispatcher = Dispatcher.CurrentDispatcher; CurrentViewModel = null; - LongDelay().ContinueWith(c => + return LongDelay().ContinueWith((c) => { - System.Diagnostics.Debug.WriteLine(c.Result); + //System.Diagnostics.Debug.WriteLine(c.Result); CurrentViewModel = _viewModelFactory.GetPart2ViewModel(); currentDispatcher.Invoke(() => { Strings.Add($"{DateTime.Now}"); - } - ); - }, TaskContinuationOptions.OnlyOnRanToCompletion); + }); + },TaskContinuationOptions.OnlyOnRanToCompletion); } private async Task LongDelay() diff --git a/WpfViewModelFirst/Part1/Part1ViewModel.cs b/WpfViewModelFirst/Part1/Part1ViewModel.cs index 7d8c7e2..fac161b 100644 --- a/WpfViewModelFirst/Part1/Part1ViewModel.cs +++ b/WpfViewModelFirst/Part1/Part1ViewModel.cs @@ -9,18 +9,18 @@ namespace WpfViewModelFirst.Part1 { public class Part1ViewModel : ViewModelBase { - private readonly Action _finishAction; + private readonly Func _finishAction; - public Part1ViewModel(Action finishAction) + public Part1ViewModel(Func finishAction) { _finishAction = finishAction; - FinishCommand = new CustomCommand(Finish); + FinishCommand = new CustomCommand(o => Finish(o)); } public ICommand FinishCommand { get; set; } - private void Finish(object? e) + private Task Finish(object? e) { - _finishAction.Invoke(); + return _finishAction.Invoke(); } } } diff --git a/WpfViewModelFirst/ViewModelFactory.cs b/WpfViewModelFirst/ViewModelFactory.cs index 8f2ceb5..eaa1f31 100644 --- a/WpfViewModelFirst/ViewModelFactory.cs +++ b/WpfViewModelFirst/ViewModelFactory.cs @@ -8,7 +8,7 @@ namespace WpfViewModelFirst { public class ViewModelFactory : IViewModelFactory { - public Part1.Part1ViewModel GetPart1ViewModel(Action finishAction) + public Part1.Part1ViewModel GetPart1ViewModel(Func finishAction) { return new(finishAction); }