aspnetcore/test/Microsoft.VisualStudio.Edit.../DefaultVisualStudioDocument...

312 lines
12 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Razor;
using Microsoft.CodeAnalysis.Razor.Editor;
using Microsoft.CodeAnalysis.Razor.ProjectSystem;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Utilities;
using Moq;
using Xunit;
namespace Microsoft.VisualStudio.Editor.Razor
{
public class DefaultVisualStudioDocumentTrackerTest : ForegroundDispatcherTestBase
{
private IContentType RazorContentType { get; } = Mock.Of<IContentType>(c => c.IsOfType(RazorLanguage.ContentType) == true);
private ITextBuffer TextBuffer => Mock.Of<ITextBuffer>(b => b.ContentType == RazorContentType);
private string FilePath => "C:/Some/Path/TestDocumentTracker.cshtml";
private string ProjectPath => "C:/Some/Path/TestProject.csproj";
private ProjectSnapshotManager ProjectManager => Mock.Of<ProjectSnapshotManager>(p => p.Projects == new List<ProjectSnapshot>());
private EditorSettingsManagerInternal EditorSettingsManager => new DefaultEditorSettingsManagerInternal(Dispatcher);
private Workspace Workspace => new AdhocWorkspace();
private ImportDocumentManager ImportDocumentManager => Mock.Of<ImportDocumentManager>();
[Fact]
public void EditorSettingsManager_Changed_TriggersContextChanged()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
Assert.Equal(ContextChangeKind.EditorSettingsChanged, args.Kind);
called = true;
Assert.Equal(ContextChangeKind.EditorSettingsChanged, args.Kind);
};
// Act
documentTracker.EditorSettingsManager_Changed(null, null);
// Assert
Assert.True(called);
}
[Fact]
public void ProjectManager_Changed_ProjectChanged_TriggersContextChanged()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var project = new AdhocWorkspace().AddProject(ProjectInfo.Create(ProjectId.CreateNewId(), new VersionStamp(), "Test1", "TestAssembly", LanguageNames.CSharp, filePath: "C:/Some/Path/TestProject.csproj"));
var projectSnapshot = new DefaultProjectSnapshot(project);
var projectChangedArgs = new ProjectChangeEventArgs(projectSnapshot, ProjectChangeKind.Changed);
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
Assert.Equal(ContextChangeKind.ProjectChanged, args.Kind);
called = true;
};
// Act
documentTracker.ProjectManager_Changed(null, projectChangedArgs);
// Assert
Assert.True(called);
}
[Fact]
public void ProjectManager_Changed_TagHelpersChanged_TriggersContextChanged()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var project = new AdhocWorkspace().AddProject(ProjectInfo.Create(ProjectId.CreateNewId(), new VersionStamp(), "Test1", "TestAssembly", LanguageNames.CSharp, filePath: "C:/Some/Path/TestProject.csproj"));
var projectSnapshot = new DefaultProjectSnapshot(project);
var projectChangedArgs = new ProjectChangeEventArgs(projectSnapshot, ProjectChangeKind.TagHelpersChanged);
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
Assert.Equal(ContextChangeKind.TagHelpersChanged, args.Kind);
called = true;
};
// Act
documentTracker.ProjectManager_Changed(null, projectChangedArgs);
// Assert
Assert.True(called);
}
[Fact]
public void ProjectManager_Changed_IgnoresUnknownProject()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var project = new AdhocWorkspace().AddProject(ProjectInfo.Create(ProjectId.CreateNewId(), new VersionStamp(), "Test1", "TestAssembly", LanguageNames.CSharp, filePath: "C:/Some/Other/Path/TestProject.csproj"));
var projectSnapshot = new DefaultProjectSnapshot(project);
var projectChangedArgs = new ProjectChangeEventArgs(projectSnapshot, ProjectChangeKind.Changed);
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
called = true;
};
// Act
documentTracker.ProjectManager_Changed(null, projectChangedArgs);
// Assert
Assert.False(called);
}
[Fact]
public void Import_Changed_ImportAssociatedWithDocument_TriggersContextChanged()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
Assert.Equal(ContextChangeKind.ImportsChanged, args.Kind);
called = true;
};
var importChangedArgs = new ImportChangedEventArgs("path/to/import", FileChangeKind.Changed, new[] { FilePath });
// Act
documentTracker.Import_Changed(null, importChangedArgs);
// Assert
Assert.True(called);
}
[Fact]
public void Import_Changed_UnrelatedImport_DoesNothing()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
documentTracker.ContextChanged += (sender, args) =>
{
throw new InvalidOperationException();
};
var importChangedArgs = new ImportChangedEventArgs("path/to/import", FileChangeKind.Changed, new[] { "path/to/differentfile" });
// Act & Assert (Does not throw)
documentTracker.Import_Changed(null, importChangedArgs);
}
[Fact]
public void Subscribe_SetsSupportedProjectAndTriggersContextChanged()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
called = true;
Assert.Equal(ContextChangeKind.ProjectChanged, args.Kind);
};
// Act
documentTracker.Subscribe();
// Assert
Assert.True(called);
Assert.True(documentTracker.IsSupportedProject);
}
[Fact]
public void Unsubscribe_ResetsSupportedProjectAndTriggersContextChanged()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
// Subscribe once to set supported project
documentTracker.Subscribe();
var called = false;
documentTracker.ContextChanged += (sender, args) =>
{
called = true;
Assert.Equal(ContextChangeKind.ProjectChanged, args.Kind);
};
// Act
documentTracker.Unsubscribe();
// Assert
Assert.False(documentTracker.IsSupportedProject);
Assert.True(called);
}
[Fact]
public void AddTextView_AddsToTextViewCollection()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var textView = Mock.Of<ITextView>();
// Act
documentTracker.AddTextView(textView);
// Assert
Assert.Collection(documentTracker.TextViews, v => Assert.Same(v, textView));
}
[Fact]
public void AddTextView_DoesNotAddDuplicateTextViews()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var textView = Mock.Of<ITextView>();
// Act
documentTracker.AddTextView(textView);
documentTracker.AddTextView(textView);
// Assert
Assert.Collection(documentTracker.TextViews, v => Assert.Same(v, textView));
}
[Fact]
public void AddTextView_AddsMultipleTextViewsToCollection()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var textView1 = Mock.Of<ITextView>();
var textView2 = Mock.Of<ITextView>();
// Act
documentTracker.AddTextView(textView1);
documentTracker.AddTextView(textView2);
// Assert
Assert.Collection(
documentTracker.TextViews,
v => Assert.Same(v, textView1),
v => Assert.Same(v, textView2));
}
[Fact]
public void RemoveTextView_RemovesTextViewFromCollection_SingleItem()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var textView = Mock.Of<ITextView>();
documentTracker.AddTextView(textView);
// Act
documentTracker.RemoveTextView(textView);
// Assert
Assert.Empty(documentTracker.TextViews);
}
[Fact]
public void RemoveTextView_RemovesTextViewFromCollection_MultipleItems()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var textView1 = Mock.Of<ITextView>();
var textView2 = Mock.Of<ITextView>();
var textView3 = Mock.Of<ITextView>();
documentTracker.AddTextView(textView1);
documentTracker.AddTextView(textView2);
documentTracker.AddTextView(textView3);
// Act
documentTracker.RemoveTextView(textView2);
// Assert
Assert.Collection(
documentTracker.TextViews,
v => Assert.Same(v, textView1),
v => Assert.Same(v, textView3));
}
[Fact]
public void RemoveTextView_NoopsWhenRemovingTextViewNotInCollection()
{
// Arrange
var documentTracker = new DefaultVisualStudioDocumentTracker(Dispatcher, FilePath, ProjectPath, ProjectManager, EditorSettingsManager, Workspace, TextBuffer, ImportDocumentManager);
var textView1 = Mock.Of<ITextView>();
documentTracker.AddTextView(textView1);
var textView2 = Mock.Of<ITextView>();
// Act
documentTracker.RemoveTextView(textView2);
// Assert
Assert.Collection(documentTracker.TextViews, v => Assert.Same(v, textView1));
}
}
}