From 036ce9b527924b1b9d164a95b18c79a2553229e8 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Tue, 31 Jan 2023 13:25:44 -0800 Subject: [PATCH] Fix broken STS language service tests (#1837) * Fix broken STS language service tests * consolidate --- .../LanguageServices/LanguageService.cs | 2 +- .../Workspace/Contracts/ScriptFile.cs | 5 +++ .../LanguageServer/LanguageServiceTests.cs | 41 +++++++++++++------ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs index 305206e3..20075d0a 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs @@ -181,7 +181,7 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices } } - private CancellationTokenSource existingRequestCancellation; + private CancellationTokenSource? existingRequestCancellation; /// /// Gets or sets the current workspace service instance diff --git a/src/Microsoft.SqlTools.ServiceLayer/Workspace/Contracts/ScriptFile.cs b/src/Microsoft.SqlTools.ServiceLayer/Workspace/Contracts/ScriptFile.cs index 41a8fced..9bdac401 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/Workspace/Contracts/ScriptFile.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/Workspace/Contracts/ScriptFile.cs @@ -445,6 +445,11 @@ namespace Microsoft.SqlTools.ServiceLayer.Workspace.Contracts .ToList(); } + public override string ToString() + { + return $"ScriptFile:{this.FilePath}"; + } + #endregion } } diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs index f176a802..bb6b703c 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs @@ -97,7 +97,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer result.TextDocumentPosition.Position.Character = 7; result.ScriptFile.Contents = "select "; - var autoCompleteService = LanguageService.Instance; + var autoCompleteService = CreateLanguageService(result.ScriptFile); var completions = autoCompleteService.GetCompletionItems( result.TextDocumentPosition, result.ScriptFile, @@ -132,7 +132,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer result.ScriptFile = ScriptFileTests.GetTestScriptFile("select * f"); result.TextDocumentPosition.TextDocument.Uri = result.ScriptFile.FilePath; - var autoCompleteService = LanguageService.Instance; + var autoCompleteService = CreateLanguageService(result.ScriptFile); var requestContext = new Mock>(); requestContext.Setup(x => x.SendResult(It.IsAny())) .Returns(Task.FromResult(true)); @@ -218,7 +218,6 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer /// provide signature help. /// [Test] - [Ignore("this test is not stable")] public async Task GetSignatureHelpReturnsNotNullIfParseInfoInitialized() { // When we make a connection to a live database @@ -242,7 +241,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer }; // If the SQL has already been parsed - var service = LanguageService.Instance; + var service = CreateLanguageService(result.ScriptFile); await service.UpdateLanguageServiceOnConnection(result.ConnectionInfo); Thread.Sleep(2000); @@ -284,11 +283,13 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer public async Task RebuildIntellisenseCacheClearsScriptParseInfoCorrectly() { var testDb = SqlTestDb.CreateNew(TestServerType.OnPrem, false, null, null, "LangSvcTest"); + LiveConnectionHelper.TestConnectionResult? connectionInfoResult = null; try { - var connectionInfoResult = LiveConnectionHelper.InitLiveConnectionInfo(testDb.DatabaseName); + connectionInfoResult = LiveConnectionHelper.InitLiveConnectionInfo(testDb.DatabaseName); + + var langService = CreateLanguageService(connectionInfoResult.ScriptFile); - var langService = LanguageService.Instance; await langService.UpdateLanguageServiceOnConnection(connectionInfoResult.ConnectionInfo); var queryText = "SELECT * FROM dbo."; connectionInfoResult.ScriptFile.SetFileContents(queryText); @@ -352,12 +353,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer scriptFile.SetFileContents("koko wants a bananas"); File.WriteAllText(scriptFile.ClientUri, scriptFile.Contents); - // Create a workspace and add file to it so that its found for intellense building - var workspace = new ServiceLayer.Workspace.Workspace(); - var workspaceService = new WorkspaceService { Workspace = workspace }; - var langService = new LanguageService() { WorkspaceServiceInstance = workspaceService }; - langService.CurrentWorkspace.GetFile(scriptFile.ClientUri); - langService.CurrentWorkspaceSettings.SqlTools.IntelliSense.EnableIntellisense = true; + var langService = CreateLanguageService(scriptFile); // Add a connection to ensure the intellisense building works ConnectionInfo connectionInfo = GetLiveAutoCompleteTestObjects().ConnectionInfo; @@ -427,7 +423,7 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer { var connectionInfoResult = LiveConnectionHelper.InitLiveConnectionInfo(testDb.DatabaseName); - var langService = LanguageService.Instance; + var langService = CreateLanguageService(connectionInfoResult.ScriptFile); await langService.UpdateLanguageServiceOnConnection(connectionInfoResult.ConnectionInfo); connectionInfoResult.ScriptFile.SetFileContents(sqlStarQuery); @@ -465,5 +461,24 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer testDb.Cleanup(); } } + + /// + /// Creates a new language service and sets it up with an initial script file. + /// + /// The initial script file to initialize in the workspace + /// + private LanguageService CreateLanguageService(ScriptFile scriptFile) + { + var langService = new LanguageService() + { + WorkspaceServiceInstance = new WorkspaceService() + { + Workspace = new ServiceLayer.Workspace.Workspace() + } + }; + langService.CurrentWorkspace.GetFile(scriptFile.ClientUri); + langService.CurrentWorkspaceSettings.SqlTools.IntelliSense.EnableIntellisense = true; + return langService; + } } }