Add Razor document tracking to FallbackRazorProjectHost.
- VisualStudio defaults to adding a `<none>` link item when right click -> add existing item for Razor files; therefore, this also includes the knowledge of the "None" item group when finding Razor files. - Added unit and functional tests to verify the new `FallbackRazorProjectHost` behavior. - Added new schema items to represent the `Content` and `None` item type information (pulled from the project system repo). #2373
This commit is contained in:
parent
607812f97f
commit
56d69db0fa
|
|
@ -302,7 +302,6 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private HostDocument[] GetCurrentDocuments(IProjectSubscriptionUpdate update)
|
private HostDocument[] GetCurrentDocuments(IProjectSubscriptionUpdate update)
|
||||||
{
|
{
|
||||||
if (!update.CurrentState.TryGetValue(Rules.RazorGenerateWithTargetPath.SchemaName, out var rule))
|
if (!update.CurrentState.TryGetValue(Rules.RazorGenerateWithTargetPath.SchemaName, out var rule))
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,11 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Immutable;
|
||||||
using System.ComponentModel.Composition;
|
using System.ComponentModel.Composition;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection.Metadata;
|
using System.Reflection.Metadata;
|
||||||
using System.Reflection.PortableExecutable;
|
using System.Reflection.PortableExecutable;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
@ -11,6 +14,9 @@ using System.Threading.Tasks;
|
||||||
using System.Threading.Tasks.Dataflow;
|
using System.Threading.Tasks.Dataflow;
|
||||||
using Microsoft.VisualStudio.LanguageServices;
|
using Microsoft.VisualStudio.LanguageServices;
|
||||||
using Microsoft.VisualStudio.ProjectSystem;
|
using Microsoft.VisualStudio.ProjectSystem;
|
||||||
|
using ContentItem = Microsoft.CodeAnalysis.Razor.ProjectSystem.ManageProjectSystemSchema.ContentItem;
|
||||||
|
using ItemReference = Microsoft.CodeAnalysis.Razor.ProjectSystem.ManageProjectSystemSchema.ItemReference;
|
||||||
|
using NoneItem = Microsoft.CodeAnalysis.Razor.ProjectSystem.ManageProjectSystemSchema.NoneItem;
|
||||||
using ResolvedCompilationReference = Microsoft.CodeAnalysis.Razor.ProjectSystem.ManageProjectSystemSchema.ResolvedCompilationReference;
|
using ResolvedCompilationReference = Microsoft.CodeAnalysis.Razor.ProjectSystem.ManageProjectSystemSchema.ResolvedCompilationReference;
|
||||||
|
|
||||||
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
|
|
@ -58,7 +64,12 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
receiver,
|
receiver,
|
||||||
initialDataAsNew: true,
|
initialDataAsNew: true,
|
||||||
suppressVersionOnlyUpdates: true,
|
suppressVersionOnlyUpdates: true,
|
||||||
ruleNames: new string[] { ResolvedCompilationReference.SchemaName },
|
ruleNames: new string[]
|
||||||
|
{
|
||||||
|
ResolvedCompilationReference.SchemaName,
|
||||||
|
ContentItem.SchemaName,
|
||||||
|
NoneItem.SchemaName,
|
||||||
|
},
|
||||||
linkOptions: new DataflowLinkOptions() { PropagateCompletion = true });
|
linkOptions: new DataflowLinkOptions() { PropagateCompletion = true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -115,9 +126,30 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
|
|
||||||
var configuration = FallbackRazorConfiguration.SelectConfiguration(version);
|
var configuration = FallbackRazorConfiguration.SelectConfiguration(version);
|
||||||
var hostProject = new HostProject(CommonServices.UnconfiguredProject.FullPath, configuration);
|
var hostProject = new HostProject(CommonServices.UnconfiguredProject.FullPath, configuration);
|
||||||
|
|
||||||
|
// We need to deal with the case where the project was uninitialized, but now
|
||||||
|
// is valid for Razor. In that case we might have previously seen all of the documents
|
||||||
|
// but ignored them because the project wasn't active.
|
||||||
|
//
|
||||||
|
// So what we do to deal with this, is that we 'remove' all changed and removed items
|
||||||
|
// and then we 'add' all current items. This allows minimal churn to the PSM, but still
|
||||||
|
// makes us up-to-date.
|
||||||
|
var documents = GetCurrentDocuments(update.Value);
|
||||||
|
var changedDocuments = GetChangedAndRemovedDocuments(update.Value);
|
||||||
|
|
||||||
await UpdateAsync(() =>
|
await UpdateAsync(() =>
|
||||||
{
|
{
|
||||||
UpdateProjectUnsafe(hostProject);
|
UpdateProjectUnsafe(hostProject);
|
||||||
|
|
||||||
|
for (var i = 0; i < changedDocuments.Length; i++)
|
||||||
|
{
|
||||||
|
RemoveDocumentUnsafe(changedDocuments[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < documents.Length; i++)
|
||||||
|
{
|
||||||
|
AddDocumentUnsafe(documents[i]);
|
||||||
|
}
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
});
|
});
|
||||||
}, registerFaultHandler: true);
|
}, registerFaultHandler: true);
|
||||||
|
|
@ -129,6 +161,97 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
return ReadAssemblyVersion(filePath);
|
return ReadAssemblyVersion(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Internal for testing
|
||||||
|
internal HostDocument[] GetCurrentDocuments(IProjectSubscriptionUpdate update)
|
||||||
|
{
|
||||||
|
var documents = new List<HostDocument>();
|
||||||
|
|
||||||
|
// Content Razor files
|
||||||
|
if (update.CurrentState.TryGetValue(ContentItem.SchemaName, out var rule))
|
||||||
|
{
|
||||||
|
foreach (var kvp in rule.Items)
|
||||||
|
{
|
||||||
|
if (TryGetRazorDocument(kvp.Value, out var document))
|
||||||
|
{
|
||||||
|
documents.Add(document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// None Razor files, these are typically included when a user links a file in Visual Studio.
|
||||||
|
if (update.CurrentState.TryGetValue(NoneItem.SchemaName, out var nonRule))
|
||||||
|
{
|
||||||
|
foreach (var kvp in nonRule.Items)
|
||||||
|
{
|
||||||
|
if (TryGetRazorDocument(kvp.Value, out var document))
|
||||||
|
{
|
||||||
|
documents.Add(document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return documents.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internal for testing
|
||||||
|
internal HostDocument[] GetChangedAndRemovedDocuments(IProjectSubscriptionUpdate update)
|
||||||
|
{
|
||||||
|
var documents = new List<HostDocument>();
|
||||||
|
|
||||||
|
// Content Razor files
|
||||||
|
if (update.ProjectChanges.TryGetValue(ContentItem.SchemaName, out var rule))
|
||||||
|
{
|
||||||
|
foreach (var key in rule.Difference.RemovedItems.Concat(rule.Difference.ChangedItems))
|
||||||
|
{
|
||||||
|
if (rule.Before.Items.TryGetValue(key, out var value) &&
|
||||||
|
TryGetRazorDocument(value, out var document))
|
||||||
|
{
|
||||||
|
documents.Add(document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// None Razor files, these are typically included when a user links a file in Visual Studio.
|
||||||
|
if (update.ProjectChanges.TryGetValue(NoneItem.SchemaName, out var nonRule))
|
||||||
|
{
|
||||||
|
foreach (var key in nonRule.Difference.RemovedItems.Concat(nonRule.Difference.ChangedItems))
|
||||||
|
{
|
||||||
|
if (nonRule.Before.Items.TryGetValue(key, out var value) &&
|
||||||
|
TryGetRazorDocument(value, out var document))
|
||||||
|
{
|
||||||
|
documents.Add(document);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return documents.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Internal for testing
|
||||||
|
internal bool TryGetRazorDocument(IImmutableDictionary<string, string> itemState, out HostDocument razorDocument)
|
||||||
|
{
|
||||||
|
if (itemState.TryGetValue(ItemReference.FullPathPropertyName, out var filePath))
|
||||||
|
{
|
||||||
|
// If there's no target path then we normalize the target path to the file path. In the end, all we care about
|
||||||
|
// is that the file being included in the primary project ends in .cshtml.
|
||||||
|
itemState.TryGetValue(ItemReference.LinkPropertyName, out var targetPath);
|
||||||
|
if (string.IsNullOrEmpty(targetPath))
|
||||||
|
{
|
||||||
|
targetPath = filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetPath.EndsWith(".cshtml"))
|
||||||
|
{
|
||||||
|
targetPath = CommonServices.UnconfiguredProject.MakeRooted(targetPath);
|
||||||
|
razorDocument = new HostDocument(filePath, targetPath);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
razorDocument = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private static Version ReadAssemblyVersion(string filePath)
|
private static Version ReadAssemblyVersion(string filePath)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
||||||
|
|
@ -12,5 +12,26 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
|
|
||||||
public static readonly string ItemName = "ResolvedCompilationReference";
|
public static readonly string ItemName = "ResolvedCompilationReference";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class ContentItem
|
||||||
|
{
|
||||||
|
public static readonly string SchemaName = "Content";
|
||||||
|
|
||||||
|
public static readonly string ItemName = "Content";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class NoneItem
|
||||||
|
{
|
||||||
|
public static readonly string SchemaName = "None";
|
||||||
|
|
||||||
|
public static readonly string ItemName = "None";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ItemReference
|
||||||
|
{
|
||||||
|
public static readonly string FullPathPropertyName = "FullPath";
|
||||||
|
|
||||||
|
public static readonly string LinkPropertyName = "Link";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,12 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Immutable;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.VisualStudio.ProjectSystem;
|
using Microsoft.VisualStudio.ProjectSystem;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
using ItemReference = Microsoft.CodeAnalysis.Razor.ProjectSystem.ManageProjectSystemSchema.ItemReference;
|
||||||
|
|
||||||
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
{
|
{
|
||||||
|
|
@ -18,19 +20,211 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
ProjectManager = new TestProjectSnapshotManager(Dispatcher, Workspace);
|
ProjectManager = new TestProjectSnapshotManager(Dispatcher, Workspace);
|
||||||
|
|
||||||
ReferenceItems = new ItemCollection(ManageProjectSystemSchema.ResolvedCompilationReference.SchemaName);
|
ReferenceItems = new ItemCollection(ManageProjectSystemSchema.ResolvedCompilationReference.SchemaName);
|
||||||
|
ContentItems = new ItemCollection(ManageProjectSystemSchema.ContentItem.SchemaName);
|
||||||
|
NoneItems = new ItemCollection(ManageProjectSystemSchema.NoneItem.SchemaName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemCollection ReferenceItems { get; }
|
private ItemCollection ReferenceItems { get; }
|
||||||
|
|
||||||
private TestProjectSnapshotManager ProjectManager { get; }
|
private TestProjectSnapshotManager ProjectManager { get; }
|
||||||
|
|
||||||
|
private ItemCollection ContentItems { get; }
|
||||||
|
|
||||||
|
private ItemCollection NoneItems { get; }
|
||||||
|
|
||||||
private Workspace Workspace { get; }
|
private Workspace Workspace { get; }
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetChangedAndRemovedDocuments_ReturnsChangedContentAndNoneItems()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var afterChangeContentItems = new ItemCollection(ManageProjectSystemSchema.ContentItem.SchemaName);
|
||||||
|
ContentItems.Item("Index.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "NewIndex.cshtml",
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\From\\Index.cshtml",
|
||||||
|
});
|
||||||
|
var afterChangeNoneItems = new ItemCollection(ManageProjectSystemSchema.NoneItem.SchemaName);
|
||||||
|
NoneItems.Item("About.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "NewAbout.cshtml",
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\From\\About.cshtml",
|
||||||
|
});
|
||||||
|
var services = new TestProjectSystemServices("C:\\To\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var changes = new TestProjectChangeDescription[]
|
||||||
|
{
|
||||||
|
afterChangeContentItems.ToChange(ContentItems.ToSnapshot()),
|
||||||
|
afterChangeNoneItems.ToChange(NoneItems.ToSnapshot()),
|
||||||
|
};
|
||||||
|
var update = services.CreateUpdate(changes).Value;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.GetChangedAndRemovedDocuments(update);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(
|
||||||
|
result,
|
||||||
|
document =>
|
||||||
|
{
|
||||||
|
Assert.Equal("C:\\From\\Index.cshtml", document.FilePath);
|
||||||
|
Assert.Equal("C:\\To\\NewIndex.cshtml", document.TargetPath);
|
||||||
|
},
|
||||||
|
document =>
|
||||||
|
{
|
||||||
|
Assert.Equal("C:\\From\\About.cshtml", document.FilePath);
|
||||||
|
Assert.Equal("C:\\To\\NewAbout.cshtml", document.TargetPath);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetCurrentDocuments_ReturnsContentAndNoneItems()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
ContentItems.Item("Index.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "NewIndex.cshtml",
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\From\\Index.cshtml",
|
||||||
|
});
|
||||||
|
NoneItems.Item("About.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "NewAbout.cshtml",
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\From\\About.cshtml",
|
||||||
|
});
|
||||||
|
var services = new TestProjectSystemServices("C:\\To\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var changes = new TestProjectChangeDescription[]
|
||||||
|
{
|
||||||
|
ContentItems.ToChange(),
|
||||||
|
NoneItems.ToChange(),
|
||||||
|
};
|
||||||
|
var update = services.CreateUpdate(changes).Value;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.GetCurrentDocuments(update);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Collection(
|
||||||
|
result,
|
||||||
|
document =>
|
||||||
|
{
|
||||||
|
Assert.Equal("C:\\From\\Index.cshtml", document.FilePath);
|
||||||
|
Assert.Equal("C:\\To\\NewIndex.cshtml", document.TargetPath);
|
||||||
|
},
|
||||||
|
document =>
|
||||||
|
{
|
||||||
|
Assert.Equal("C:\\From\\About.cshtml", document.FilePath);
|
||||||
|
Assert.Equal("C:\\To\\NewAbout.cshtml", document.TargetPath);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TryGetRazorDocument_NoFilePath_ReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var services = new TestProjectSystemServices("C:\\To\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var itemState = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "Index.cshtml",
|
||||||
|
}.ToImmutableDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.TryGetRazorDocument(itemState, out var document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(result);
|
||||||
|
Assert.Null(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TryGetRazorDocument_NonRazorFilePath_ReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var services = new TestProjectSystemServices("C:\\Path\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var itemState = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\Path\\site.css",
|
||||||
|
}.ToImmutableDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.TryGetRazorDocument(itemState, out var document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(result);
|
||||||
|
Assert.Null(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TryGetRazorDocument_NonRazorTargetPath_ReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var services = new TestProjectSystemServices("C:\\Path\\To\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var itemState = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "site.html",
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\Path\\From\\Index.cshtml",
|
||||||
|
}.ToImmutableDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.TryGetRazorDocument(itemState, out var document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.False(result);
|
||||||
|
Assert.Null(document);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TryGetRazorDocument_JustFilePath_ReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var expectedPath = "C:\\Path\\Index.cshtml";
|
||||||
|
var services = new TestProjectSystemServices("C:\\Path\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var itemState = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.FullPathPropertyName] = expectedPath,
|
||||||
|
}.ToImmutableDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.TryGetRazorDocument(itemState, out var document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(result);
|
||||||
|
Assert.Equal(expectedPath, document.FilePath);
|
||||||
|
Assert.Equal(expectedPath, document.TargetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TryGetRazorDocument_LinkedFilepath_ReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var expectedFullPath = "C:\\Path\\From\\Index.cshtml";
|
||||||
|
var expectedTargetPath = "C:\\Path\\To\\Index.cshtml";
|
||||||
|
var services = new TestProjectSystemServices("C:\\Path\\To\\Test.csproj");
|
||||||
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
var itemState = new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.LinkPropertyName] = "Index.cshtml",
|
||||||
|
[ItemReference.FullPathPropertyName] = expectedFullPath,
|
||||||
|
}.ToImmutableDictionary();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = host.TryGetRazorDocument(itemState, out var document);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(result);
|
||||||
|
Assert.Equal(expectedFullPath, document.FilePath);
|
||||||
|
Assert.Equal(expectedTargetPath, document.TargetPath);
|
||||||
|
}
|
||||||
|
|
||||||
[ForegroundFact]
|
[ForegroundFact]
|
||||||
public async Task FallbackRazorProjectHost_ForegroundThread_CreateAndDispose_Succeeds()
|
public async Task FallbackRazorProjectHost_ForegroundThread_CreateAndDispose_Succeeds()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var services = new TestProjectSystemServices("Test.csproj");
|
var services = new TestProjectSystemServices("C:\\To\\Test.csproj");
|
||||||
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager);
|
||||||
|
|
||||||
// Act & Assert
|
// Act & Assert
|
||||||
|
|
@ -83,13 +277,23 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
ReferenceItems.Item("c:\\nuget\\Microsoft.AspNetCore.Mvc.razor.dll");
|
ReferenceItems.Item("c:\\nuget\\Microsoft.AspNetCore.Mvc.razor.dll");
|
||||||
|
ContentItems.Item("Index.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\Path\\Index.cshtml",
|
||||||
|
});
|
||||||
|
NoneItems.Item("About.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\Path\\About.cshtml",
|
||||||
|
});
|
||||||
|
|
||||||
var changes = new TestProjectChangeDescription[]
|
var changes = new TestProjectChangeDescription[]
|
||||||
{
|
{
|
||||||
ReferenceItems.ToChange(),
|
ReferenceItems.ToChange(),
|
||||||
|
ContentItems.ToChange(),
|
||||||
|
NoneItems.ToChange(),
|
||||||
};
|
};
|
||||||
|
|
||||||
var services = new TestProjectSystemServices("Test.csproj");
|
var services = new TestProjectSystemServices("C:\\Path\\Test.csproj");
|
||||||
|
|
||||||
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager)
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager)
|
||||||
{
|
{
|
||||||
|
|
@ -104,9 +308,14 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
var snapshot = Assert.Single(ProjectManager.Projects);
|
var snapshot = Assert.Single(ProjectManager.Projects);
|
||||||
Assert.Equal("Test.csproj", snapshot.FilePath);
|
Assert.Equal("C:\\Path\\Test.csproj", snapshot.FilePath);
|
||||||
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
||||||
|
|
||||||
|
Assert.Collection(
|
||||||
|
snapshot.DocumentFilePaths,
|
||||||
|
filePath => Assert.Equal("C:\\Path\\Index.cshtml", filePath),
|
||||||
|
filePath => Assert.Equal("C:\\Path\\About.cshtml", filePath));
|
||||||
|
|
||||||
await Task.Run(async () => await host.DisposeAsync());
|
await Task.Run(async () => await host.DisposeAsync());
|
||||||
Assert.Empty(ProjectManager.Projects);
|
Assert.Empty(ProjectManager.Projects);
|
||||||
}
|
}
|
||||||
|
|
@ -169,13 +378,24 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
ReferenceItems.Item("c:\\nuget\\Microsoft.AspNetCore.Mvc.razor.dll");
|
ReferenceItems.Item("c:\\nuget\\Microsoft.AspNetCore.Mvc.razor.dll");
|
||||||
|
var afterChangeContentItems = new ItemCollection(ManageProjectSystemSchema.ContentItem.SchemaName);
|
||||||
|
ContentItems.Item("Index.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\Path\\Index.cshtml",
|
||||||
|
});
|
||||||
|
|
||||||
|
var initialChanges = new TestProjectChangeDescription[]
|
||||||
|
{
|
||||||
|
ReferenceItems.ToChange(),
|
||||||
|
ContentItems.ToChange(),
|
||||||
|
};
|
||||||
var changes = new TestProjectChangeDescription[]
|
var changes = new TestProjectChangeDescription[]
|
||||||
{
|
{
|
||||||
ReferenceItems.ToChange(),
|
ReferenceItems.ToChange(),
|
||||||
|
afterChangeContentItems.ToChange(ContentItems.ToSnapshot()),
|
||||||
};
|
};
|
||||||
|
|
||||||
var services = new TestProjectSystemServices("Test.csproj");
|
var services = new TestProjectSystemServices("C:\\Path\\Test.csproj");
|
||||||
|
|
||||||
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager)
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager)
|
||||||
{
|
{
|
||||||
|
|
@ -186,12 +406,14 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
Assert.Empty(ProjectManager.Projects);
|
Assert.Empty(ProjectManager.Projects);
|
||||||
|
|
||||||
// Act - 1
|
// Act - 1
|
||||||
await Task.Run(async () => await host.OnProjectChanged(services.CreateUpdate(changes)));
|
await Task.Run(async () => await host.OnProjectChanged(services.CreateUpdate(initialChanges)));
|
||||||
|
|
||||||
// Assert - 1
|
// Assert - 1
|
||||||
var snapshot = Assert.Single(ProjectManager.Projects);
|
var snapshot = Assert.Single(ProjectManager.Projects);
|
||||||
Assert.Equal("Test.csproj", snapshot.FilePath);
|
Assert.Equal("C:\\Path\\Test.csproj", snapshot.FilePath);
|
||||||
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
||||||
|
var filePath = Assert.Single(snapshot.DocumentFilePaths);
|
||||||
|
Assert.Equal("C:\\Path\\Index.cshtml", filePath);
|
||||||
|
|
||||||
// Act - 2
|
// Act - 2
|
||||||
host.AssemblyVersion = new Version(1, 0);
|
host.AssemblyVersion = new Version(1, 0);
|
||||||
|
|
@ -199,8 +421,9 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
|
|
||||||
// Assert - 2
|
// Assert - 2
|
||||||
snapshot = Assert.Single(ProjectManager.Projects);
|
snapshot = Assert.Single(ProjectManager.Projects);
|
||||||
Assert.Equal("Test.csproj", snapshot.FilePath);
|
Assert.Equal("C:\\Path\\Test.csproj", snapshot.FilePath);
|
||||||
Assert.Same(FallbackRazorConfiguration.MVC_1_0, snapshot.Configuration);
|
Assert.Same(FallbackRazorConfiguration.MVC_1_0, snapshot.Configuration);
|
||||||
|
Assert.Empty(snapshot.DocumentFilePaths);
|
||||||
|
|
||||||
await Task.Run(async () => await host.DisposeAsync());
|
await Task.Run(async () => await host.DisposeAsync());
|
||||||
Assert.Empty(ProjectManager.Projects);
|
Assert.Empty(ProjectManager.Projects);
|
||||||
|
|
@ -236,7 +459,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
||||||
|
|
||||||
// Act - 2
|
// Act - 2
|
||||||
host.AssemblyVersion= null;
|
host.AssemblyVersion = null;
|
||||||
await Task.Run(async () => await host.OnProjectChanged(services.CreateUpdate(changes)));
|
await Task.Run(async () => await host.OnProjectChanged(services.CreateUpdate(changes)));
|
||||||
|
|
||||||
// Assert - 2
|
// Assert - 2
|
||||||
|
|
@ -251,13 +474,18 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
ReferenceItems.Item("c:\\nuget\\Microsoft.AspNetCore.Mvc.razor.dll");
|
ReferenceItems.Item("c:\\nuget\\Microsoft.AspNetCore.Mvc.razor.dll");
|
||||||
|
ContentItems.Item("Index.cshtml", new Dictionary<string, string>()
|
||||||
|
{
|
||||||
|
[ItemReference.FullPathPropertyName] = "C:\\Path\\Index.cshtml",
|
||||||
|
});
|
||||||
|
|
||||||
var changes = new TestProjectChangeDescription[]
|
var changes = new TestProjectChangeDescription[]
|
||||||
{
|
{
|
||||||
ReferenceItems.ToChange(),
|
ReferenceItems.ToChange(),
|
||||||
|
ContentItems.ToChange(),
|
||||||
};
|
};
|
||||||
|
|
||||||
var services = new TestProjectSystemServices("Test.csproj");
|
var services = new TestProjectSystemServices("C:\\Path\\Test.csproj");
|
||||||
|
|
||||||
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager)
|
var host = new TestFallbackRazorProjectHost(services, Workspace, ProjectManager)
|
||||||
{
|
{
|
||||||
|
|
@ -272,8 +500,10 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem
|
||||||
|
|
||||||
// Assert - 1
|
// Assert - 1
|
||||||
var snapshot = Assert.Single(ProjectManager.Projects);
|
var snapshot = Assert.Single(ProjectManager.Projects);
|
||||||
Assert.Equal("Test.csproj", snapshot.FilePath);
|
Assert.Equal("C:\\Path\\Test.csproj", snapshot.FilePath);
|
||||||
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
Assert.Same(FallbackRazorConfiguration.MVC_2_0, snapshot.Configuration);
|
||||||
|
var filePath = Assert.Single(snapshot.DocumentFilePaths);
|
||||||
|
Assert.Equal("C:\\Path\\Index.cshtml", filePath);
|
||||||
|
|
||||||
// Act - 2
|
// Act - 2
|
||||||
await Task.Run(async () => await host.DisposeAsync());
|
await Task.Run(async () => await host.DisposeAsync());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue