public async Task Dispose_UnsubscribtesFromTextChangedEvents() { var tempFile = @"C:\Temp\ConsoleApp1.csproj"; var docData = IVsPersistDocDataFactory.ImplementAsIVsTextBuffer(); var textBuffer = ITextBufferFactory.Create(); var shellUtilities = IVsShellUtilitiesHelperFactory.ImplementGetRDTInfo(tempFile, docData); var editorAdaptersService = IVsEditorAdaptersFactoryServiceFactory.ImplementGetDocumentBuffer(textBuffer); var textDoc = ITextDocumentFactory.Create(); var textDocFactoryService = ITextDocumentFactoryServiceFactory.ImplementGetTextDocument(textDoc, true); var editorModel = IProjectFileEditorPresenterFactory.Create(); var watcher = new TempFileBufferStateListener(editorModel, editorAdaptersService, textDocFactoryService, new IProjectThreadingServiceMock(), shellUtilities, IServiceProviderFactory.Create()); await watcher.InitializeListenerAsync(tempFile); Mock.Get(shellUtilities).Verify(u => u.GetRDTDocumentInfoAsync(It.IsAny <IServiceProvider>(), tempFile), Times.Once); Mock.Get(editorAdaptersService).Verify(e => e.GetDocumentBuffer((IVsTextBuffer)docData), Times.Once); Mock.Get(textDocFactoryService).Verify(t => t.TryGetTextDocument(textBuffer, out textDoc), Times.Once); Mock.Get(textDoc).Raise(t => t.FileActionOccurred += null, new[] { null, new TextDocumentFileActionEventArgs(tempFile, DateTime.Now, FileActionTypes.ContentSavedToDisk) }); Mock.Get(editorModel).Verify(e => e.SaveProjectFileAsync(), Times.Once); await watcher.DisposeAsync(); Mock.Get(textDoc).Raise(t => t.FileActionOccurred += null, new[] { null, new TextDocumentFileActionEventArgs(tempFile, DateTime.Now, FileActionTypes.ContentSavedToDisk) }); Mock.Get(editorModel).Verify(e => e.SaveProjectFileAsync(), Times.Once); }
public async Task AbstractEditProjectFileCommand_NonSaveAction_DoesNotOverwriteProjectFile(FileActionTypes actionType) { var projectPath = $"C:\\Project1\\Project1.{EditProjectFileCommand.Extension}"; var tempFile = "C:\\Temp\\asdf.xyz"; var tempProjFile = $"{tempFile}.{EditProjectFileCommand.Extension}"; var expectedCaption = $"Project1.{EditProjectFileCommand.Extension}"; var projectXml = @"<Project></Project>"; var fileSystem = new IFileSystemMock(); var textDoc = ITextDocumentFactory.Create(); var frame = IVsWindowFrameFactory.ImplementShowAndSetProperty(VSConstants.S_OK, (prop, obj) => VSConstants.S_OK); var command = SetupScenario(projectXml, tempFile, tempProjFile, projectPath, expectedCaption, fileSystem, textDoc, frame); var tree = ProjectTreeParser.Parse(@" Root (flags: {ProjectRoot}) "); var nodes = ImmutableHashSet.Create(tree); // Verify the frame was setup correctly Assert.True(await command.TryHandleCommandAsync(nodes, CommandId, true, 0, IntPtr.Zero, IntPtr.Zero)); var args = new TextDocumentFileActionEventArgs(tempProjFile, DateTime.Now, actionType); Mock.Get(textDoc).Raise(t => t.FileActionOccurred += null, args); Assert.False(fileSystem.FileExists(projectPath)); }
public async Task NoChangesFrom_DoesNotOverwriteNewChanges() { var projectFilePath = @"C:\ConsoleApp\ConsoleApp1\ConsoleApp1.csproj"; // Use some file encoding that's not the default var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFilePath, projectEncoding: Encoding.UTF8); var projectXml = "<Project />"; var bufferXml = "<Project></Project>"; var docData = IVsPersistDocDataFactory.ImplementAsIVsTextBufferIsDocDataDirty(true, VSConstants.S_OK); var textBuffer = ITextBufferFactory.ImplementSnapshot(() => bufferXml); var textDocument = ITextDocumentFactory.ImplementTextBuffer(textBuffer); var fileSystem = new IFileSystemMock(); var tempFilePath = @"C:\Temp\asdf.1234"; var tempProjectPath = Path.Combine(tempFilePath, "ConsoleApp1.csproj"); fileSystem.SetTempFile(tempFilePath); var msbuildAccessor = IProjectXmlAccessorFactory.Implement(() => projectXml, xml => fileSystem.WriteAllText(tempProjectPath, xml)); var shellUtility = IVsShellUtilitiesHelperFactory.ImplementGetRDTInfo(Path.Combine(tempFilePath, "ConsoleApp1.csproj"), docData); var editorAdapterFactory = IVsEditorAdaptersFactoryServiceFactory.ImplementGetDocumentBuffer(textBuffer); var textDocumentService = ITextDocumentFactoryServiceFactory.ImplementGetTextDocument(textDocument, true); var textBufferManager = new TempFileTextBufferManager(unconfiguredProject, msbuildAccessor, editorAdapterFactory, textDocumentService, shellUtility, fileSystem, new IProjectThreadingServiceMock(), IServiceProviderFactory.Create()); await textBufferManager.InitializeBufferAsync(); var tempFile = fileSystem.Files.First(data => StringComparers.Paths.Equals(tempProjectPath, data.Key)); // First save. File system should be "<Project></Project>", last saved is also "<Project></Project>" await textBufferManager.SaveAsync(); Assert.Equal("<Project></Project>", fileSystem.ReadAllText(tempProjectPath)); // Now we simulate some changes to the buffer and call Reset. Both the last saved and current project xml should be "<Project></Project>", so // the buffer shouldn't be reset projectXml = bufferXml; bufferXml = "<Project>asdf</Project>"; await textBufferManager.ResetBufferAsync(); Mock.Get(textBuffer).Verify(t => t.Replace(It.IsAny <Span>(), It.IsAny <string>()), Times.Never); Assert.Equal("<Project></Project>", fileSystem.ReadAllText(tempProjectPath)); }
public async Task ResetBufferDirtyDocData_UpdatesFileNotBuffer() { var projectFilePath = @"C:\ConsoleApp\ConsoleApp1\ConsoleApp1.csproj"; // Use some file encoding that's not the default var encoding = Encoding.Default.Equals(Encoding.UTF8) ? Encoding.UTF32 : Encoding.UTF8; var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFilePath, projectEncoding: encoding); var xml = "<Project />"; var msbuildAccessor = IProjectXmlAccessorFactory.Implement(() => xml, s => { }); var docData = IVsPersistDocDataFactory.ImplementAsIVsTextBufferIsDocDataDirty(true, VSConstants.S_OK); var textBuffer = ITextBufferFactory.ImplementSnapshot("<Project />"); var textDocument = ITextDocumentFactory.ImplementTextBuffer(textBuffer); var fileSystem = new IFileSystemMock(); var tempFilePath = @"C:\Temp\asdf.1234"; fileSystem.SetTempFile(tempFilePath); var shellUtility = IVsShellUtilitiesHelperFactory.ImplementGetRDTInfo(Path.Combine(tempFilePath, "ConsoleApp1.csproj"), docData); var editorAdapterFactory = IVsEditorAdaptersFactoryServiceFactory.ImplementGetDocumentBuffer(textBuffer); var textDocumentService = ITextDocumentFactoryServiceFactory.ImplementGetTextDocument(textDocument, true); var textBufferManager = new TempFileTextBufferManager(unconfiguredProject, msbuildAccessor, editorAdapterFactory, textDocumentService, shellUtility, fileSystem, new IProjectThreadingServiceMock(), IServiceProviderFactory.Create()); await textBufferManager.InitializeBufferAsync(); var tempProjectPath = Path.Combine(tempFilePath, "ConsoleApp1.csproj"); var tempFile = fileSystem.Files.First(data => StringComparers.Paths.Equals(tempProjectPath, data.Key)); Assert.Equal("<Project />", fileSystem.ReadAllText(tempProjectPath)); xml = "<Project></Project>"; await textBufferManager.ResetBufferAsync(); Mock.Get(textBuffer).Verify(t => t.Replace(It.IsAny <Span>(), It.IsAny <string>()), Times.Never); Assert.Equal("<Project></Project>", fileSystem.ReadAllText(tempProjectPath)); Mock.Get(unconfiguredProject).Verify(u => u.SaveAsync(null), Times.Once); }
public async Task SetReadonly_SetsOnlyReadonlyFlag() { var projectFilePath = @"C:\ConsoleApp\ConsoleApp1\ConsoleApp1.csproj"; // Use some file encoding that's not the default var encoding = Encoding.Default.Equals(Encoding.UTF8) ? Encoding.UTF32 : Encoding.UTF8; var unconfiguredProject = UnconfiguredProjectFactory.Create(filePath: projectFilePath, projectEncoding: encoding); var xml = "<Project />"; var msbuildAccessor = IProjectXmlAccessorFactory.ImplementGetProjectXml(xml); var docData = IVsPersistDocDataFactory.ImplementAsIVsTextBufferGetStateFlags(~(uint)BUFFERSTATEFLAGS.BSF_USER_READONLY); var textBuffer = ITextBufferFactory.ImplementSnapshot("<Project></Project>"); var textDocument = ITextDocumentFactory.ImplementTextBuffer(textBuffer); var fileSystem = new IFileSystemMock(); var tempFilePath = @"C:\Temp\asdf.1234"; fileSystem.SetTempFile(tempFilePath); var shellUtility = IVsShellUtilitiesHelperFactory.ImplementGetRDTInfo(Path.Combine(tempFilePath, "ConsoleApp1.csproj"), docData); var editorAdapterFactory = IVsEditorAdaptersFactoryServiceFactory.ImplementGetDocumentBuffer(textBuffer); var textDocumentService = ITextDocumentFactoryServiceFactory.ImplementGetTextDocument(textDocument, true); var textBufferManager = new TempFileTextBufferManager(unconfiguredProject, msbuildAccessor, editorAdapterFactory, textDocumentService, shellUtility, fileSystem, new IProjectThreadingServiceMock(), IServiceProviderFactory.Create()); await textBufferManager.InitializeBufferAsync(); await textBufferManager.SetReadOnlyAsync(true); Mock.Get(docData).As <IVsTextBuffer>().Verify(t => t.SetStateFlags(~(uint)BUFFERSTATEFLAGS.BSF_USER_READONLY | (uint)BUFFERSTATEFLAGS.BSF_USER_READONLY)); await textBufferManager.SetReadOnlyAsync(false); Mock.Get(docData).As <IVsTextBuffer>().Verify(t => t.SetStateFlags(~(uint)BUFFERSTATEFLAGS.BSF_USER_READONLY)); }
public async Task AbstractEditProjectFileCommand_CorrectNode_CreatesWindowCorrectly() { var projectPath = $"C:\\Project1\\Project1.{EditProjectFileCommand.Extension}"; var tempFile = "C:\\Temp\\asdf.xyz"; var tempProjFile = $"{tempFile}.{EditProjectFileCommand.Extension}"; var expectedCaption = $"Project1.{EditProjectFileCommand.Extension}"; var projectXml = @"<Project></Project>"; var captionSet = false; var autoOpenSet = false; var listenerSet = false; IVsWindowFrameNotify2 notifier = null; var fileSystem = new IFileSystemMock(); var textDoc = ITextDocumentFactory.Create(); var frame = IVsWindowFrameFactory.ImplementShowAndSetProperty(VSConstants.S_OK, (property, obj) => { switch (property) { case (int)__VSFPROPID5.VSFPROPID_OverrideCaption: captionSet = true; break; case (int)__VSFPROPID5.VSFPROPID_DontAutoOpen: autoOpenSet = true; break; case (int)__VSFPROPID.VSFPROPID_ViewHelper: listenerSet = true; Assert.IsAssignableFrom <IVsWindowFrameNotify2>(obj); notifier = obj as IVsWindowFrameNotify2; break; default: Assert.False(true, $"Unexpected property ID {property}"); break; } return(VSConstants.S_OK); }); var command = SetupScenario(projectXml, tempFile, tempProjFile, projectPath, expectedCaption, fileSystem, textDoc, frame); var tree = ProjectTreeParser.Parse(@" Root (flags: {ProjectRoot}) "); var nodes = ImmutableHashSet.Create(tree); // Verify the frame was setup correctly Assert.True(await command.TryHandleCommandAsync(nodes, CommandId, true, 0, IntPtr.Zero, IntPtr.Zero)); Assert.Equal(projectXml, fileSystem.ReadAllText(tempProjFile)); Mock.Get(frame).Verify(f => f.SetProperty((int)__VSFPROPID5.VSFPROPID_OverrideCaption, expectedCaption)); Mock.Get(frame).Verify(f => f.Show()); Assert.True(captionSet); Assert.True(autoOpenSet); Assert.True(listenerSet); Assert.NotNull(notifier); // Now see if the event correctly saved the text from the buffer into the project file var args = new TextDocumentFileActionEventArgs(tempProjFile, DateTime.Now, FileActionTypes.ContentSavedToDisk); Mock.Get(textDoc).Raise(t => t.FileActionOccurred += null, args); Assert.Equal(projectXml, fileSystem.ReadAllText(projectPath)); // Finally, ensure the cleanup works as expected. We don't do anything with the passed option. The notifier // should remove the file temp file from the filesystem. Assert.Equal(VSConstants.S_OK, notifier.OnClose(0)); Assert.False(fileSystem.FileExists(tempProjFile)); }