diff --git a/src/PowerShellEditorServices/Services/CodeLens/PesterCodeLensProvider.cs b/src/PowerShellEditorServices/Services/CodeLens/PesterCodeLensProvider.cs index dd0ef0d1b..da67d3aaf 100644 --- a/src/PowerShellEditorServices/Services/CodeLens/PesterCodeLensProvider.cs +++ b/src/PowerShellEditorServices/Services/CodeLens/PesterCodeLensProvider.cs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. - +using System; using System.Collections.Generic; using Microsoft.PowerShell.EditorServices.Services; using Microsoft.PowerShell.EditorServices.Services.Symbols; @@ -101,6 +101,12 @@ private static CodeLens[] GetPesterLens(PesterSymbolReference pesterSymbol, Scri /// All Pester CodeLenses for the given script file. public CodeLens[] ProvideCodeLenses(ScriptFile scriptFile) { + // Don't return anything if codelens setting is disabled + if (!this._configurationService.CurrentSettings.Pester.CodeLens) + { + return Array.Empty(); + } + var lenses = new List(); foreach (SymbolReference symbol in _symbolProvider.ProvideDocumentSymbols(scriptFile)) { diff --git a/src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs b/src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs index bbbd24484..071945ca7 100644 --- a/src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs +++ b/src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs @@ -60,8 +60,9 @@ public SymbolsService( var codeLensProviders = new ICodeLensProvider[] { new ReferencesCodeLensProvider(_workspaceService, this), - new PesterCodeLensProvider(configurationService), + new PesterCodeLensProvider(configurationService) }; + foreach (ICodeLensProvider codeLensProvider in codeLensProviders) { _codeLensProviders.TryAdd(codeLensProvider.ProviderId, codeLensProvider); diff --git a/src/PowerShellEditorServices/Services/Workspace/LanguageServerSettings.cs b/src/PowerShellEditorServices/Services/Workspace/LanguageServerSettings.cs index cdd5069e9..ed4768a2e 100644 --- a/src/PowerShellEditorServices/Services/Workspace/LanguageServerSettings.cs +++ b/src/PowerShellEditorServices/Services/Workspace/LanguageServerSettings.cs @@ -56,7 +56,7 @@ public void Update( logger); this.CodeFormatting = new CodeFormattingSettings(settings.CodeFormatting); this.CodeFolding.Update(settings.CodeFolding, logger); - this.Pester = new PesterSettings(settings.Pester); + this.Pester.Update(settings.Pester, logger); this.Cwd = settings.Cwd; } } @@ -384,19 +384,39 @@ public void Update( /// public class PesterSettings { - public PesterSettings() - { - } - - public PesterSettings(PesterSettings settings) - { - UseLegacyCodeLens = settings.UseLegacyCodeLens; - } + /// + /// If specified, the lenses "run tests" and "debug tests" will appear above all Pester tests + /// + public bool CodeLens { get; set; } = true; /// /// Whether integration features specific to Pester v5 are enabled /// - public bool UseLegacyCodeLens { get; set; } + public bool UseLegacyCodeLens { get; set; } = false; + + /// + /// Update these settings from another settings object + /// + public void Update( + PesterSettings settings, + ILogger logger) + { + if (settings is null) { + return; + } + + if (this.CodeLens != settings.CodeLens) + { + this.CodeLens = settings.CodeLens; + logger.LogTrace(string.Format("Using Pester Code Lens - {0}", this.CodeLens)); + } + + if (this.UseLegacyCodeLens != settings.UseLegacyCodeLens) + { + this.UseLegacyCodeLens = settings.UseLegacyCodeLens; + logger.LogTrace(string.Format("Using Pester Legacy Code Lens - {0}", this.UseLegacyCodeLens)); + } + } } /// diff --git a/test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs b/test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs index 3bdd47096..6c2d56b0e 100644 --- a/test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs +++ b/test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs @@ -38,13 +38,15 @@ public class LSPTestsFixture : IAsyncLifetime public ITestOutputHelper Output { get; set; } protected PsesStdioProcess _psesProcess; + public int ProcessId => _psesProcess.Id; public async Task InitializeAsync() { var factory = new LoggerFactory(); _psesProcess = new PsesStdioProcess(factory, IsDebugAdapterTests); await _psesProcess.Start().ConfigureAwait(false); - + Console.WriteLine("PowerShell Editor Services Server started with PID {0}", ProcessId); + // TIP: Add Breakpoint here and attach debugger using the PID from the above message Diagnostics = new List(); TelemetryEvents = new List(); DirectoryInfo testdir = diff --git a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs index 276df5666..32038817d 100644 --- a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs @@ -661,7 +661,8 @@ public async Task CanSendPesterLegacyCodeLensRequestAsync() { ""powershell"": { ""pester"": { - ""useLegacyCodeLens"": true + ""useLegacyCodeLens"": true, + ""codeLens"": true } } } @@ -727,7 +728,8 @@ public async Task CanSendPesterCodeLensRequestAsync() { ""powershell"": { ""pester"": { - ""useLegacyCodeLens"": false + ""useLegacyCodeLens"": false, + ""codeLens"": true } } } @@ -825,6 +827,50 @@ public async Task CanSendPesterCodeLensRequestAsync() }); } + [Trait("Category", "LSP")] + [Fact] + public async Task NoMessageIfPesterCodeLensDisabled() + { + // Make sure Pester legacy CodeLens is disabled because we'll need it in this test. + PsesLanguageClient.Workspace.DidChangeConfiguration( + new DidChangeConfigurationParams + { + Settings = JObject.Parse(@" +{ + ""powershell"": { + ""pester"": { + ""codeLens"": false + } + } +} +") + }); + + string filePath = NewTestFile(@" +Describe 'DescribeName' { + Context 'ContextName' { + It 'ItName' { + 1 | Should - Be 1 + } + } +} +", isPester: true); + + CodeLensContainer codeLenses = await PsesLanguageClient + .SendRequest( + "textDocument/codeLens", + new CodeLensParams + { + TextDocument = new TextDocumentIdentifier + { + Uri = new Uri(filePath) + } + }) + .Returning(CancellationToken.None).ConfigureAwait(false); + + Assert.Empty(codeLenses); + } + [Trait("Category", "LSP")] [Fact] public async Task CanSendReferencesCodeLensRequestAsync() diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs b/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs index 585e1bf03..06a4a4dbc 100644 --- a/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs +++ b/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs @@ -45,6 +45,16 @@ public StdioServerProcess(ILoggerFactory loggerFactory, ProcessStartInfo serverS _serverStartInfo = serverStartInfo; } + /// + /// The process ID of the server process, useful for attaching a debugger. + /// + public int Id + { + get { + return _serverProcess.Id; + } + } + /// /// Dispose of resources being used by the launcher. ///