public async Task ProjectWorkspaceStateChange_WithProjectWorkspaceState_CSharpLanguageVersionChange_DoesNotCacheOutput() { // Arrange var csharp8ValidConfiguration = RazorConfiguration.Create(RazorLanguageVersion.Version_3_0, HostProject.Configuration.ConfigurationName, HostProject.Configuration.Extensions); var hostProject = new HostProject(TestProjectData.SomeProject.FilePath, csharp8ValidConfiguration, TestProjectData.SomeProject.RootNamespace); var originalWorkspaceState = new ProjectWorkspaceState(SomeTagHelpers, LanguageVersion.CSharp7); var original = ProjectState.Create(Workspace.Services, hostProject, originalWorkspaceState) .WithAddedHostDocument(HostDocument, () => { return(Task.FromResult(TextAndVersion.Create(SourceText.From("@DateTime.Now"), VersionStamp.Default))); }); var changedWorkspaceState = new ProjectWorkspaceState(SomeTagHelpers, LanguageVersion.CSharp8); var(originalOutput, originalInputVersion, originalCSharpOutputVersion, originalHtmlOutputVersion) = await GetOutputAsync(original, HostDocument); // Act var state = original.WithProjectWorkspaceState(changedWorkspaceState); // Assert var(actualOutput, actualInputVersion, actualCSharpOutputVersion, actualHtmlOutputVersion) = await GetOutputAsync(state, HostDocument); Assert.NotSame(originalOutput, actualOutput); Assert.NotEqual(originalInputVersion, actualInputVersion); Assert.NotEqual(originalCSharpOutputVersion, actualCSharpOutputVersion); Assert.Equal(originalHtmlOutputVersion, actualHtmlOutputVersion); Assert.Equal(state.ProjectWorkspaceStateVersion, actualInputVersion); }
public DefaultProjectSnapshotManagerTest() { TagHelperResolver = new TestTagHelperResolver(); Documents = new HostDocument[] { TestProjectData.SomeProjectFile1, TestProjectData.SomeProjectFile2, // linked file TestProjectData.AnotherProjectNestedFile3, TestProjectData.SomeProjectComponentFile1, TestProjectData.SomeProjectComponentFile2, }; HostProject = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_2_0, TestProjectData.SomeProject.RootNamespace); HostProjectWithConfigurationChange = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_1_0, TestProjectData.SomeProject.RootNamespace); ProjectManager = new TestProjectSnapshotManager(Dispatcher, Enumerable.Empty <ProjectSnapshotChangeTrigger>(), Workspace); ProjectWorkspaceStateWithTagHelpers = new ProjectWorkspaceState(TagHelperResolver.TagHelpers); SourceText = SourceText.From("Hello world"); }
public void ProjectState_WithProjectWorkspaceState_Changed_TagHelpersChanged() { // Arrange var original = ProjectState.Create(Workspace.Services, HostProject, ProjectWorkspaceState) .WithAddedHostDocument(Documents[2], DocumentState.EmptyLoader) .WithAddedHostDocument(Documents[1], DocumentState.EmptyLoader); // Force init var originalTagHelpers = original.TagHelpers; var originalProjectWorkspaceStateVersion = original.ProjectWorkspaceStateVersion; var changed = new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>()); // Now create some tag helpers TagHelperResolver.TagHelpers = SomeTagHelpers; // Act var state = original.WithProjectWorkspaceState(changed); // Assert Assert.NotEqual(original.Version, state.Version); Assert.Same(changed, state.ProjectWorkspaceState); var actualTagHelpers = state.TagHelpers; var actualProjectWorkspaceStateVersion = state.ProjectWorkspaceStateVersion; // The configuration didn't change, but the tag helpers did Assert.Same(original.ProjectEngine, state.ProjectEngine); Assert.NotEqual(originalTagHelpers, actualTagHelpers); Assert.NotEqual(originalProjectWorkspaceStateVersion, actualProjectWorkspaceStateVersion); Assert.Equal(state.Version, actualProjectWorkspaceStateVersion); Assert.NotSame(original.Documents[Documents[1].FilePath], state.Documents[Documents[1].FilePath]); Assert.NotSame(original.Documents[Documents[2].FilePath], state.Documents[Documents[2].FilePath]); }
public void ProjectState_WithProjectWorkspaceState_Removed() { // Arrange var emptyProjectWorkspaceState = new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>()); var original = ProjectState.Create(Workspace.Services, HostProject, emptyProjectWorkspaceState) .WithAddedHostDocument(Documents[2], DocumentState.EmptyLoader) .WithAddedHostDocument(Documents[1], DocumentState.EmptyLoader); // Force init var originalTagHelpers = original.TagHelpers; var originalProjectWorkspaceStateVersion = original.ProjectWorkspaceStateVersion; // Act var state = original.WithProjectWorkspaceState(null); // Assert Assert.NotEqual(original.Version, state.Version); Assert.Null(state.ProjectWorkspaceState); var actualTagHelpers = state.TagHelpers; var actualProjectWorkspaceStateVersion = state.ProjectWorkspaceStateVersion; // The configuration didn't change, and the tag helpers didn't actually change Assert.Same(original.ProjectEngine, state.ProjectEngine); Assert.Same(originalTagHelpers, actualTagHelpers); Assert.NotEqual(originalProjectWorkspaceStateVersion, actualProjectWorkspaceStateVersion); Assert.NotSame(original.Documents[Documents[1].FilePath], state.Documents[Documents[1].FilePath]); Assert.NotSame(original.Documents[Documents[2].FilePath], state.Documents[Documents[2].FilePath]); }
public DefaultProjectSnapshotTest() { TagHelperResolver = new TestTagHelperResolver(); HostProject = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_2_0, TestProjectData.SomeProject.RootNamespace); HostProjectWithConfigurationChange = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_1_0, TestProjectData.SomeProject.RootNamespace); ProjectWorkspaceState = new ProjectWorkspaceState(new[] { TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly").Build(), }); SomeTagHelpers = new List <TagHelperDescriptor> { TagHelperDescriptorBuilder.Create("Test1", "TestAssembly").Build() }; Documents = new HostDocument[] { TestProjectData.SomeProjectFile1, TestProjectData.SomeProjectFile2, // linked file TestProjectData.AnotherProjectNestedFile3, }; }
public ProjectState WithProjectWorkspaceState(ProjectWorkspaceState projectWorkspaceState) { var difference = ProjectDifference.ProjectWorkspaceStateChanged; var documents = Documents.ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.WithProjectWorkspaceStateChange(), FilePathComparer.Instance); var state = new ProjectState(this, difference, HostProject, projectWorkspaceState, documents, ImportsToRelatedDocuments); return(state); }
private ProjectState( HostWorkspaceServices services, HostProject hostProject, ProjectWorkspaceState projectWorkspaceState) { Services = services; HostProject = hostProject; ProjectWorkspaceState = projectWorkspaceState; Documents = EmptyDocuments; ImportsToRelatedDocuments = EmptyImportsToRelatedDocuments; Version = VersionStamp.Create(); DocumentCollectionVersion = Version; _lock = new object(); }
public static ProjectState Create( HostWorkspaceServices services, HostProject hostProject, ProjectWorkspaceState projectWorkspaceState = null) { if (services == null) { throw new ArgumentNullException(nameof(services)); } if (hostProject == null) { throw new ArgumentNullException(nameof(hostProject)); } return(new ProjectState(services, hostProject, projectWorkspaceState)); }
public DocumentStateTest() { TagHelperResolver = new TestTagHelperResolver(); HostProject = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_2_0, TestProjectData.SomeProject.RootNamespace); HostProjectWithConfigurationChange = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_1_0, TestProjectData.SomeProject.RootNamespace); ProjectWorkspaceState = new ProjectWorkspaceState(new[] { TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly").Build(), }); SomeTagHelpers = new List <TagHelperDescriptor>(); SomeTagHelpers.Add(TagHelperDescriptorBuilder.Create("Test1", "TestAssembly").Build()); HostDocument = TestProjectData.SomeProjectFile1; Text = SourceText.From("Hello, world!"); TextLoader = () => Task.FromResult(TextAndVersion.Create(Text, VersionStamp.Create())); }
public async Task ProjectWorkspaceStateChange_WithTagHelperChange_DoesNotCacheOutput() { // Arrange var original = ProjectState.Create(Workspace.Services, HostProject) .WithAddedHostDocument(HostDocument, DocumentState.EmptyLoader); var(originalOutput, originalInputVersion, originalOutputVersion) = await GetOutputAsync(original, HostDocument); var changed = new ProjectWorkspaceState(SomeTagHelpers); // Act var state = original.WithProjectWorkspaceState(changed); // Assert var(actualOutput, actualInputVersion, actualOutputVersion) = await GetOutputAsync(state, HostDocument); Assert.NotSame(originalOutput, actualOutput); Assert.NotEqual(originalInputVersion, actualInputVersion); Assert.Equal(originalOutputVersion, actualOutputVersion); Assert.Equal(state.ProjectWorkspaceStateVersion, actualInputVersion); }
public void ProjectState_WithProjectWorkspaceState_CallsWorkspaceProjectChangeOnDocumentState() { // Arrange var callCount = 0; var documents = ImmutableDictionary.CreateBuilder <string, DocumentState>(FilePathComparer.Instance); documents[Documents[1].FilePath] = TestDocumentState.Create(Workspace.Services, Documents[1], onProjectWorkspaceStateChange: () => callCount++); documents[Documents[2].FilePath] = TestDocumentState.Create(Workspace.Services, Documents[2], onProjectWorkspaceStateChange: () => callCount++); var original = ProjectState.Create(Workspace.Services, HostProject, ProjectWorkspaceState); original.Documents = documents.ToImmutable(); var changed = new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>()); // Act var state = original.WithProjectWorkspaceState(changed); // Assert Assert.NotEqual(original.Version, state.Version); Assert.Equal(2, callCount); }
public async Task ProjectWorkspaceStateChange_CachesOutput_EvenWhenNewerProjectWorkspaceState() { // Arrange var original = ProjectState.Create(Workspace.Services, HostProject) .WithAddedHostDocument(HostDocument, DocumentState.EmptyLoader) .WithProjectWorkspaceState(ProjectWorkspaceState.Default); var(originalOutput, originalInputVersion, originalOutputVersion) = await GetOutputAsync(original, HostDocument); var changed = new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>()); // Act var state = original.WithProjectWorkspaceState(changed); // Assert var(actualOutput, actualInputVersion, actualOutputVersion) = await GetOutputAsync(state, HostDocument); Assert.Same(originalOutput, actualOutput); Assert.Equal(originalInputVersion, actualInputVersion); Assert.Equal(originalOutputVersion, actualOutputVersion); Assert.Equal(state.ProjectWorkspaceStateVersion, actualInputVersion); }
public ProjectStateTest() { HostProject = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_2_0); HostProjectWithConfigurationChange = new HostProject(TestProjectData.SomeProject.FilePath, FallbackRazorConfiguration.MVC_1_0); ProjectWorkspaceState = new ProjectWorkspaceState(new[] { TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly").Build(), }); SomeTagHelpers = new List <TagHelperDescriptor>(); SomeTagHelpers.Add(TagHelperDescriptorBuilder.Create("Test1", "TestAssembly").Build()); Documents = new HostDocument[] { TestProjectData.SomeProjectFile1, TestProjectData.SomeProjectFile2, // linked file TestProjectData.AnotherProjectNestedFile3, }; Text = SourceText.From("Hello, world!"); TextLoader = () => Task.FromResult(TextAndVersion.Create(Text, VersionStamp.Create())); }
private ProjectState( ProjectState older, ProjectDifference difference, HostProject hostProject, ProjectWorkspaceState projectWorkspaceState, ImmutableDictionary <string, DocumentState> documents, ImmutableDictionary <string, ImmutableArray <string> > importsToRelatedDocuments) { if (older == null) { throw new ArgumentNullException(nameof(older)); } if (hostProject == null) { throw new ArgumentNullException(nameof(hostProject)); } if (documents == null) { throw new ArgumentNullException(nameof(documents)); } if (importsToRelatedDocuments == null) { throw new ArgumentNullException(nameof(importsToRelatedDocuments)); } Services = older.Services; Version = older.Version.GetNewerVersion(); HostProject = hostProject; ProjectWorkspaceState = projectWorkspaceState; Documents = documents; ImportsToRelatedDocuments = importsToRelatedDocuments; _lock = new object(); if ((difference & ClearDocumentCollectionVersionMask) == 0) { // Document collection hasn't changed DocumentCollectionVersion = older.DocumentCollectionVersion; } else { DocumentCollectionVersion = Version; } if ((difference & ClearConfigurationVersionMask) == 0 && older._projectEngine != null) { // Optimistically cache the RazorProjectEngine. _projectEngine = older.ProjectEngine; ConfigurationVersion = older.ConfigurationVersion; } else { ConfigurationVersion = Version; } if ((difference & ClearProjectWorkspaceStateVersionMask) == 0 || ProjectWorkspaceState == older.ProjectWorkspaceState || ProjectWorkspaceState?.Equals(older.ProjectWorkspaceState) == true) { ProjectWorkspaceStateVersion = older.ProjectWorkspaceStateVersion; } else { ProjectWorkspaceStateVersion = Version; } }
public abstract void ProjectWorkspaceStateChanged(string projectFilePath, ProjectWorkspaceState projectWorkspaceState);