internal async Task OnProjectChangedAsync_WhenProjectUnloaded_TriggersCancellation()
        {
            var unloadSource = new CancellationTokenSource();

            var instance = await CreateInitializedInstanceAsync(
                tasksService : IUnconfiguredProjectTasksServiceFactory.ImplementUnloadCancellationToken(unloadSource.Token));

            var registration            = IDataProgressTrackerServiceRegistrationFactory.Create();
            var activeConfiguredProject = ConfiguredProjectFactory.Create();
            var update = IProjectVersionedValueFactory.CreateEmpty();

            await Assert.ThrowsAsync <OperationCanceledException>(() =>
            {
                return(instance.OnProjectChangedAsync(
                           registration,
                           activeConfiguredProject,
                           update,
                           hasChange: _ => true,
                           applyFunc: (_, _, _, token) =>
                {
                    // Simulate project unload during callback
                    unloadSource.Cancel();

                    token.ThrowIfCancellationRequested();
                }));
            });
        }
        public static IDataProgressTrackerService Create()
        {
            var mock = new Mock <IDataProgressTrackerService>();

            mock.Setup(s => s.RegisterOutputDataSource(It.IsAny <IProgressTrackerOutputDataSource>()))
            .Returns(IDataProgressTrackerServiceRegistrationFactory.Create());

            return(mock.Object);
        }
        public static IDataProgressTrackerService ImplementNotifyOutputDataCalculated(Action <IImmutableDictionary <NamedIdentity, IComparable> > action)
        {
            var registration = IDataProgressTrackerServiceRegistrationFactory.ImplementNotifyOutputDataCalculated(action);

            var mock = new Mock <IDataProgressTrackerService>();

            mock.Setup(s => s.RegisterOutputDataSource(It.IsAny <IProgressTrackerOutputDataSource>()))
            .Returns(registration);

            return(mock.Object);
        }
        internal async Task OnProjectChangedAsync_WhenInstanceDisposed_TriggersCancellation()
        {
            var instance = await CreateInitializedInstanceAsync();

            var registration            = IDataProgressTrackerServiceRegistrationFactory.Create();
            var activeConfiguredProject = ConfiguredProjectFactory.Create();
            var update = IProjectVersionedValueFactory.CreateEmpty();

            await Assert.ThrowsAsync <OperationCanceledException>(() =>
            {
                return(instance.OnProjectChangedAsync(
                           registration,
                           activeConfiguredProject,
                           update,
                           hasChange: _ => true,
                           applyFunc: (_, _, state, token) =>
                {
                    // Dispose the instance underneath us
                    instance !.DisposeAsync().Wait();

                    token.ThrowIfCancellationRequested();
                }));
            });