public void TryDeserialize_MemoizesResults()
        {
            // Arrange
            var jsonFileDeserializer = new Mock <JsonFileDeserializer>(MockBehavior.Strict);
            var projectRazorJson     = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "c:/path/to/project.csproj",
                configuration: null,
                rootNamespace: null,
                projectWorkspaceState: null,
                documents: Array.Empty <DocumentSnapshotHandle>());

            jsonFileDeserializer.Setup(deserializer => deserializer.Deserialize <ProjectRazorJson>(It.IsAny <string>()))
            .Returns(projectRazorJson);
            var args = new ProjectConfigurationFileChangeEventArgs("/path/to/obj/project.razor.json", RazorFileChangeKind.Added, jsonFileDeserializer.Object);

            // Act
            var result1 = args.TryDeserialize(out var projectRazorJson1);
            var result2 = args.TryDeserialize(out var projectRazorJson2);

            // Assert
            Assert.True(result1);
            Assert.True(result2);
            Assert.Same(projectRazorJson, projectRazorJson1);
            Assert.Same(projectRazorJson, projectRazorJson2);
        }
Exemple #2
0
        public async Task ProjectConfigurationFileChanged_Added_AddAndUpdatesProject()
        {
            // Arrange
            var projectRazorJson = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "path/to/project.csproj",
                RazorConfiguration.Default,
                rootNamespace: "TestRootNamespace",
                new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>(), LanguageVersion.CSharp5),
                Array.Empty <DocumentSnapshotHandle>());
            var projectService = new Mock <RazorProjectService>(MockBehavior.Strict);

            projectService.Setup(service => service.AddProject(projectRazorJson.FilePath)).Verifiable();
            projectService.Setup(service => service.UpdateProject(
                                     projectRazorJson.FilePath,
                                     projectRazorJson.Configuration,
                                     projectRazorJson.RootNamespace,
                                     projectRazorJson.ProjectWorkspaceState,
                                     projectRazorJson.Documents)).Verifiable();
            var synchronizer         = GetSynchronizer(projectService.Object);
            var jsonFileDeserializer = CreateJsonFileDeserializer(projectRazorJson);
            var args = new ProjectConfigurationFileChangeEventArgs("/path/to/obj/project.razor.json", RazorFileChangeKind.Added, jsonFileDeserializer);

            // Act
            var enqueueTask = await Dispatcher.RunOnDispatcherThreadAsync(async() =>
            {
                synchronizer.ProjectConfigurationFileChanged(args);
                await WaitForEnqueue_DispatcherThreadAsync(synchronizer);
            }, CancellationToken.None);

            await enqueueTask;

            // Assert
            projectService.VerifyAll();
        }
Exemple #3
0
        private static JsonFileDeserializer CreateJsonFileDeserializer(ProjectRazorJson deserializedHandle)
        {
            var deserializer = new Mock <JsonFileDeserializer>(MockBehavior.Strict);

            deserializer.Setup(deserializer => deserializer.Deserialize <ProjectRazorJson>(It.IsAny <string>()))
            .Returns(deserializedHandle);

            return(deserializer.Object);
        }
Exemple #4
0
        public async Task ProjectConfigurationFileChanged_RemoveThenAdd_OnlyAdds()
        {
            // Arrange
            var projectRazorJson = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "path/to/project.csproj",
                RazorConfiguration.Default,
                rootNamespace: "TestRootNamespace",
                new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>(), LanguageVersion.CSharp5),
                Array.Empty <DocumentSnapshotHandle>());

            var filePath       = "path/to/project.csproj";
            var projectService = new Mock <RazorProjectService>(MockBehavior.Strict);

            projectService.Setup(service => service.AddProject(projectRazorJson.FilePath)).Verifiable();
            projectService.Setup(p => p.UpdateProject(
                                     filePath,
                                     It.IsAny <RazorConfiguration>(),
                                     It.IsAny <string>(),
                                     It.IsAny <ProjectWorkspaceState>(),
                                     It.IsAny <IReadOnlyList <DocumentSnapshotHandle> >()));

            var synchronizer        = GetSynchronizer(projectService.Object);
            var changedDeserializer = CreateJsonFileDeserializer(projectRazorJson);
            var removedArgs         = new ProjectConfigurationFileChangeEventArgs(projectRazorJson.SerializedFilePath, RazorFileChangeKind.Removed, changedDeserializer);
            var addedArgs           = new ProjectConfigurationFileChangeEventArgs(projectRazorJson.SerializedFilePath, RazorFileChangeKind.Added, changedDeserializer);
            var changedArgs         = new ProjectConfigurationFileChangeEventArgs(projectRazorJson.SerializedFilePath, RazorFileChangeKind.Changed, changedDeserializer);

            // Act
            var enqueueTask = await Dispatcher.RunOnDispatcherThreadAsync(async() =>
            {
                synchronizer.ProjectConfigurationFileChanged(addedArgs);
                synchronizer.ProjectConfigurationFileChanged(changedArgs);
                await WaitForEnqueue_DispatcherThreadAsync(synchronizer);
            }, CancellationToken.None);

            await enqueueTask;

            // Assert
            projectService.Verify(p => p.UpdateProject(
                                      filePath,
                                      It.IsAny <RazorConfiguration>(),
                                      It.IsAny <string>(),
                                      It.IsAny <ProjectWorkspaceState>(),
                                      It.IsAny <IReadOnlyList <DocumentSnapshotHandle> >()), Times.Once);

            projectService.VerifyAll();
        }
        public void ProjectRazorJson_MissingSerializationFormat_SerializesToNull()
        {
            // Arrange
            var projectRazorJson = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "/path/to/project.csproj",
                Configuration,
                rootNamespace: "TestProject",
                ProjectWorkspaceState,
                Array.Empty <DocumentSnapshotHandle>());
            var serializedHandle  = JsonConvert.SerializeObject(projectRazorJson, Converters);
            var serializedJObject = JObject.Parse(serializedHandle);

            serializedJObject.Remove("SerializationFormat");
            var reserializedHandle = JsonConvert.SerializeObject(serializedJObject);

            // Act
            var deserializedHandle = JsonConvert.DeserializeObject <ProjectRazorJson>(reserializedHandle, Converters);

            // Assert
            Assert.Null(deserializedHandle);
        }
        public void TryDeserialize_DifferingSerializationPaths_ReturnsFalse()
        {
            // Arrange
            var jsonFileDeserializer = new Mock <JsonFileDeserializer>(MockBehavior.Strict);
            var projectRazorJson     = new ProjectRazorJson(
                "/path/to/ORIGINAL/obj/project.razor.json",
                "c:/path/to/project.csproj",
                configuration: null,
                rootNamespace: null,
                projectWorkspaceState: null,
                documents: Array.Empty <DocumentSnapshotHandle>());

            jsonFileDeserializer.Setup(deserializer => deserializer.Deserialize <ProjectRazorJson>(It.IsAny <string>()))
            .Returns(projectRazorJson);
            var args = new ProjectConfigurationFileChangeEventArgs("/path/to/DIFFERENT/obj/project.razor.json", RazorFileChangeKind.Added, jsonFileDeserializer.Object);

            // Act
            var result = args.TryDeserialize(out var deserializedProjectRazorJson);

            // Assert
            Assert.False(result);
            Assert.Null(deserializedProjectRazorJson);
        }
        public void ProjectRazorJson_CanRoundTrip()
        {
            // Arrange
            var legacyDocument    = new DocumentSnapshotHandle("/path/to/file.cshtml", "file.cshtml", FileKinds.Legacy);
            var componentDocument = new DocumentSnapshotHandle("/path/to/otherfile.razor", "otherfile.razor", FileKinds.Component);
            var projectRazorJson  = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "/path/to/project.csproj",
                Configuration,
                rootNamespace: "TestProject",
                ProjectWorkspaceState,
                new[] { legacyDocument, componentDocument });
            var serializedHandle = JsonConvert.SerializeObject(projectRazorJson, Converters);

            // Act
            var deserializedHandle = JsonConvert.DeserializeObject <ProjectRazorJson>(serializedHandle, Converters);

            // Assert
            Assert.Equal(projectRazorJson.FilePath, deserializedHandle.FilePath);
            Assert.Equal(projectRazorJson.Configuration, deserializedHandle.Configuration);
            Assert.Equal(projectRazorJson.RootNamespace, deserializedHandle.RootNamespace);
            Assert.Equal(projectRazorJson.ProjectWorkspaceState, deserializedHandle.ProjectWorkspaceState);
            Assert.Collection(projectRazorJson.Documents.OrderBy(doc => doc.FilePath),
                              document =>
            {
                Assert.Equal(legacyDocument.FilePath, document.FilePath);
                Assert.Equal(legacyDocument.TargetPath, document.TargetPath);
                Assert.Equal(legacyDocument.FileKind, document.FileKind);
            },
                              document =>
            {
                Assert.Equal(componentDocument.FilePath, document.FilePath);
                Assert.Equal(componentDocument.TargetPath, document.TargetPath);
                Assert.Equal(componentDocument.FileKind, document.FileKind);
            });
        }
Exemple #8
0
        public async Task ProjectConfigurationFileChanged_Changed_CantDeserialize_ResetsProject()
        {
            // Arrange
            var initialProjectRazorJson = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "path/to/project.csproj",
                RazorConfiguration.Default,
                rootNamespace: "TestRootNamespace",
                new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>(), LanguageVersion.CSharp5),
                Array.Empty <DocumentSnapshotHandle>());
            var projectService = new Mock <RazorProjectService>(MockBehavior.Strict);

            projectService.Setup(service => service.AddProject(initialProjectRazorJson.FilePath)).Verifiable();
            projectService.Setup(service => service.UpdateProject(
                                     initialProjectRazorJson.FilePath,
                                     initialProjectRazorJson.Configuration,
                                     initialProjectRazorJson.RootNamespace,
                                     initialProjectRazorJson.ProjectWorkspaceState,
                                     initialProjectRazorJson.Documents)).Verifiable();
            var changedProjectRazorJson = new ProjectRazorJson(
                "/path/to/obj/project.razor.json",
                "path/to/project.csproj",
                RazorConfiguration.Create(
                    RazorLanguageVersion.Experimental,
                    "TestConfiguration",
                    Array.Empty <RazorExtension>()),
                rootNamespace: "TestRootNamespace2",
                new ProjectWorkspaceState(Array.Empty <TagHelperDescriptor>(), LanguageVersion.CSharp6),
                Array.Empty <DocumentSnapshotHandle>());

            // This is the request that happens when the server is reset
            projectService.Setup(service => service.UpdateProject(
                                     initialProjectRazorJson.FilePath,
                                     null,
                                     null,
                                     ProjectWorkspaceState.Default,
                                     Array.Empty <DocumentSnapshotHandle>())).Verifiable();
            var synchronizer    = GetSynchronizer(projectService.Object);
            var addDeserializer = CreateJsonFileDeserializer(initialProjectRazorJson);
            var addArgs         = new ProjectConfigurationFileChangeEventArgs("/path/to/obj/project.razor.json", RazorFileChangeKind.Added, addDeserializer);
            var enqueueTask     = await Dispatcher.RunOnDispatcherThreadAsync(async() =>
            {
                synchronizer.ProjectConfigurationFileChanged(addArgs);
                await WaitForEnqueue_DispatcherThreadAsync(synchronizer);
            }, CancellationToken.None);

            await enqueueTask;

            var changedDeserializer = Mock.Of <JsonFileDeserializer>(d => d.Deserialize <ProjectRazorJson>(It.IsAny <string>()) == null, MockBehavior.Strict);
            var changedArgs         = new ProjectConfigurationFileChangeEventArgs("/path/to/obj/project.razor.json", RazorFileChangeKind.Changed, changedDeserializer);

            // Act
            enqueueTask = await Dispatcher.RunOnDispatcherThreadAsync(async() =>
            {
                synchronizer.ProjectConfigurationFileChanged(changedArgs);
                await WaitForEnqueue_DispatcherThreadAsync(synchronizer);
            }, CancellationToken.None);

            await enqueueTask;

            // Assert
            projectService.VerifyAll();
        }