internal async Task OnProjectChangedAsync_WhenProjectUnloaded_TriggersCancellation(WorkspaceContextHandlerType handlerType) { var unloadSource = new CancellationTokenSource(); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementUnloadCancellationToken(unloadSource.Token); void ApplyProjectBuild(IProjectVersionedValue <IProjectSubscriptionUpdate> _, IProjectBuildSnapshot projectBuildSnapshot, ContextState __, CancellationToken cancellationToken) { // Unload project unloadSource.Cancel(); cancellationToken.ThrowIfCancellationRequested(); } void ApplyProjectEvaluation(IProjectVersionedValue <IProjectSubscriptionUpdate> _, ContextState __, CancellationToken cancellationToken) { // Unload project unloadSource.Cancel(); cancellationToken.ThrowIfCancellationRequested(); } var applyChangesToWorkspaceContext = handlerType switch { WorkspaceContextHandlerType.Evaluation => IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectEvaluationAsync(ApplyProjectEvaluation), WorkspaceContextHandlerType.ProjectBuild => IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectBuildAsync(ApplyProjectBuild), WorkspaceContextHandlerType.SourceItems => IApplyChangesToWorkspaceContextFactory.ImplementApplySourceItemsAsync(ApplyProjectEvaluation), // ApplyProjectEvaluation works for source items as they share a signature _ => throw new NotImplementedException() }; var instance = await CreateInitializedInstanceAsync(tasksService : tasksService, applyChangesToWorkspaceContext : applyChangesToWorkspaceContext); var update = IProjectVersionedValueFactory.Create <(ConfiguredProject, IProjectSubscriptionUpdate, IProjectBuildSnapshot)>((default !, default !, Mock.Of <IProjectBuildSnapshot>()));
[InlineData(false)] // Project Build public async Task OnProjectChangedAsync_WhenProjectUnloaded_TriggersCancellation(bool evaluation) { var unloadSource = new CancellationTokenSource(); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementUnloadCancellationToken(unloadSource.Token); void ApplyProjectBuild(IProjectVersionedValue <IProjectSubscriptionUpdate> _, IProjectBuildSnapshot projectBuildSnapshot, ContextState __, CancellationToken cancellationToken) { // Unload project unloadSource.Cancel(); cancellationToken.ThrowIfCancellationRequested(); } void ApplyProjectEvaluation(IProjectVersionedValue <IProjectSubscriptionUpdate> _, ContextState __, CancellationToken cancellationToken) { // Unload project unloadSource.Cancel(); cancellationToken.ThrowIfCancellationRequested(); } var applyChangesToWorkspaceContext = evaluation ? IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectEvaluationAsync(ApplyProjectEvaluation) : IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectBuildAsync(ApplyProjectBuild); var instance = await CreateInitializedInstanceAsync(tasksService : tasksService, applyChangesToWorkspaceContext : applyChangesToWorkspaceContext); var update = IProjectVersionedValueFactory.Create <(ConfiguredProject, IProjectSubscriptionUpdate, IProjectBuildSnapshot)>(default);
[InlineData(false)] // Project Build public async Task OnProjectChangedAsync_PassesProjectUpdate(bool evaluation) { IProjectVersionedValue <IProjectSubscriptionUpdate> updateResult = null; void applyChanges(IProjectVersionedValue <IProjectSubscriptionUpdate> u, bool _, CancellationToken __) { updateResult = u; } var applyChangesToWorkspaceContext = evaluation ? IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectEvaluationAsync(applyChanges) : IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectBuildAsync(applyChanges); var instance = await CreateInitializedInstanceAsync(applyChangesToWorkspaceContext : applyChangesToWorkspaceContext); var update = IProjectVersionedValueFactory.CreateEmpty(); await instance.OnProjectChangedAsync(update, evaluation); Assert.Same(updateResult, update); }
public async Task OnProjectChangedAsync_RespectsIsActiveContext(bool evaluation, bool isActiveContext) { bool?isActiveContextResult = null; void applyChanges(IProjectVersionedValue <IProjectSubscriptionUpdate> u, bool iac, CancellationToken _) { isActiveContextResult = iac; } var activeWorkspaceProjectContextTracker = IActiveEditorContextTrackerFactory.ImplementIsActiveEditorContext(context => isActiveContext); var applyChangesToWorkspaceContext = evaluation ? IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectEvaluationAsync(applyChanges) : IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectBuildAsync(applyChanges); var instance = await CreateInitializedInstanceAsync(applyChangesToWorkspaceContext : applyChangesToWorkspaceContext, activeWorkspaceProjectContextTracker : activeWorkspaceProjectContextTracker); var update = IProjectVersionedValueFactory.CreateEmpty(); await instance.OnProjectChangedAsync(update, evaluation); Assert.Equal(isActiveContext, isActiveContextResult); }
[InlineData(false)] // Project Build public async Task OnProjectChangedAsync_WhenInstanceDisposed_TriggersCancellation(bool evaluation) { WorkspaceProjectContextHostInstance instance = null; void applyChanges(IProjectVersionedValue <IProjectSubscriptionUpdate> _, bool __, CancellationToken cancellationToken) { // Dispose the instance underneath us instance.Dispose(); cancellationToken.ThrowIfCancellationRequested(); } var applyChangesToWorkspaceContext = evaluation ? IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectEvaluationAsync(applyChanges) : IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectBuildAsync(applyChanges); instance = await CreateInitializedInstanceAsync(applyChangesToWorkspaceContext : applyChangesToWorkspaceContext); var update = IProjectVersionedValueFactory.CreateEmpty(); await Assert.ThrowsAsync <OperationCanceledException>(() => { return(instance.OnProjectChangedAsync(update, evaluation)); }); }
[InlineData(false)] // Project Build public async Task OnProjectChangedAsync_WhenProjectUnloaded_TriggersCancellation(bool evaluation) { var unloadSource = new CancellationTokenSource(); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementUnloadCancellationToken(unloadSource.Token); void applyChanges(IProjectVersionedValue <IProjectSubscriptionUpdate> _, bool __, CancellationToken cancellationToken) { // Unload project unloadSource.Cancel(); cancellationToken.ThrowIfCancellationRequested(); } var applyChangesToWorkspaceContext = evaluation ? IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectEvaluationAsync(applyChanges) : IApplyChangesToWorkspaceContextFactory.ImplementApplyProjectBuildAsync(applyChanges); var instance = await CreateInitializedInstanceAsync(tasksService : tasksService, applyChangesToWorkspaceContext : applyChangesToWorkspaceContext); var update = IProjectVersionedValueFactory.CreateEmpty(); await Assert.ThrowsAsync <OperationCanceledException>(() => { return(instance.OnProjectChangedAsync(update, evaluation)); }); }