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); }
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(); }
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); }
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); }); }
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(); }