Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean up ProjectSnapshotManager tests #10051

Merged
merged 7 commits into from
Mar 11, 2024
Merged
2 changes: 2 additions & 0 deletions SpellingExclusions.dic
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ cshtml
microsoft
Metacode
hresult
csproj
vsls
Original file line number Diff line number Diff line change
Expand Up @@ -404,35 +404,7 @@ private static string EnsureFullPath(string filePath, string projectDirectory)
return normalizedFilePath;
}

// Internal for testing
internal void TryMigrateDocumentsFromRemovedProject(IProjectSnapshot project)
{
_projectSnapshotManagerDispatcher.AssertRunningOnDispatcher();

var miscellaneousProject = _snapshotResolver.GetMiscellaneousProject();

foreach (var documentFilePath in project.DocumentFilePaths)
{
if (project.GetDocument(documentFilePath) is not DocumentSnapshot documentSnapshot)
{
continue;
}

var toProject = _snapshotResolver.FindPotentialProjects(documentFilePath).FirstOrDefault()
?? miscellaneousProject;

var textLoader = new DocumentSnapshotTextLoader(documentSnapshot);
var defaultToProject = toProject;
var newHostDocument = new HostDocument(documentSnapshot.FilePath, documentSnapshot.TargetPath, documentSnapshot.FileKind);

_logger.LogInformation("Migrating '{documentFilePath}' from the '{project.Key}' project to '{toProject.KEy}' project.",
documentFilePath, project.Key, toProject.Key);
_projectSnapshotManagerAccessor.Instance.DocumentAdded(defaultToProject.Key, newHostDocument, textLoader);
}
}

// Internal for testing
internal void TryMigrateMiscellaneousDocumentsToProject()
private void TryMigrateMiscellaneousDocumentsToProject()
{
_projectSnapshotManagerDispatcher.AssertRunningOnDispatcher();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using Microsoft.AspNetCore.Razor.LanguageServer.Formatting;
using Microsoft.AspNetCore.Razor.ProjectSystem;
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem;
using Microsoft.AspNetCore.Razor.Test.Common.Workspaces;
using Microsoft.AspNetCore.Razor.Utilities;
using Microsoft.CodeAnalysis.ExternalAccess.Razor;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Razor.ProjectSystem;
using Microsoft.CodeAnalysis.Text;
Expand All @@ -26,7 +27,7 @@ public class CodeDocumentReferenceHolderTest : LanguageServerTestBase
public CodeDocumentReferenceHolderTest(ITestOutputHelper testOutput)
: base(testOutput)
{
_projectManager = TestProjectSnapshotManager.Create(Dispatcher, ErrorReporter);
_projectManager = CreateProjectSnapshotManager();
_projectManager.AllowNotifyListeners = true;
_referenceHolder = new CodeDocumentReferenceHolder();
_referenceHolder.Initialize(_projectManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
using Microsoft.AspNetCore.Razor.LanguageServer.Tooltip;
using Microsoft.AspNetCore.Razor.ProjectSystem;
using Microsoft.AspNetCore.Razor.Test.Common;
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

#nullable disable

using System;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
Expand All @@ -12,10 +11,10 @@
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.Components;
using Microsoft.AspNetCore.Razor.Language.Intermediate;
using Microsoft.AspNetCore.Razor.Test.Common;
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
using Microsoft.CodeAnalysis.Razor.ProjectSystem;
using Microsoft.CodeAnalysis.Razor.Workspaces;
using Moq;
using Xunit;
using Xunit.Abstractions;
using static Microsoft.AspNetCore.Razor.Language.CommonMetadata;
Expand All @@ -24,15 +23,15 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Test;

public class DefaultRazorComponentSearchEngineTest(ITestOutputHelper testOutput) : LanguageServerTestBase(testOutput)
{
private static readonly IProjectSnapshotManagerAccessor s_projectSnapshotManager = CreateProjectSnapshotManagerAccessor();
private static readonly IProjectSnapshotManagerAccessor s_projectManagerAccessor = CreateProjectSnapshotManagerAccessor();

[Fact]
public async Task Handle_SearchFound_GenericComponent()
{
// Arrange
var tagHelperDescriptor1 = CreateRazorComponentTagHelperDescriptor("First", "First.Components", "Component1", typeName: "Component1<TItem>");
var tagHelperDescriptor2 = CreateRazorComponentTagHelperDescriptor("Second", "Second.Components", "Component3", typeName: "Component3<TItem>");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot1 = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor1);
Expand All @@ -49,7 +48,7 @@ public async Task Handle_SearchFound()
// Arrange
var tagHelperDescriptor1 = CreateRazorComponentTagHelperDescriptor("First", "First.Components", "Component1");
var tagHelperDescriptor2 = CreateRazorComponentTagHelperDescriptor("Second", "Second.Components", "Component3");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot1 = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor1);
Expand All @@ -65,7 +64,7 @@ public async Task Handle_SearchFound_SetNamespace()
{
// Arrange
var tagHelperDescriptor = CreateRazorComponentTagHelperDescriptor("First", "Test", "Component2");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor);
Expand All @@ -79,7 +78,7 @@ public async Task Handle_SearchMissing_IncorrectAssembly()
{
// Arrange
var tagHelperDescriptor = CreateRazorComponentTagHelperDescriptor("Third", "First.Components", "Component3");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor);
Expand All @@ -93,7 +92,7 @@ public async Task Handle_SearchMissing_IncorrectNamespace()
{
// Arrange
var tagHelperDescriptor = CreateRazorComponentTagHelperDescriptor("First", "First.Components", "Component2");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor);
Expand All @@ -107,7 +106,7 @@ public async Task Handle_SearchMissing_IncorrectComponent()
{
// Arrange
var tagHelperDescriptor = CreateRazorComponentTagHelperDescriptor("First", "First.Components", "Component3");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor);
Expand All @@ -121,7 +120,7 @@ public async Task Handle_FilePathAndAssemblyNameDifferent()
{
// Arrange
var tagHelperDescriptor = CreateRazorComponentTagHelperDescriptor("AssemblyName", "Test", "Component2");
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectSnapshotManager, LoggerFactory);
var searchEngine = new DefaultRazorComponentSearchEngine(s_projectManagerAccessor, LoggerFactory);

// Act
var documentSnapshot = await searchEngine.TryLocateComponentAsync(tagHelperDescriptor);
Expand All @@ -147,35 +146,36 @@ internal static IDocumentSnapshot CreateRazorDocumentSnapshot(string text, strin
{
var sourceDocument = TestRazorSourceDocument.Create(text, filePath: filePath, relativePath: filePath);
var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, TestRazorProjectFileSystem.Empty, builder => builder.AddDirective(NamespaceDirective.Directive));
var codeDocument = projectEngine.Process(sourceDocument, FileKinds.Component, importSources: default, Array.Empty<TagHelperDescriptor>());
var codeDocument = projectEngine.Process(sourceDocument, FileKinds.Component, importSources: default, tagHelpers: []);

var namespaceNode = (NamespaceDeclarationIntermediateNode)codeDocument
.GetDocumentIntermediateNode()
.FindDescendantNodes<IntermediateNode>()
.FirstOrDefault(n => n is NamespaceDeclarationIntermediateNode);
namespaceNode.Content = rootNamespaceName;

var documentSnapshot = Mock.Of<IDocumentSnapshot>(d =>
return StrictMock.Of<IDocumentSnapshot>(d =>
d.GetGeneratedOutputAsync() == Task.FromResult(codeDocument) &&
d.FilePath == filePath &&
d.FileKind == FileKinds.Component, MockBehavior.Strict);
return documentSnapshot;
d.FileKind == FileKinds.Component);
}

internal static IProjectSnapshotManagerAccessor CreateProjectSnapshotManagerAccessor()
{
var firstProject = Mock.Of<IProjectSnapshot>(p =>
var firstProject = StrictMock.Of<IProjectSnapshot>(p =>
p.FilePath == "c:/First/First.csproj" &&
p.DocumentFilePaths == new[] { "c:/First/Component1.razor", "c:/First/Component2.razor" } &&
p.GetDocument("c:/First/Component1.razor") == CreateRazorDocumentSnapshot("", "c:/First/Component1.razor", "First.Components") &&
p.GetDocument("c:/First/Component2.razor") == CreateRazorDocumentSnapshot("@namespace Test", "c:/First/Component2.razor", "Test"), MockBehavior.Strict);
p.GetDocument("c:/First/Component2.razor") == CreateRazorDocumentSnapshot("@namespace Test", "c:/First/Component2.razor", "Test"));

var secondProject = Mock.Of<IProjectSnapshot>(p =>
var secondProject = StrictMock.Of<IProjectSnapshot>(p =>
p.FilePath == "c:/Second/Second.csproj" &&
p.DocumentFilePaths == new[] { "c:/Second/Component3.razor" } &&
p.GetDocument("c:/Second/Component3.razor") == CreateRazorDocumentSnapshot("", "c:/Second/Component3.razor", "Second.Components"), MockBehavior.Strict);
p.GetDocument("c:/Second/Component3.razor") == CreateRazorDocumentSnapshot("", "c:/Second/Component3.razor", "Second.Components"));

var projectSnapshotManager = StrictMock.Of<ProjectSnapshotManagerBase>(p =>
p.GetProjects() == new[] { firstProject, secondProject }.ToImmutableArray());

var projectSnapshotManager = Mock.Of<ProjectSnapshotManagerBase>(p => p.GetProjects() == new[] { firstProject, secondProject }.ToImmutableArray(), MockBehavior.Strict);
return new TestProjectSnapshotManagerAccessor(projectSnapshotManager);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,8 @@ private async Task VerifyCSharpGoToDefinitionAsync(string input, string? filePat
{
var languageServer = await CreateLanguageServerAsync(codeDocument, razorFilePath, additionalRazorDocuments);

var projectSnapshotManager = Mock.Of<ProjectSnapshotManagerBase>(p => p.GetProjects() == new[] { Mock.Of<IProjectSnapshot>(MockBehavior.Strict) }.ToImmutableArray(), MockBehavior.Strict);
var projectSnapshotManagerAccessor = new TestProjectSnapshotManagerAccessor(projectSnapshotManager);
var projectManager = Mock.Of<ProjectSnapshotManagerBase>(p => p.GetProjects() == new[] { Mock.Of<IProjectSnapshot>(MockBehavior.Strict) }.ToImmutableArray(), MockBehavior.Strict);
var projectSnapshotManagerAccessor = new TestProjectSnapshotManagerAccessor(projectManager);

var searchEngine = new DefaultRazorComponentSearchEngine(projectSnapshotManagerAccessor, LoggerFactory);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.LanguageServer.Common;
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem;
using Microsoft.AspNetCore.Razor.Test.Common.Workspaces;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Razor;
Expand Down Expand Up @@ -60,7 +61,7 @@ public class RazorDiagnosticsPublisherTest(ITestOutputHelper testOutput) : Langu

protected override async Task InitializeAsync()
{
var testProjectManager = TestProjectSnapshotManager.Create(Dispatcher, ErrorReporter);
var testProjectManager = CreateProjectSnapshotManager();
var hostProject = new HostProject("C:/project/project.csproj", "C:/project/obj", RazorConfiguration.Default, "TestRootNamespace");
var sourceText = SourceText.From(string.Empty);
var textAndVersion = TextAndVersion.Create(sourceText, VersionStamp.Default);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem;
using Microsoft.AspNetCore.Razor.Test.Common;
using Microsoft.AspNetCore.Razor.Test.Common.LanguageServer;
using Microsoft.AspNetCore.Razor.Test.Common.ProjectSystem;
using Microsoft.AspNetCore.Razor.Utilities;
using Microsoft.CodeAnalysis.Razor.ProjectSystem;
using Moq;
Expand All @@ -24,15 +25,13 @@ public class DocumentContextFactoryTest : LanguageServerTestBase

private readonly IDocumentVersionCache _documentVersionCache;
private readonly TestProjectSnapshotManager _projectManager;
private readonly TestProjectSnapshotManagerAccessor _projectManagerAccessor;

public DocumentContextFactoryTest(ITestOutputHelper testOutput)
: base(testOutput)
{
_documentVersionCache = new DocumentVersionCache();

_projectManager = TestProjectSnapshotManager.Create(Dispatcher, ErrorReporter);
_projectManagerAccessor = new TestProjectSnapshotManagerAccessor(_projectManager);
_projectManager = CreateProjectSnapshotManager();
}

[Fact]
Expand All @@ -42,7 +41,7 @@ public void TryCreateAsync_CanNotResolveDocument_ReturnsNull()
var filePath = FilePathNormalizer.Normalize(Path.Combine(s_baseDirectory, "file.cshtml"));
var uri = new Uri(filePath);

var factory = new DocumentContextFactory(_projectManagerAccessor, new TestDocumentResolver(), _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), new TestDocumentResolver(), _documentVersionCache, LoggerFactory);

// Act
var documentContext = factory.TryCreate(uri);
Expand All @@ -58,7 +57,7 @@ public void TryCreateForOpenDocumentAsync_CanNotResolveDocument_ReturnsNull()
var filePath = FilePathNormalizer.Normalize(Path.Combine(s_baseDirectory, "file.cshtml"));
var uri = new Uri(filePath);

var factory = new DocumentContextFactory(_projectManagerAccessor, new TestDocumentResolver(), _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), new TestDocumentResolver(), _documentVersionCache, LoggerFactory);

// Act
var documentContext = factory.TryCreateForOpenDocument(uri);
Expand All @@ -76,7 +75,7 @@ public void TryCreateForOpenDocumentAsync_CanNotResolveVersion_ReturnsNull()

var documentSnapshot = TestDocumentSnapshot.Create(filePath);
var documentResolver = new TestDocumentResolver(documentSnapshot);
var factory = new DocumentContextFactory(_projectManagerAccessor, documentResolver, _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), documentResolver, _documentVersionCache, LoggerFactory);

// Act
var documentContext = factory.TryCreateForOpenDocument(uri);
Expand All @@ -96,7 +95,7 @@ public void TryCreateAsync_ResolvesContent()
var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create(string.Empty, documentSnapshot.FilePath));
documentSnapshot.With(codeDocument);
var documentResolver = new TestDocumentResolver(documentSnapshot);
var factory = new DocumentContextFactory(_projectManagerAccessor, documentResolver, _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), documentResolver, _documentVersionCache, LoggerFactory);

// Act
var documentContext = factory.TryCreate(uri);
Expand All @@ -120,7 +119,7 @@ public async Task TryCreateAsync_WithProjectContext_Resolves()
var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create(string.Empty, documentSnapshot.FilePath));
documentSnapshot.With(codeDocument);
var documentResolver = new TestDocumentResolver(documentSnapshot);
var factory = new DocumentContextFactory(_projectManagerAccessor, documentResolver, _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), documentResolver, _documentVersionCache, LoggerFactory);

var hostProject = new HostProject(projectFilePath, intermediateOutputPath, RazorConfiguration.Default, rootNamespace: null);
var hostDocument = new HostDocument(filePath, "file.cshtml");
Expand Down Expand Up @@ -152,7 +151,7 @@ public async Task TryCreateAsync_WithProjectContext_DoesntUseSnapshotResolver()
var codeDocument = RazorCodeDocument.Create(RazorSourceDocument.Create(string.Empty, documentSnapshot.FilePath));
documentSnapshot.With(codeDocument);
var documentResolverMock = new Mock<ISnapshotResolver>(MockBehavior.Strict);
var factory = new DocumentContextFactory(_projectManagerAccessor, documentResolverMock.Object, _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), documentResolverMock.Object, _documentVersionCache, LoggerFactory);

var hostProject = new HostProject(projectFilePath, intermediateOutputPath, RazorConfiguration.Default, rootNamespace: null);
var hostDocument = new HostDocument(filePath, "file.cshtml");
Expand Down Expand Up @@ -184,7 +183,7 @@ public async Task TryCreateForOpenDocumentAsync_ResolvesContent()
documentSnapshot.With(codeDocument);
var documentResolver = new TestDocumentResolver(documentSnapshot);
await Dispatcher.RunAsync(() => _documentVersionCache.TrackDocumentVersion(documentSnapshot, version: 1337), DisposalToken);
var factory = new DocumentContextFactory(_projectManagerAccessor, documentResolver, _documentVersionCache, LoggerFactory);
var factory = new DocumentContextFactory(_projectManager.GetAccessor(), documentResolver, _documentVersionCache, LoggerFactory);

// Act
var documentContext = factory.TryCreateForOpenDocument(uri);
Expand Down
Loading