diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9674bb5a521..e29238876e9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -326,6 +326,8 @@ stages: variables: - name: XUNIT_LOGS value: $(Build.SourcesDirectory)\artifacts\TestResults\$(_configuration) + - name: __VSNeverShowWhatsNew + value: 1 pool: # The PR build definition sets this variable: # WindowsMachineQueueName=Windows.vs2022.amd64.open @@ -372,6 +374,15 @@ stages: searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_configuration)' continueOnError: true condition: ne(variables['_testKind'], 'testFSharpQA') + - task: PublishBuildArtifacts@1 + displayName: Publish Tests BinLog + condition: always() + continueOnError: true + inputs: + PathToPublish: '$(Build.SourcesDirectory)\artifacts\log/$(_configuration)\Build.VisualFSharp.sln.binlog' + ArtifactName: 'Windows $(_configuration) $(_testKind) test binlogs' + ArtifactType: Container + parallel: true - task: PublishBuildArtifacts@1 displayName: Publish Test Logs inputs: @@ -379,7 +390,7 @@ stages: ArtifactName: 'Windows $(_configuration) $(_testKind) test logs' publishLocation: Container continueOnError: true - condition: failed() + condition: always() - script: dotnet build $(Build.SourcesDirectory)/eng/DumpPackageRoot/DumpPackageRoot.csproj displayName: Dump NuGet cache contents condition: failed() diff --git a/vsintegration/tests/FSharp.Editor.IntegrationTests/BuildProjectTests.cs b/vsintegration/tests/FSharp.Editor.IntegrationTests/BuildProjectTests.cs index c962d2414db..050f36b6a43 100644 --- a/vsintegration/tests/FSharp.Editor.IntegrationTests/BuildProjectTests.cs +++ b/vsintegration/tests/FSharp.Editor.IntegrationTests/BuildProjectTests.cs @@ -24,6 +24,7 @@ module Test await SolutionExplorer.CreateSingleProjectSolutionAsync("Library", template, TestToken); await SolutionExplorer.RestoreNuGetPackagesAsync(TestToken); + await SolutionExplorer.OpenFileAsync("Library", "Library.fs", TestToken); await Editor.SetTextAsync(code, TestToken); var actualBuildSummary = await SolutionExplorer.BuildSolutionAsync(TestToken); @@ -45,6 +46,7 @@ module Test await SolutionExplorer.CreateSingleProjectSolutionAsync("Library", template, TestToken); await SolutionExplorer.RestoreNuGetPackagesAsync(TestToken); + await SolutionExplorer.OpenFileAsync("Library", "Library.fs", TestToken); await Editor.SetTextAsync(code, TestToken); var actualBuildSummary = await SolutionExplorer.BuildSolutionAsync(TestToken); diff --git a/vsintegration/tests/FSharp.Editor.IntegrationTests/InProcess/SolutionExplorerInProcess.cs b/vsintegration/tests/FSharp.Editor.IntegrationTests/InProcess/SolutionExplorerInProcess.cs index e1836606f58..4597c3bffb7 100644 --- a/vsintegration/tests/FSharp.Editor.IntegrationTests/InProcess/SolutionExplorerInProcess.cs +++ b/vsintegration/tests/FSharp.Editor.IntegrationTests/InProcess/SolutionExplorerInProcess.cs @@ -35,6 +35,25 @@ public async Task CreateSolutionAsync(string solutionName, CancellationToken can var solutionPath = CreateTemporaryPath(); await CreateSolutionAsync(solutionPath, solutionName, cancellationToken); } + + public async Task OpenFileAsync(string projectName, string relativeFilePath, CancellationToken cancellationToken) + { + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + var filePath = await GetAbsolutePathForProjectRelativeFilePathAsync(projectName, relativeFilePath, cancellationToken); + if (!File.Exists(filePath)) + { + throw new FileNotFoundException(filePath); + } + + VsShellUtilities.OpenDocument(ServiceProvider.GlobalProvider, filePath, VSConstants.LOGVIEWID.Code_guid, out _, out _, out _, out var view); + + // Reliably set focus using NavigateToLineAndColumn + var textManager = await GetRequiredGlobalServiceAsync(cancellationToken); + ErrorHandler.ThrowOnFailure(view.GetBuffer(out var textLines)); + ErrorHandler.ThrowOnFailure(view.GetCaretPos(out var line, out var column)); + ErrorHandler.ThrowOnFailure(textManager.NavigateToLineAndColumn(textLines, VSConstants.LOGVIEWID.Code_guid, line, column, line, column)); + } private async Task CreateSolutionAsync(string solutionPath, string solutionName, CancellationToken cancellationToken) { @@ -188,6 +207,19 @@ private string CreateTemporaryPath() return Path.Combine(Path.GetTempPath(), "fsharp-test", Path.GetRandomFileName()); } + private async Task GetAbsolutePathForProjectRelativeFilePathAsync(string projectName, string relativeFilePath, CancellationToken cancellationToken) + { + await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); + + var dte = await GetRequiredGlobalServiceAsync(cancellationToken); + var solution = dte.Solution; + Assumes.Present(solution); + + var project = solution.Projects.Cast().First(x => x.Name == projectName); + var projectPath = Path.GetDirectoryName(project.FullName); + return Path.Combine(projectPath, relativeFilePath); + } + private async Task GetProjectAsync(string nameOrFileName, CancellationToken cancellationToken) { await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);