Beispiel #1
0
        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");
        }
Beispiel #3
0
        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]);
        }
Beispiel #4
0
        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]);
        }
Beispiel #5
0
        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,
            };
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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();
        }
Beispiel #8
0
        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()));
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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()));
        }
Beispiel #14
0
        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;
            }
        }
Beispiel #15
0
 public abstract void ProjectWorkspaceStateChanged(string projectFilePath, ProjectWorkspaceState projectWorkspaceState);