diff --git a/azure-pipelines-PR.yml b/azure-pipelines-PR.yml
index 0c7bc9b5a17..9a5c59441e2 100644
--- a/azure-pipelines-PR.yml
+++ b/azure-pipelines-PR.yml
@@ -488,6 +488,8 @@ stages:
displayName: Publish Test Results
inputs:
testResultsFormat: 'XUnit'
+ testRunTitle: WindowsCompressedMetadata $(_testKind)
+ mergeTestResults: true
testResultsFiles: '*.xml'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_configuration)'
continueOnError: true
@@ -558,7 +560,9 @@ stages:
displayName: Publish Test Results
inputs:
testResultsFormat: 'XUnit'
+ testRunTitle: Linux
testResultsFiles: '*.xml'
+ mergeTestResults: true
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
continueOnError: true
condition: always()
@@ -602,6 +606,8 @@ stages:
inputs:
testResultsFormat: 'XUnit'
testResultsFiles: '*.xml'
+ testRunTitle: MacOS
+ mergeTestResults: true
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
continueOnError: true
condition: always()
diff --git a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md
index fe3cde0444a..2484bfa53ce 100644
--- a/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md
+++ b/docs/release-notes/.FSharp.Compiler.Service/9.0.200.md
@@ -13,6 +13,7 @@
### Changed
* Make ILTypeDef interface impls calculation lazy. ([PR #17392](https://github.com/dotnet/fsharp/pull/17392))
+* Adjustments to better run in parallel testing ([PR #17662](https://github.com/dotnet/fsharp/pull/17662))
* Remove non-functional useSyntaxTreeCache option. ([PR #17768](https://github.com/dotnet/fsharp/pull/17768))
* Better ranges for CE `let!` and `use!` error reporting. ([PR #17712](https://github.com/dotnet/fsharp/pull/17712))
* Better ranges for CE `do!` error reporting. ([PR #17779](https://github.com/dotnet/fsharp/pull/17779))
@@ -20,4 +21,5 @@
* Better ranges for CE `match!`. ([PR #17789](https://github.com/dotnet/fsharp/pull/17789))
* Better ranges for CE `use` error reporting. ([PR #17811](https://github.com/dotnet/fsharp/pull/17811))
+
### Breaking Changes
diff --git a/eng/Build.ps1 b/eng/Build.ps1
index 483b60b10df..04f9df3a5fc 100644
--- a/eng/Build.ps1
+++ b/eng/Build.ps1
@@ -369,7 +369,7 @@ function TestUsingMSBuild([string] $testProject, [string] $targetFramework, [str
$testLogPath = "$ArtifactsDir\TestResults\$configuration\${projectName}_$targetFramework.xml"
$testBinLogPath = "$LogDir\${projectName}_$targetFramework.binlog"
$args = "test $testProject -c $configuration -f $targetFramework -v n --test-adapter-path $testadapterpath --logger ""xunit;LogFilePath=$testLogPath"" /bl:$testBinLogPath"
- $args += " --blame --results-directory $ArtifactsDir\TestResults\$configuration -p:vstestusemsbuildoutput=false"
+ $args += " --blame --blame-hang-timeout 5minutes --results-directory $ArtifactsDir\TestResults\$configuration -p:vstestusemsbuildoutput=false"
if (-not $noVisualStudio -or $norestore) {
$args += " --no-restore"
@@ -395,6 +395,28 @@ function TestUsingMSBuild([string] $testProject, [string] $targetFramework, [str
}
}
+function TestSolutionUsingMSBuild([string] $testSolution, [string] $targetFramework, [string] $testadapterpath) {
+ $dotnetPath = InitializeDotNetCli
+ $dotnetExe = Join-Path $dotnetPath "dotnet.exe"
+ $solutionName = [System.IO.Path]::GetFileNameWithoutExtension($testSolution)
+ $testLogPath = "$ArtifactsDir\TestResults\$configuration\{assembly}.{framework}.xml"
+ $testBinLogPath = "$LogDir\${solutionName}_$targetFramework.binlog"
+
+ $args = "test $testSolution -c $configuration -f $targetFramework --test-adapter-path $testadapterpath -v minimal --logger ""xunit;LogFilePath=$testLogPath"" /bl:$testBinLogPath"
+ $args += " --blame-hang-timeout 5minutes --results-directory $ArtifactsDir\TestResults\$configuration /p:VsTestUseMSBuildOutput=true"
+
+ if (-not $noVisualStudio -or $norestore) {
+ $args += " --no-restore"
+ }
+
+ if (-not $noVisualStudio) {
+ $args += " --no-build"
+ }
+
+ Write-Host("$args")
+ Exec-Console $dotnetExe $args
+}
+
function Prepare-TempDir() {
Copy-Item (Join-Path $RepoRoot "tests\Resources\Directory.Build.props") $TempDir
Copy-Item (Join-Path $RepoRoot "tests\Resources\Directory.Build.targets") $TempDir
@@ -589,31 +611,11 @@ try {
$script:BuildMessage = "Failure running tests"
if ($testCoreClr) {
- $bgJob = TestUsingMSBuild -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharpSuite.Tests\" -asBackgroundJob $true
-
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Compiler.ComponentTests\FSharp.Compiler.ComponentTests.fsproj" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.ComponentTests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.Service.Tests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Compiler.Private.Scripting.UnitTests\FSharp.Compiler.Private.Scripting.UnitTests.fsproj" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.Private.Scripting.UnitTests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Build.UnitTests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Core.UnitTests\"
-
- # Collect output from background jobs
- Wait-job $bgJob | out-null
- Receive-Job $bgJob -ErrorAction Stop
+ TestSolutionUsingMSBuild -testSolution "$RepoRoot\FSharp.sln" -targetFramework $script:coreclrTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.ComponentTests\"
}
if ($testDesktop) {
- $bgJob = TestUsingMSBuild -testProject "$RepoRoot\tests\fsharp\FSharpSuite.Tests.fsproj" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharpSuite.Tests\" -asBackgroundJob $true
-
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Compiler.ComponentTests\FSharp.Compiler.ComponentTests.fsproj" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.ComponentTests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.Service.Tests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Compiler.Private.Scripting.UnitTests\FSharp.Compiler.Private.Scripting.UnitTests.fsproj" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.Private.Scripting.UnitTests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Build.UnitTests\"
- TestUsingMSBuild -testProject "$RepoRoot\tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Core.UnitTests\"
-
- # Collect output from background jobs
- Wait-job $bgJob | out-null
- Receive-Job $bgJob -ErrorAction Stop
+ TestSolutionUsingMSBuild -testSolution "$RepoRoot\FSharp.sln" -targetFramework $script:desktopTargetFramework -testadapterpath "$ArtifactsDir\bin\FSharp.Compiler.ComponentTests\"
}
if ($testFSharpQA) {
diff --git a/eng/Versions.props b/eng/Versions.props
index d89aec3f3cd..202d17a6a19 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -184,7 +184,7 @@
3.1.0
5.0.0-preview.7.20364.11
5.0.0-preview.7.20364.11
- 17.4.0
+ 17.11.1
13.0.3
1.0.0-beta2-dev3
2.18.48
diff --git a/eng/build.sh b/eng/build.sh
old mode 100755
new mode 100644
index c4abb23f6f1..05e31af8d63
--- a/eng/build.sh
+++ b/eng/build.sh
@@ -214,7 +214,7 @@ function Test() {
projectname=$(basename -- "$testproject")
projectname="${projectname%.*}"
testlogpath="$artifacts_dir/TestResults/$configuration/${projectname}_$targetframework.xml"
- args="test \"$testproject\" --no-restore --no-build -c $configuration -f $targetframework --test-adapter-path . --logger \"xunit;LogFilePath=$testlogpath\" --blame --results-directory $artifacts_dir/TestResults/$configuration -p:vstestusemsbuildoutput=false"
+ args="test \"$testproject\" --no-restore --no-build -c $configuration -f $targetframework --test-adapter-path . --logger \"xunit;LogFilePath=$testlogpath\" --blame-hang-timeout 5minutes --results-directory $artifacts_dir/TestResults/$configuration -p:vstestusemsbuildoutput=false"
"$DOTNET_INSTALL_DIR/dotnet" $args || exit $?
}
diff --git a/src/Compiler/Driver/fsc.fs b/src/Compiler/Driver/fsc.fs
index ac4ee179538..a74f35f21b5 100644
--- a/src/Compiler/Driver/fsc.fs
+++ b/src/Compiler/Driver/fsc.fs
@@ -273,9 +273,6 @@ let SetProcessThreadLocals tcConfigB =
| Some s -> Thread.CurrentThread.CurrentUICulture <- CultureInfo(s)
| None -> ()
- if tcConfigB.utf8output then
- Console.OutputEncoding <- Encoding.UTF8
-
let ProcessCommandLineFlags (tcConfigB: TcConfigBuilder, lcidFromCodePage, argv) =
let mutable inputFilesRef = []
@@ -550,6 +547,17 @@ let main1
| Some parallelReferenceResolution -> tcConfigB.parallelReferenceResolution <- parallelReferenceResolution
| None -> ()
+ if tcConfigB.utf8output && Console.OutputEncoding <> Encoding.UTF8 then
+ let previousEncoding = Console.OutputEncoding
+ Console.OutputEncoding <- Encoding.UTF8
+
+ disposables.Register(
+ { new IDisposable with
+ member _.Dispose() =
+ Console.OutputEncoding <- previousEncoding
+ }
+ )
+
// Display the banner text, if necessary
if not bannerAlreadyPrinted then
Console.Write(GetBannerText tcConfigB)
@@ -1242,16 +1250,6 @@ let CompileFromCommandLineArguments
) =
use disposables = new DisposablesTracker()
- let savedOut = Console.Out
-
- use _ =
- { new IDisposable with
- member _.Dispose() =
- try
- Console.SetOut(savedOut)
- with _ ->
- ()
- }
main1 (
ctok,
diff --git a/src/Compiler/Interactive/fsi.fs b/src/Compiler/Interactive/fsi.fs
index 74fcc37340c..c1c60d6e47d 100644
--- a/src/Compiler/Interactive/fsi.fs
+++ b/src/Compiler/Interactive/fsi.fs
@@ -846,7 +846,7 @@ type internal FsiStdinSyphon(errorWriter: TextWriter) =
/// Encapsulates functions used to write to outWriter and errorWriter
type internal FsiConsoleOutput(tcConfigB, outWriter: TextWriter, errorWriter: TextWriter) =
- let nullOut = new StreamWriter(Stream.Null) :> TextWriter
+ let nullOut = TextWriter.Null
let fprintfnn (os: TextWriter) fmt =
Printf.kfprintf
@@ -1203,11 +1203,6 @@ type internal FsiCommandLineOptions(fsi: FsiEvaluationSessionHostConfig, argv: s
if tcConfigB.clearResultsCache then
dependencyProvider.ClearResultsCache(tcConfigB.compilerToolPaths, getOutputDir tcConfigB, reportError rangeCmdArgs)
- if tcConfigB.utf8output then
- let prev = Console.OutputEncoding
- Console.OutputEncoding <- Encoding.UTF8
- System.AppDomain.CurrentDomain.ProcessExit.Add(fun _ -> Console.OutputEncoding <- prev)
-
do
let firstArg =
match sourceFiles with
@@ -4646,6 +4641,20 @@ type FsiEvaluationSession
with e ->
warning (e)
+ let restoreEncoding =
+ if tcConfigB.utf8output && Console.OutputEncoding <> Text.Encoding.UTF8 then
+ let previousEncoding = Console.OutputEncoding
+ Console.OutputEncoding <- Encoding.UTF8
+
+ Some(
+ { new IDisposable with
+ member _.Dispose() =
+ Console.OutputEncoding <- previousEncoding
+ }
+ )
+ else
+ None
+
do
updateBannerText () // resetting banner text after parsing options
@@ -4789,6 +4798,7 @@ type FsiEvaluationSession
member _.Dispose() =
(tcImports :> IDisposable).Dispose()
uninstallMagicAssemblyResolution.Dispose()
+ restoreEncoding |> Option.iter (fun x -> x.Dispose())
/// Load the dummy interaction, load the initial files, and,
/// if interacting, start the background thread to read the standard input.
diff --git a/src/Compiler/Service/service.fs b/src/Compiler/Service/service.fs
index 525faf3be3d..f78512dbc5b 100644
--- a/src/Compiler/Service/service.fs
+++ b/src/Compiler/Service/service.fs
@@ -100,14 +100,6 @@ module CompileHelpers =
diagnostics.ToArray(), result
- let setOutputStreams execute =
- // Set the output streams, if requested
- match execute with
- | Some(writer, error) ->
- Console.SetOut writer
- Console.SetError error
- | None -> ()
-
[]
// There is typically only one instance of this type in an IDE process.
type FSharpChecker
diff --git a/src/Compiler/Utilities/Activity.fs b/src/Compiler/Utilities/Activity.fs
index b6fafe1c1b9..3c22526c896 100644
--- a/src/Compiler/Utilities/Activity.fs
+++ b/src/Compiler/Utilities/Activity.fs
@@ -237,38 +237,36 @@ module internal Activity =
sb.ToString()
- let addCsvFileListener (pathToFile:string) =
- if pathToFile |> File.Exists |> not then
- File.WriteAllLines(
- pathToFile,
- [
- "Name,StartTime,EndTime,Duration(s),Id,ParentId,RootId,"
- + String.concat "," Tags.AllKnownTags
- ]
- )
-
- let sw = new StreamWriter(path = pathToFile, append = true)
+ let addCsvFileListener (pathToFile: string) =
+ let newFile = pathToFile |> File.Exists |> not
+ // FileShare.Read to avoid sporadic file locking during tests.
+ let stream = new FileStream(pathToFile, FileMode.Append, FileAccess.Write, FileShare.Read)
+ let csvWriter = new StreamWriter(stream)
+
+ if newFile then csvWriter.WriteLine(
+ "Name,StartTime,EndTime,Duration(s),Id,ParentId,RootId,"
+ + String.concat "," Tags.AllKnownTags)
let msgQueue =
MailboxProcessor.Start(fun inbox ->
async {
while true do
let! msg = inbox.Receive()
- do! sw.WriteLineAsync(msg) |> Async.AwaitTask
+ do! csvWriter.WriteLineAsync(msg) |> Async.AwaitTask
})
- let l =
+ let listener =
new ActivityListener(
ShouldListenTo = (fun a ->ActivityNames.AllRelevantNames |> Array.contains a.Name),
Sample = (fun _ -> ActivitySamplingResult.AllData),
ActivityStopped = (fun a -> msgQueue.Post(createCsvRow a))
)
- ActivitySource.AddActivityListener(l)
+ ActivitySource.AddActivityListener(listener)
{ new IDisposable with
member this.Dispose() =
- l.Dispose() // Unregister from listening new activities first
+ listener.Dispose() // Unregister from listening new activities first
(msgQueue :> IDisposable).Dispose() // Wait for the msg queue to be written out
- sw.Dispose() // Only then flush the messages and close the file
+ csvWriter.Dispose() // Only then flush the messages and close the file
}
diff --git a/src/Compiler/Utilities/illib.fs b/src/Compiler/Utilities/illib.fs
index e09c650e39b..3744167dd1a 100644
--- a/src/Compiler/Utilities/illib.fs
+++ b/src/Compiler/Utilities/illib.fs
@@ -137,7 +137,7 @@ module internal PervasiveAutoOpens =
type Async with
static member RunImmediate(computation: Async<'T>, ?cancellationToken) =
- let cancellationToken = defaultArg cancellationToken Async.DefaultCancellationToken
+ let cancellationToken = defaultArg cancellationToken CancellationToken.None
let ts = TaskCompletionSource<'T>()
diff --git a/src/fsi/fsimain.fs b/src/fsi/fsimain.fs
index c13f37c11bc..4b9e92704a7 100644
--- a/src/fsi/fsimain.fs
+++ b/src/fsi/fsimain.fs
@@ -358,16 +358,6 @@ let evaluateSession (argv: string[]) =
let MainMain argv =
ignore argv
let argv = System.Environment.GetCommandLineArgs()
- let savedOut = Console.Out
-
- use __ =
- { new IDisposable with
- member _.Dispose() =
- try
- Console.SetOut(savedOut)
- with _ ->
- ()
- }
let timesFlag = argv |> Array.exists (fun x -> x = "/times" || x = "--times")
diff --git a/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj b/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj
index 4e4aef01856..b98bced9759 100644
--- a/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj
+++ b/tests/EndToEndBuildTests/BasicProvider/BasicProvider.Tests/BasicProvider.Tests.fsproj
@@ -21,7 +21,7 @@
content\myfiles\
-
+
diff --git a/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj b/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj
index d4d410bacd4..0135c83f57d 100644
--- a/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj
+++ b/tests/EndToEndBuildTests/ComboProvider/ComboProvider.Tests/ComboProvider.Tests.fsproj
@@ -18,7 +18,8 @@
-
+
+
diff --git a/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj b/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj
index 0a2421f3262..853737b3ca8 100644
--- a/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj
+++ b/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj
@@ -4,17 +4,26 @@
net472;$(FSharpNetCoreProductTargetFramework)
- $(FSharpNetCoreProductTargetFramework)
+ $(FSharpNetCoreProductTargetFramework)
Library
true
xunit
+
+ XunitSetup.fs
+
+
+
+ PreserveNewest
+
+
+
diff --git a/tests/FSharp.Build.UnitTests/xunit.runner.json b/tests/FSharp.Build.UnitTests/xunit.runner.json
new file mode 100644
index 00000000000..b01c50a3cb5
--- /dev/null
+++ b/tests/FSharp.Build.UnitTests/xunit.runner.json
@@ -0,0 +1,5 @@
+{
+ "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
+ "appDomain": "denied",
+ "parallelizeAssembly": true
+}
diff --git a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/misc/utf8output.fs b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/misc/utf8output.fs
new file mode 100644
index 00000000000..650bb63c76a
--- /dev/null
+++ b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/misc/utf8output.fs
@@ -0,0 +1,46 @@
+// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
+
+namespace CompilerOptions.Fsc
+
+open Xunit
+open FSharp.Test
+open FSharp.Test.Compiler
+open System
+
+[]
+module utf8output =
+
+ []
+ let ``OutputEncoding is restored after executing compilation`` () =
+ let currentEncoding = Console.OutputEncoding
+ use restoreCurrentEncodingAfterTest = { new IDisposable with member _.Dispose() = Console.OutputEncoding <- currentEncoding }
+
+ let encoding = Text.Encoding.GetEncoding("iso-8859-1")
+
+ Console.OutputEncoding <- encoding
+
+ Fs """printfn "Hello world" """
+ |> asExe
+ |> withOptionsString "--utf8output"
+ |> compile
+ |> shouldSucceed
+ |> ignore
+
+ Console.OutputEncoding.BodyName |> Assert.shouldBe encoding.BodyName
+
+ []
+ let ``OutputEncoding is restored after running script`` () =
+ let currentEncoding = Console.OutputEncoding
+ use restoreCurrentEncodingAfterTest = { new IDisposable with member _.Dispose() = Console.OutputEncoding <- currentEncoding }
+
+ let encoding = Text.Encoding.GetEncoding("iso-8859-1")
+
+ Console.OutputEncoding <- encoding
+
+ Fsx """printfn "Hello world" """
+ |> withOptionsString "--utf8output"
+ |> runFsi
+ |> shouldSucceed
+ |> ignore
+
+ Console.OutputEncoding.BodyName |> Assert.shouldBe encoding.BodyName
diff --git a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/times/times.fs b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/times/times.fs
index b18e5472ec0..939a1b9b9a8 100644
--- a/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/times/times.fs
+++ b/tests/FSharp.Compiler.ComponentTests/CompilerOptions/fsc/times/times.fs
@@ -8,6 +8,8 @@ open FSharp.Test.Compiler
open System
open System.IO
+// reportTime uses global state.
+[]
module times =
// This test was automatically generated (moved from FSharpQA suite - CompilerOptions/fsc/times)
@@ -62,24 +64,31 @@ module times =
"Typecheck"
"GC0"
"Duration"|]
+ |> ignore
+ []
+ let ``times - to csv file`` (compilation: CompilationUnit) =
+ let tempPath = compilation.OutputDirectory ++ "times.csv"
- []
- let ``times - to csv file`` compilation =
- let tempPath = Path.Combine(Path.GetTempPath(),Guid.NewGuid().ToString() + ".csv")
- use _ = {new IDisposable with
- member this.Dispose() = File.Delete(tempPath) }
+ use watcher = new FileSystemWatcher(compilation.OutputDirectory, Filter = "times.csv", EnableRaisingEvents = true)
+ let changed = System.Threading.Tasks.TaskCompletionSource<_>()
+ watcher.Changed.Add (changed.TrySetResult >> ignore)
compilation
|> asFsx
- |> withOptions ["--times:"+tempPath]
+ |> withOptions ["--times:" + tempPath]
|> ignoreWarnings
|> compile
|> shouldSucceed
- |> ignore
-
- let csvContents = File.ReadAllLines(tempPath)
+ |> ignore
+
+ changed.Task.Wait()
- Assert.Contains("Name,StartTime,EndTime,Duration(s),Id,ParentId,RootId",csvContents[0])
- Assert.Contains(csvContents, fun row -> row.Contains("Typecheck"))
- Assert.Contains(csvContents, fun row -> row.Contains("Parse inputs"))
+ // Shared access to avoid sporadic file locking during tests.
+ use reader = new StreamReader(new FileStream(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+ let header = reader.ReadLine()
+ Assert.Contains("Name,StartTime,EndTime,Duration(s),Id,ParentId,RootId", header)
+
+ let csvContents = reader.ReadToEnd()
+ Assert.Contains("Typecheck", csvContents)
+ Assert.Contains("Parse inputs", csvContents)
diff --git a/tests/FSharp.Compiler.ComponentTests/CompilerService/AsyncMemoize.fs b/tests/FSharp.Compiler.ComponentTests/CompilerService/AsyncMemoize.fs
index 72dd62e397c..802f07012de 100644
--- a/tests/FSharp.Compiler.ComponentTests/CompilerService/AsyncMemoize.fs
+++ b/tests/FSharp.Compiler.ComponentTests/CompilerService/AsyncMemoize.fs
@@ -2,164 +2,148 @@ module CompilerService.AsyncMemoize
open System
open System.Threading
-open Xunit
open Internal.Utilities.Collections
open System.Threading.Tasks
open System.Diagnostics
-open System.Collections.Concurrent
+
open FSharp.Compiler.DiagnosticsLogger
open FSharp.Compiler.Diagnostics
-open FSharp.Compiler.BuildGraph
+open Xunit
-let timeout = TimeSpan.FromSeconds 10.
+[]
+module internal JobEvents =
-let waitFor (mre: ManualResetEvent) =
- if not <| mre.WaitOne timeout then
- failwith "waitFor timed out"
+ let publishEvent (cache: AsyncMemoize<_, _, _>) =
+ let wrapper = Event<_>()
+ cache.OnEvent (fun e -> lock wrapper <| fun () -> wrapper.Trigger e)
+ wrapper.Publish |> Event.map (fun (jobEvent, (_,k,_)) -> jobEvent, k)
-let waitUntil condition value =
- task {
- let sw = Stopwatch.StartNew()
- while not <| condition value do
- if sw.Elapsed > timeout then
- failwith "waitUntil timed out"
- do! Task.Delay 10
- }
+ let collectEvents cache =
+ cache |> publishEvent |> Event.scan (fun es e -> e :: es) [] |> Event.map List.rev
-let rec internal spinFor (duration: TimeSpan) =
- async {
- let sw = Stopwatch.StartNew()
- do! Async.Sleep 10
- let remaining = duration - sw.Elapsed
- if remaining > TimeSpan.Zero then
- return! spinFor remaining
- }
-
-#if BUILDING_WITH_LKG
-type internal EventRecorder<'a, 'b, 'c when 'a : equality and 'b : equality>(memoize: AsyncMemoize<'a,'b,'c>) as self =
-#else
-type internal EventRecorder<'a, 'b, 'c when 'a : equality and 'b : equality and 'a:not null and 'b:not null>(memoize: AsyncMemoize<'a,'b,'c>) as self =
-#endif
+ /// Exposes a live view of the list of JobEvents generated by AsyncMemoize.
+ let observe cache =
+ let updateAvailable = new AutoResetEvent(false)
+ let mutable recorded = []
- let events = ConcurrentQueue()
+ let update next =
+ Debug.WriteLine $"%A{next}"
+ recorded <- next
+ updateAvailable.Set() |> ignore
- do memoize.OnEvent self.Add
+ collectEvents cache |> Event.add update
- member _.Add (e, (_label, k, _version)) = events.Enqueue (e, k)
+ let waitForUpdate = updateAvailable |> Async.AwaitWaitHandle |> Async.Ignore
- member _.Received value = events |> Seq.exists (fst >> (=) value)
-
- member _.CountOf value count = events |> Seq.filter (fst >> (=) value) |> Seq.length |> (=) count
+ async {
+ Debug.WriteLine $"current: %A{recorded}"
+ return recorded, waitForUpdate
+ }
- member _.ShouldBe (expected) =
- let expected = expected |> Seq.toArray
- let actual = events |> Seq.toArray
- Assert.Equal<_ array>(expected, actual)
+ let countOf value count events = events |> Seq.filter (fst >> (=) value) |> Seq.length |> (=) count
- member _.Sequence = events |> Seq.map id
+ let received value events = events |> Seq.exists (fst >> (=) value)
+ let waitUntil observedCache condition =
+ let rec loop() = async {
+ let! current, waitForUpdate = observedCache
+ if current |> condition |> not then
+ do! waitForUpdate
+ return! loop()
+ }
+ loop()
[]
let ``Basics``() =
-
- let computation key = async {
- do! Async.Sleep 1
- return key * 2
- }
-
- let memoize = AsyncMemoize()
- let events = EventRecorder(memoize)
-
- let result =
- seq {
- memoize.Get'(5, computation 5)
- memoize.Get'(5, computation 5)
- memoize.Get'(2, computation 2)
- memoize.Get'(5, computation 5)
- memoize.Get'(3, computation 3)
- memoize.Get'(2, computation 2)
+ task {
+ let computation key = async {
+ do! Async.Sleep 1
+ return key * 2
}
- |> Async.Parallel
- |> Async.RunSynchronously
- let expected = [| 10; 10; 4; 10; 6; 4|]
+ let memoize = AsyncMemoize()
+ let events = observe memoize
+
+ let result =
+ seq {
+ memoize.Get'(5, computation 5)
+ memoize.Get'(5, computation 5)
+ memoize.Get'(2, computation 2)
+ memoize.Get'(5, computation 5)
+ memoize.Get'(3, computation 3)
+ memoize.Get'(2, computation 2)
+ }
+ |> Async.Parallel
+ |> Async.RunSynchronously
- Assert.Equal(expected, result)
+ let expected = [| 10; 10; 4; 10; 6; 4|]
- (waitUntil (events.CountOf Finished) 3).Wait()
+ Assert.Equal(expected, result)
- let groups = events.Sequence |> Seq.groupBy snd |> Seq.toList
- Assert.Equal(3, groups.Length)
- for key, events in groups do
- Assert.Equal>(Set [ Requested, key; Started, key; Finished, key ], Set events)
+ do! waitUntil events (countOf Finished 3)
+ let! current, _ = events
+ let groups = current |> Seq.groupBy snd |> Seq.toList
+ Assert.Equal(3, groups.Length)
+ for key, events in groups do
+ Assert.Equal>(Set [ Requested, key; Started, key; Finished, key ], Set events)
+ }
[]
let ``We can cancel a job`` () =
task {
- let jobStarted = new ManualResetEvent(false)
+ let jobStarted = new ManualResetEventSlim(false)
+ let cts = new CancellationTokenSource()
+ let ctsCancelled = new ManualResetEventSlim(false)
- let computation action = async {
- action() |> ignore
- do! spinFor timeout
+ let computation = async {
+ jobStarted.Set()
+ ctsCancelled.Wait()
+ do! async { }
failwith "Should be canceled before it gets here"
}
let memoize = AsyncMemoize<_, int, _>()
- let events = EventRecorder(memoize)
-
- use cts1 = new CancellationTokenSource()
- use cts2 = new CancellationTokenSource()
- use cts3 = new CancellationTokenSource()
+ let events = observe memoize
let key = 1
- let _task1 = Async.StartAsTask( memoize.Get'(key, computation jobStarted.Set), cancellationToken = cts1.Token)
-
- waitFor jobStarted
- jobStarted.Reset() |> ignore
+ let _task1 = Async.StartAsTask( memoize.Get'(1, computation), cancellationToken = cts.Token)
- let _task2 = Async.StartAsTask( memoize.Get'(key, computation ignore), cancellationToken = cts2.Token)
- let _task3 = Async.StartAsTask( memoize.Get'(key, computation ignore), cancellationToken = cts3.Token)
+ jobStarted.Wait()
+ cts.Cancel()
+ ctsCancelled.Set()
- do! waitUntil (events.CountOf Requested) 3
+ do! waitUntil events (received Canceled)
+ let! current, _ = events
- cts1.Cancel()
- cts2.Cancel()
-
- waitFor jobStarted
-
- cts3.Cancel()
-
- do! waitUntil events.Received Canceled
-
- events.ShouldBe [
- Requested, key
- Started, key
- Requested, key
- Requested, key
- Restarted, key
- Canceled, key
- ]
+ Assert.Equal<_ list>(
+ [
+ Requested, key
+ Started, key
+ Canceled, key
+ ],
+ current
+ )
}
[]
let ``Job is restarted if first requestor cancels`` () =
task {
- let jobStarted = new ManualResetEvent(false)
+ let jobStarted = new SemaphoreSlim(0)
- let jobCanComplete = new ManualResetEvent(false)
+ let jobCanComplete = new ManualResetEventSlim(false)
let computation key = async {
- jobStarted.Set() |> ignore
- waitFor jobCanComplete
+ jobStarted.Release() |> ignore
+
+ jobCanComplete.Wait()
return key * 2
}
let memoize = AsyncMemoize<_, int, _>()
- let events = EventRecorder(memoize)
-
+ let events = observe memoize
use cts1 = new CancellationTokenSource()
use cts2 = new CancellationTokenSource()
@@ -169,48 +153,49 @@ let ``Job is restarted if first requestor cancels`` () =
let _task1 = Async.StartAsTask( memoize.Get'(key, computation key), cancellationToken = cts1.Token)
- waitFor jobStarted
- jobStarted.Reset() |> ignore
-
+ do! jobStarted.WaitAsync()
let _task2 = Async.StartAsTask( memoize.Get'(key, computation key), cancellationToken = cts2.Token)
let _task3 = Async.StartAsTask( memoize.Get'(key, computation key), cancellationToken = cts3.Token)
- do! waitUntil (events.CountOf Requested) 3
+ do! waitUntil events (countOf Requested 3)
cts1.Cancel()
- waitFor jobStarted
-
jobCanComplete.Set() |> ignore
+ do! jobStarted.WaitAsync()
+
let! result = _task2
Assert.Equal(2, result)
- events.ShouldBe [
- Requested, key
+ let! current, _ = events
+
+ Assert.Equal<_ list>(
+ [ Requested, key
Started, key
Requested, key
Requested, key
Restarted, key
- Finished, key ]
+ Finished, key ],
+ current
+ )
}
[]
let ``Job is restarted if first requestor cancels but keeps running if second requestor cancels`` () =
task {
- let jobStarted = new ManualResetEvent(false)
+ let jobStarted = new ManualResetEventSlim(false)
- let jobCanComplete = new ManualResetEvent(false)
+ let jobCanComplete = new ManualResetEventSlim(false)
let computation key = async {
jobStarted.Set() |> ignore
- waitFor jobCanComplete
+ jobCanComplete.Wait()
return key * 2
}
let memoize = AsyncMemoize<_, int, _>()
- let events = EventRecorder(memoize)
-
+ let events = observe memoize
use cts1 = new CancellationTokenSource()
use cts2 = new CancellationTokenSource()
@@ -220,17 +205,17 @@ let ``Job is restarted if first requestor cancels but keeps running if second re
let _task1 = Async.StartAsTask( memoize.Get'(key, computation key), cancellationToken = cts1.Token)
- waitFor jobStarted
+ jobStarted.Wait()
jobStarted.Reset() |> ignore
let _task2 = Async.StartAsTask( memoize.Get'(key, computation key), cancellationToken = cts2.Token)
let _task3 = Async.StartAsTask( memoize.Get'(key, computation key), cancellationToken = cts3.Token)
- do! waitUntil (events.CountOf Requested) 3
+ do! waitUntil events (countOf Requested 3)
cts1.Cancel()
- waitFor jobStarted
+ jobStarted.Wait()
cts2.Cancel()
@@ -239,13 +224,17 @@ let ``Job is restarted if first requestor cancels but keeps running if second re
let! result = _task3
Assert.Equal(2, result)
- events.ShouldBe [
- Requested, key
+ let! current, _ = events
+
+ Assert.Equal<_ list>(
+ [ Requested, key
Started, key
Requested, key
Requested, key
Restarted, key
- Finished, key ]
+ Finished, key ],
+ current
+ )
}
@@ -376,59 +365,56 @@ let ``Stress test`` () =
[]
[]
let ``Cancel running jobs with the same key`` cancelDuplicate expectFinished =
- task {
- let cache = AsyncMemoize(cancelDuplicateRunningJobs=cancelDuplicate)
-
- let mutable started = 0
- let mutable finished = 0
+ let cache = AsyncMemoize(cancelDuplicateRunningJobs=cancelDuplicate)
- let job1started = new ManualResetEvent(false)
- let job1finished = new ManualResetEvent(false)
+ let mutable started = 0
+ let mutable finished = 0
- let jobCanContinue = new ManualResetEvent(false)
+ let job1started = new ManualResetEventSlim(false)
+ let job1finished = new ManualResetEventSlim(false)
- let job2started = new ManualResetEvent(false)
- let job2finished = new ManualResetEvent(false)
+ let jobCanContinue = new ManualResetEventSlim(false)
- let work onStart onFinish = async {
- Interlocked.Increment &started |> ignore
- onStart() |> ignore
- waitFor jobCanContinue
- do! spinFor (TimeSpan.FromMilliseconds 100)
- Interlocked.Increment &finished |> ignore
- onFinish() |> ignore
- }
+ let job2started = new ManualResetEventSlim(false)
+ let job2finished = new ManualResetEventSlim(false)
- let key1 =
- { new ICacheKey<_, _> with
- member _.GetKey() = 1
- member _.GetVersion() = 1
- member _.GetLabel() = "key1" }
+ let work onStart onFinish = async {
+ Interlocked.Increment &started |> ignore
+ onStart() |> ignore
+ jobCanContinue.Wait()
+ do! Async.Sleep 100
+ Interlocked.Increment &finished |> ignore
+ onFinish() |> ignore
+ }
- cache.Get(key1, work job1started.Set job1finished.Set) |> Async.Start
+ let key1 =
+ { new ICacheKey<_, _> with
+ member _.GetKey() = 1
+ member _.GetVersion() = 1
+ member _.GetLabel() = "key1" }
- waitFor job1started
+ cache.Get(key1, work job1started.Set job1finished.Set) |> Async.Catch |> Async.Ignore |> Async.Start
- let key2 =
- { new ICacheKey<_, _> with
- member _.GetKey() = key1.GetKey()
- member _.GetVersion() = key1.GetVersion() + 1
- member _.GetLabel() = "key2" }
+ job1started.Wait()
- cache.Get(key2, work job2started.Set job2finished.Set ) |> Async.Start
+ let key2 =
+ { new ICacheKey<_, _> with
+ member _.GetKey() = key1.GetKey()
+ member _.GetVersion() = key1.GetVersion() + 1
+ member _.GetLabel() = "key2" }
- waitFor job2started
+ cache.Get(key2, work job2started.Set job2finished.Set ) |> Async.Catch |> Async.Ignore |> Async.Start
- jobCanContinue.Set() |> ignore
+ job2started.Wait()
- waitFor job2finished
+ jobCanContinue.Set() |> ignore
- if not cancelDuplicate then
- waitFor job1finished
-
- Assert.Equal((2, expectFinished), (started, finished))
- }
+ job2finished.Wait()
+
+ if not cancelDuplicate then
+ job1finished.Wait()
+ Assert.Equal((2, expectFinished), (started, finished))
type DummyException(msg) =
inherit Exception(msg)
@@ -490,7 +476,7 @@ let ``Preserve thread static diagnostics`` () =
let diagnostics = diagnosticsLogger.GetDiagnostics()
- //Assert.Equal(3, diagnostics.Length)
+ Assert.Equal(4, diagnostics.Length)
return result, diagnostics
}
@@ -498,9 +484,9 @@ let ``Preserve thread static diagnostics`` () =
let results = (Task.WhenAll tasks).Result
- let _diagnosticCounts = results |> Seq.map snd |> Seq.map Array.length |> Seq.groupBy id |> Seq.map (fun (k, v) -> k, v |> Seq.length) |> Seq.sortBy fst |> Seq.toList
+ let diagnosticCounts = results |> Seq.map snd |> Seq.map Array.length |> Seq.groupBy id |> Seq.map (fun (k, v) -> k, v |> Seq.length) |> Seq.sortBy fst |> Seq.toList
- //Assert.Equal<(int * int) list>([4, 100], diagnosticCounts)
+ Assert.Equal<(int * int) list>([4, 100], diagnosticCounts)
let diagnosticMessages = results |> Seq.map snd |> Seq.map (Array.map (fun (d, _) -> d.Exception.Message) >> Array.toList) |> Set
@@ -523,7 +509,7 @@ let ``Preserve thread static diagnostics already completed job`` () =
return Ok input
}
- async {
+ task {
let diagnosticsLogger = CompilationDiagnosticLogger($"Testing", FSharpDiagnosticOptions.Default)
@@ -534,10 +520,9 @@ let ``Preserve thread static diagnostics already completed job`` () =
let diagnosticMessages = diagnosticsLogger.GetDiagnostics() |> Array.map (fun (d, _) -> d.Exception.Message) |> Array.toList
- Assert.Equal>(["job 1 error"; "job 1 error"], diagnosticMessages)
+ Assert.Equal<_ list>(["job 1 error"; "job 1 error"], diagnosticMessages)
}
- |> Async.StartAsTask
[]
@@ -550,34 +535,22 @@ let ``We get diagnostics from the job that failed`` () =
member _.GetVersion() = 1
member _.GetLabel() = "job1" }
- let job (input: int) = async {
- let ex = DummyException($"job {input} error")
- do! Async.Sleep 100
- DiagnosticsThreadStatics.DiagnosticsLogger.Error(ex)
+ let job = async {
+ let ex = DummyException($"job error")
+
+ // no recovery
+ DiagnosticsThreadStatics.DiagnosticsLogger.Error ex
return 5
}
- let result =
- [1; 2]
- |> Seq.map (fun i ->
- async {
- let diagnosticsLogger = CompilationDiagnosticLogger($"Testing", FSharpDiagnosticOptions.Default)
-
- use _ = new CompilationGlobalsScope(diagnosticsLogger, BuildPhase.Optimize)
- try
- let! _ = cache.Get(key, job i )
- ()
- with _ ->
- ()
- let diagnosticMessages = diagnosticsLogger.GetDiagnostics() |> Array.map (fun (d, _) -> d.Exception.Message) |> Array.toList
-
- return diagnosticMessages
- })
- |> Async.Parallel
- |> Async.StartAsTask
- |> (fun t -> t.Result)
- |> Array.toList
-
- Assert.True(
- result = [["job 1 error"]; ["job 1 error"]] ||
- result = [["job 2 error"]; ["job 2 error"]] )
+ task {
+ let logger = CapturingDiagnosticsLogger("AsyncMemoize diagnostics test")
+
+ SetThreadDiagnosticsLoggerNoUnwind logger
+
+ do! cache.Get(key, job ) |> Async.Catch |> Async.Ignore
+
+ let messages = logger.Diagnostics |> List.map fst |> List.map _.Exception.Message
+
+ Assert.Equal<_ list>(["job error"], messages)
+ }
diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs
index 2a67d906999..fd876e72abb 100644
--- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs
+++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/CustomAttributes/AttributeUsage/AssemblyVersion04.fs
@@ -14,5 +14,5 @@ let success =
asm.Version.Major = 1 &&
asm.Version.Minor = 2 &&
asm.Version.Build = 3 &&
- (abs (asm.Version.Revision - (int defaultRevision))) < 10 // default value is seconds in the current day / 2. Check if within 10 sec of that.
+ (abs (asm.Version.Revision - (int defaultRevision))) < 60 // default value is seconds in the current day / 2. Check if within 60 sec of that.
if success then () else failwith "Failed: 1"
\ No newline at end of file
diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/Events/Basic/Basic.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/Events/Basic/Basic.fs
index 87d12baea7c..911891a3320 100644
--- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/Events/Basic/Basic.fs
+++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/Events/Basic/Basic.fs
@@ -6,6 +6,7 @@ open Xunit
open FSharp.Test
open FSharp.Test.Compiler
+[]
module Events =
let verifyCompile compilation =
diff --git a/tests/FSharp.Compiler.ComponentTests/EmittedIL/TestFunctions/TestFunctions.fs b/tests/FSharp.Compiler.ComponentTests/EmittedIL/TestFunctions/TestFunctions.fs
index 9b2ce64194e..5e760a94e73 100644
--- a/tests/FSharp.Compiler.ComponentTests/EmittedIL/TestFunctions/TestFunctions.fs
+++ b/tests/FSharp.Compiler.ComponentTests/EmittedIL/TestFunctions/TestFunctions.fs
@@ -5,7 +5,7 @@ open System.IO
open FSharp.Test
open FSharp.Test.Compiler
-module TestFunctions =
+module Helpers =
let verifyCore compilation =
compilation
@@ -26,6 +26,10 @@ module TestFunctions =
|> verifyCore
|> verifyILBaseline
+open Helpers
+
+module TestFunctions1 =
+
//SOURCE=TestFunction01.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction01.exe" # TestFunction01.fs
[]
let ``TestFunction01_fs`` compilation =
@@ -116,6 +120,8 @@ module TestFunctions =
compilation
|> verifyCompilation
+module TestFunctions2 =
+
//SOURCE=TestFunction09b4.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction09b4.exe" # TestFunction09b4.fs
[]
let ``TestFunction09b4_RealInternalSignatureOff_fs`` compilation =
@@ -196,6 +202,8 @@ module TestFunctions =
compilation
|> verifyCompilation
+module TestFunctions3 =
+
//SOURCE=TestFunction21.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction21.exe" # TestFunction21.fs -
[]
let ``TestFunction21_fs`` compilation =
@@ -293,6 +301,8 @@ module TestFunctions =
|> withRealInternalSignatureOff
|> verifyCompilation
+module TestFunctions4 =
+
//SOURCE=TestFunction22g.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TestFunction22g.exe" # TestFunction22g.fs
[]
let ``TestFunction22g_RealInternalSignatureOn_fs`` compilation =
diff --git a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
index 4b50b28aa12..550aabfe8df 100644
--- a/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
+++ b/tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj
@@ -31,6 +31,9 @@
FsUnit.fs
+
+ XunitSetup.fs
+
@@ -287,6 +290,7 @@
+
diff --git a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs
index 0395a421895..8bc9ac09f05 100644
--- a/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs
+++ b/tests/FSharp.Compiler.ComponentTests/FSharpChecker/TransparentCompiler.fs
@@ -13,6 +13,7 @@ open FSharp.Compiler.Diagnostics
open Xunit
+open FSharp.Test
open FSharp.Test.ProjectGeneration
open FSharp.Test.ProjectGeneration.Helpers
open System.IO
@@ -1064,67 +1065,71 @@ type private LoadClosureTestShim(currentFileSystem: IFileSystem) =
?shouldShadowCopy = shouldShadowCopy
)
-[]
-[]
-[]
-let ``The script load closure should always be evaluated`` useTransparentCompiler =
- async {
- // The LoadScriptClosure uses the file system shim so we need to reset that.
- let currentFileSystem = FileSystemAutoOpens.FileSystem
- let assumeDotNetFramework =
- // The old BackgroundCompiler uses assumeDotNetFramework = true
- // This is not always correctly loading when this test runs on non-Windows.
- if System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework") then
- None
- else
- Some false
+// Because it is mutating FileSystem!
+[]
+module TestsMutatingFileSystem =
+
+ []
+ []
+ []
+ let ``The script load closure should always be evaluated`` useTransparentCompiler =
+ async {
+ // The LoadScriptClosure uses the file system shim so we need to reset that.
+ let currentFileSystem = FileSystemAutoOpens.FileSystem
+ let assumeDotNetFramework =
+ // The old BackgroundCompiler uses assumeDotNetFramework = true
+ // This is not always correctly loading when this test runs on non-Windows.
+ if System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription.StartsWith(".NET Framework") then
+ None
+ else
+ Some false
- try
- let checker = FSharpChecker.Create(useTransparentCompiler = useTransparentCompiler)
- let fileSystemShim = LoadClosureTestShim(currentFileSystem)
- // Override the file system shim for loading b.fsx
- FileSystem <- fileSystemShim
-
- let! initialSnapshot, _ =
- checker.GetProjectSnapshotFromScript(
- "a.fsx",
- SourceTextNew.ofString fileSystemShim.aFsx,
- documentSource = DocumentSource.Custom fileSystemShim.DocumentSource,
- ?assumeDotNetFramework = assumeDotNetFramework
- )
-
- // File b.fsx should also be included in the snapshot.
- Assert.Equal(2, initialSnapshot.SourceFiles.Length)
-
- let! checkResults = checker.ParseAndCheckFileInProject("a.fsx", initialSnapshot)
-
- match snd checkResults with
- | FSharpCheckFileAnswer.Aborted -> failwith "Did not expected FSharpCheckFileAnswer.Aborted"
- | FSharpCheckFileAnswer.Succeeded checkFileResults -> Assert.Equal(0, checkFileResults.Diagnostics.Length)
+ try
+ let checker = FSharpChecker.Create(useTransparentCompiler = useTransparentCompiler)
+ let fileSystemShim = LoadClosureTestShim(currentFileSystem)
+ // Override the file system shim for loading b.fsx
+ FileSystem <- fileSystemShim
+
+ let! initialSnapshot, _ =
+ checker.GetProjectSnapshotFromScript(
+ "a.fsx",
+ SourceTextNew.ofString fileSystemShim.aFsx,
+ documentSource = DocumentSource.Custom fileSystemShim.DocumentSource,
+ ?assumeDotNetFramework = assumeDotNetFramework
+ )
+
+ // File b.fsx should also be included in the snapshot.
+ Assert.Equal(2, initialSnapshot.SourceFiles.Length)
+
+ let! checkResults = checker.ParseAndCheckFileInProject("a.fsx", initialSnapshot)
+
+ match snd checkResults with
+ | FSharpCheckFileAnswer.Aborted -> failwith "Did not expected FSharpCheckFileAnswer.Aborted"
+ | FSharpCheckFileAnswer.Succeeded checkFileResults -> Assert.Equal(0, checkFileResults.Diagnostics.Length)
- // Update b.fsx, it should now load c.fsx
- fileSystemShim.UpdateB()
-
- // The constructed key for the load closure will the exactly the same as the first GetProjectSnapshotFromScript call.
- // However, a none cached version will be computed first in GetProjectSnapshotFromScript and update the cache afterwards.
- let! secondSnapshot, _ =
- checker.GetProjectSnapshotFromScript(
- "a.fsx",
- SourceTextNew.ofString fileSystemShim.aFsx,
- documentSource = DocumentSource.Custom fileSystemShim.DocumentSource,
- ?assumeDotNetFramework = assumeDotNetFramework
- )
-
- Assert.Equal(3, secondSnapshot.SourceFiles.Length)
-
- let! checkResults = checker.ParseAndCheckFileInProject("a.fsx", secondSnapshot)
-
- match snd checkResults with
- | FSharpCheckFileAnswer.Aborted -> failwith "Did not expected FSharpCheckFileAnswer.Aborted"
- | FSharpCheckFileAnswer.Succeeded checkFileResults -> Assert.Equal(0, checkFileResults.Diagnostics.Length)
- finally
- FileSystemAutoOpens.FileSystem <- currentFileSystem
- }
+ // Update b.fsx, it should now load c.fsx
+ fileSystemShim.UpdateB()
+
+ // The constructed key for the load closure will the exactly the same as the first GetProjectSnapshotFromScript call.
+ // However, a none cached version will be computed first in GetProjectSnapshotFromScript and update the cache afterwards.
+ let! secondSnapshot, _ =
+ checker.GetProjectSnapshotFromScript(
+ "a.fsx",
+ SourceTextNew.ofString fileSystemShim.aFsx,
+ documentSource = DocumentSource.Custom fileSystemShim.DocumentSource,
+ ?assumeDotNetFramework = assumeDotNetFramework
+ )
+
+ Assert.Equal(3, secondSnapshot.SourceFiles.Length)
+
+ let! checkResults = checker.ParseAndCheckFileInProject("a.fsx", secondSnapshot)
+
+ match snd checkResults with
+ | FSharpCheckFileAnswer.Aborted -> failwith "Did not expected FSharpCheckFileAnswer.Aborted"
+ | FSharpCheckFileAnswer.Succeeded checkFileResults -> Assert.Equal(0, checkFileResults.Diagnostics.Length)
+ finally
+ FileSystemAutoOpens.FileSystem <- currentFileSystem
+ }
[]
let ``Parsing without cache and without project snapshot`` () =
diff --git a/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs b/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs
index 3f17e0cfa11..35ff5c1837b 100644
--- a/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs
+++ b/tests/FSharp.Compiler.ComponentTests/Miscellaneous/FsharpSuiteMigrated.fs
@@ -36,7 +36,8 @@ module ScriptRunner =
match res with
| CompilationResult.Failure _ -> res
| CompilationResult.Success s ->
- if engine.GetOutput().Contains "TEST PASSED OK" then
+
+ if engine.GetOutput() |> TestFramework.outputPassed then
res
else
failwith $"Results looked correct, but 'TEST PASSED OK' was not printed. Result: %A{s}"
diff --git a/tests/FSharp.Compiler.ComponentTests/Miscellaneous/MigratedCoreTests.fs b/tests/FSharp.Compiler.ComponentTests/Miscellaneous/MigratedCoreTests.fs
index 2d9c6657901..852e092e5e1 100644
--- a/tests/FSharp.Compiler.ComponentTests/Miscellaneous/MigratedCoreTests.fs
+++ b/tests/FSharp.Compiler.ComponentTests/Miscellaneous/MigratedCoreTests.fs
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
-module Miscellaneous.FsharpSuiteMigrated_CoreTests
+namespace Miscellaneous.FsharpSuiteMigrated_CoreTests
open Xunit
open FSharp.Test
@@ -8,458 +8,477 @@ open FSharp.Test.ScriptHelpers
open System.Runtime.InteropServices
open Miscellaneous.FsharpSuiteMigrated.TestFrameworkAdapter
-// These tests are enabled for .NET Framework and .NET Core
-[]
-let ``access-FSC_DEBUG``() = singleTestBuildAndRun "core/access" FSC_DEBUG
+module Tests1 =
-[]
-let ``access-FSC_OPTIMIZED``() = singleTestBuildAndRun "core/access" FSC_OPTIMIZED
+ // These tests are enabled for .NET Framework and .NET Core
+ []
+ let ``access-FSC_DEBUG``() = singleTestBuildAndRun "core/access" FSC_DEBUG
-[]
-let ``access-FSI``() = singleTestBuildAndRun "core/access" FSI
+ []
+ let ``access-FSC_OPTIMIZED``() = singleTestBuildAndRun "core/access" FSC_OPTIMIZED
-[]
-let ``apporder-FSC_DEBUG`` () = singleTestBuildAndRun "core/apporder" FSC_DEBUG
+ []
+ let ``access-FSI``() = singleTestBuildAndRun "core/access" FSI
-[]
-let ``apporder-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/apporder" FSC_OPTIMIZED
+ []
+ let ``apporder-FSC_DEBUG`` () = singleTestBuildAndRun "core/apporder" FSC_DEBUG
-[]
-let ``apporder-FSI`` () = singleTestBuildAndRun "core/apporder" FSI
+ []
+ let ``apporder-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/apporder" FSC_OPTIMIZED
-[]
-let ``array-FSC_DEBUG-5_0`` () = singleTestBuildAndRunVersion "core/array" FSC_DEBUG LangVersion.V50
+ []
+ let ``apporder-FSI`` () = singleTestBuildAndRun "core/apporder" FSI
-[]
-let ``array-FSC_OPTIMIZED-5_0`` () = singleTestBuildAndRunVersion "core/array" FSC_OPTIMIZED LangVersion.V50
+ []
+ let ``array-FSC_DEBUG-5_0`` () = singleTestBuildAndRunVersion "core/array" FSC_DEBUG LangVersion.V50
-[]
-let ``array-FSI-5_0`` () = singleTestBuildAndRunVersion "core/array" FSI LangVersion.V50
+ []
+ let ``array-FSC_OPTIMIZED-5_0`` () = singleTestBuildAndRunVersion "core/array" FSC_OPTIMIZED LangVersion.V50
-[]
-let ``array-FSC_OPTIMIZED-preview`` () = singleTestBuildAndRunVersion "core/array" FSC_OPTIMIZED LangVersion.Preview
+ []
+ let ``array-FSI-5_0`` () = singleTestBuildAndRunVersion "core/array" FSI LangVersion.V50
-[]
-let ``array-no-dot-FSC_DEBUG`` () = singleTestBuildAndRunVersion "core/array-no-dot" FSC_DEBUG LangVersion.Preview
+ []
+ let ``array-FSC_OPTIMIZED-preview`` () = singleTestBuildAndRunVersion "core/array" FSC_OPTIMIZED LangVersion.Preview
-[]
-let ``array-no-dot-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "core/array-no-dot" FSC_OPTIMIZED LangVersion.Preview
+ []
+ let ``array-no-dot-FSC_DEBUG`` () = singleTestBuildAndRunVersion "core/array-no-dot" FSC_DEBUG LangVersion.Preview
-[]
-let ``array-no-dot-FSI`` () = singleTestBuildAndRunVersion "core/array-no-dot" FSI LangVersion.Preview
+ []
+ let ``array-no-dot-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "core/array-no-dot" FSC_OPTIMIZED LangVersion.Preview
-[]
-let ``array-no-dot-warnings-langversion-default`` () =
- singleVersionedNegTest "core/array-no-dot-warnings" LangVersion.Latest "test-langversion-default"
+ []
+ let ``array-no-dot-FSI`` () = singleTestBuildAndRunVersion "core/array-no-dot" FSI LangVersion.Preview
-[]
-let ``array-no-dot-warnings-langversion-5_0`` () =
- singleVersionedNegTest "core/array-no-dot-warnings" LangVersion.V50 "test-langversion-5.0"
+ []
+ let ``array-no-dot-warnings-langversion-default`` () =
+ singleVersionedNegTest "core/array-no-dot-warnings" LangVersion.Latest "test-langversion-default"
-[]
-let ``ref-ops-deprecation-langversion-preview`` () =
- singleVersionedNegTest "core/ref-ops-deprecation" LangVersion.Preview "test-langversion-preview"
+ []
+ let ``array-no-dot-warnings-langversion-5_0`` () =
+ singleVersionedNegTest "core/array-no-dot-warnings" LangVersion.V50 "test-langversion-5.0"
-[]
-let ``auto-widen-version-5_0``() =
- singleVersionedNegTest "core/auto-widen/5.0" LangVersion.V50 "test"
+ []
+ let ``ref-ops-deprecation-langversion-preview`` () =
+ singleVersionedNegTest "core/ref-ops-deprecation" LangVersion.Preview "test-langversion-preview"
-[]
-let ``auto-widen-version-FSC_DEBUG-preview``() =
- singleTestBuildAndRunVersion "core/auto-widen/preview" FSC_DEBUG LangVersion.Preview
+ []
+ let ``auto-widen-version-5_0``() =
+ singleVersionedNegTest "core/auto-widen/5.0" LangVersion.V50 "test"
-[]
-let ``auto-widen-version-FSC_OPTIMIZED-preview``() =
- singleTestBuildAndRunVersion "core/auto-widen/preview" FSC_OPTIMIZED LangVersion.Preview
+ []
+ let ``auto-widen-version-FSC_DEBUG-preview``() =
+ singleTestBuildAndRunVersion "core/auto-widen/preview" FSC_DEBUG LangVersion.Preview
-[]
-let ``auto-widen-minimal``() =
- singleTestBuildAndRunVersion "core/auto-widen/minimal" FSC_OPTIMIZED LangVersion.V70
+ []
+ let ``auto-widen-version-FSC_OPTIMIZED-preview``() =
+ singleTestBuildAndRunVersion "core/auto-widen/preview" FSC_OPTIMIZED LangVersion.Preview
-[]
-let ``auto-widen-version-preview-warns-on``() =
- singleVersionedNegTestAux "core/auto-widen/preview" ["--warnon:3388";"--warnon:3389";"--warnon:3395";"--warnaserror+";"--define:NEGATIVE"] LangVersion.V80 "test"
+ []
+ let ``auto-widen-minimal``() =
+ singleTestBuildAndRunVersion "core/auto-widen/minimal" FSC_OPTIMIZED LangVersion.V70
-[]
-let ``auto-widen-version-preview-default-warns``() =
- singleVersionedNegTestAux "core/auto-widen/preview-default-warns" ["--warnaserror+";"--define:NEGATIVE"] LangVersion.V80 "test"
+ []
+ let ``auto-widen-version-preview-warns-on``() =
+ singleVersionedNegTestAux "core/auto-widen/preview" ["--warnon:3388";"--warnon:3389";"--warnon:3395";"--warnaserror+";"--define:NEGATIVE"] LangVersion.V80 "test"
-[]
-let ``comprehensions-FSC_DEBUG`` () = singleTestBuildAndRun "core/comprehensions" FSC_DEBUG
+ []
+ let ``auto-widen-version-preview-default-warns``() =
+ singleVersionedNegTestAux "core/auto-widen/preview-default-warns" ["--warnaserror+";"--define:NEGATIVE"] LangVersion.V80 "test"
-[]
-let ``comprehensions-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/comprehensions" FSC_OPTIMIZED
+module Tests2 =
-[]
-let ``comprehensions-FSI`` () = singleTestBuildAndRun "core/comprehensions" FSI
+ []
+ let ``comprehensions-FSC_DEBUG`` () = singleTestBuildAndRun "core/comprehensions" FSC_DEBUG
-[]
-let ``comprehensionshw-FSC_DEBUG`` () = singleTestBuildAndRun "core/comprehensions-hw" FSC_DEBUG
+ []
+ let ``comprehensions-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/comprehensions" FSC_OPTIMIZED
-[]
-let ``comprehensionshw-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/comprehensions-hw" FSC_OPTIMIZED
+ []
+ let ``comprehensions-FSI`` () = singleTestBuildAndRun "core/comprehensions" FSI
-[]
-let ``comprehensionshw-FSI`` () = singleTestBuildAndRun "core/comprehensions-hw" FSI
+ []
+ let ``comprehensionshw-FSC_DEBUG`` () = singleTestBuildAndRun "core/comprehensions-hw" FSC_DEBUG
-[]
-let ``genericmeasures-FSC_DEBUG`` () = singleTestBuildAndRun "core/genericmeasures" FSC_DEBUG
+ []
+ let ``comprehensionshw-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/comprehensions-hw" FSC_OPTIMIZED
-[]
-let ``genericmeasures-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/genericmeasures" FSC_OPTIMIZED
+ []
+ let ``comprehensionshw-FSI`` () = singleTestBuildAndRun "core/comprehensions-hw" FSI
-[]
-let ``genericmeasures-FSI`` () = singleTestBuildAndRun "core/genericmeasures" FSI
+ []
+ let ``genericmeasures-FSC_DEBUG`` () = singleTestBuildAndRun "core/genericmeasures" FSC_DEBUG
-[]
-let ``innerpoly-FSC_DEBUG`` () = singleTestBuildAndRun "core/innerpoly" FSC_DEBUG
+ []
+ let ``genericmeasures-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/genericmeasures" FSC_OPTIMIZED
-[]
-let ``innerpoly-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/innerpoly" FSC_OPTIMIZED
+ []
+ let ``genericmeasures-FSI`` () = singleTestBuildAndRun "core/genericmeasures" FSI
-[]
-let ``innerpoly-FSI`` () = singleTestBuildAndRun "core/innerpoly" FSI
+ []
+ let ``innerpoly-FSC_DEBUG`` () = singleTestBuildAndRun "core/innerpoly" FSC_DEBUG
-[]
-let ``namespaceAttributes-FSC_DEBUG`` () = singleTestBuildAndRunVersion "core/namespaces" COMPILED_EXE_APP LangVersion.Preview
+ []
+ let ``innerpoly-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/innerpoly" FSC_OPTIMIZED
-[]
-let ``namespaceAttributes-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "core/namespaces" COMPILED_EXE_APP LangVersion.Preview
+ []
+ let ``innerpoly-FSI`` () = singleTestBuildAndRun "core/innerpoly" FSI
-[]
-let ``unicode2-FSC_DEBUG`` () = singleTestBuildAndRun "core/unicode" FSC_DEBUG // TODO: fails on coreclr
+ []
+ let ``namespaceAttributes-FSC_DEBUG`` () = singleTestBuildAndRunVersion "core/namespaces" COMPILED_EXE_APP LangVersion.Preview
-[]
-let ``unicode2-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/unicode" FSC_OPTIMIZED // TODO: fails on coreclr
+ []
+ let ``namespaceAttributes-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "core/namespaces" COMPILED_EXE_APP LangVersion.Preview
-[]
-let ``unicode2-FSI`` () = singleTestBuildAndRun "core/unicode" FSI
+ []
+ let ``unicode2-FSC_DEBUG`` () = singleTestBuildAndRun "core/unicode" FSC_DEBUG // TODO: fails on coreclr
-[]
-let ``lazy test-FSC_DEBUG`` () = singleTestBuildAndRun "core/lazy" FSC_DEBUG
+ []
+ let ``unicode2-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/unicode" FSC_OPTIMIZED // TODO: fails on coreclr
-[]
-let ``lazy test-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/lazy" FSC_OPTIMIZED
+ []
+ let ``unicode2-FSI`` () = singleTestBuildAndRun "core/unicode" FSI
-[]
-let ``lazy test-FSI`` () = singleTestBuildAndRun "core/lazy" FSI
+ []
+ let ``lazy test-FSC_DEBUG`` () = singleTestBuildAndRun "core/lazy" FSC_DEBUG
-[]
-let ``letrec-FSC_DEBUG`` () = singleTestBuildAndRun "core/letrec" FSC_DEBUG
+ []
+ let ``lazy test-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/lazy" FSC_OPTIMIZED
-[]
-let ``letrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/letrec" FSC_OPTIMIZED
+ []
+ let ``lazy test-FSI`` () = singleTestBuildAndRun "core/lazy" FSI
-[]
-let ``letrec-FSI`` () = singleTestBuildAndRun "core/letrec" FSI
+ []
+ let ``letrec-FSC_DEBUG`` () = singleTestBuildAndRun "core/letrec" FSC_DEBUG
-[]
-let ``letrec (mutrec variations part one) FSC_DEBUG`` () = singleTestBuildAndRun "core/letrec-mutrec" FSC_DEBUG
+ []
+ let ``letrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/letrec" FSC_OPTIMIZED
-[]
-let ``letrec (mutrec variations part one) FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/letrec-mutrec" FSC_OPTIMIZED
+ []
+ let ``letrec-FSI`` () = singleTestBuildAndRun "core/letrec" FSI
-[]
-let ``letrec (mutrec variations part one) FSI`` () = singleTestBuildAndRun "core/letrec-mutrec" FSI
+ []
+ let ``letrec (mutrec variations part one) FSC_DEBUG`` () = singleTestBuildAndRun "core/letrec-mutrec" FSC_DEBUG
-[]
-let ``libtest-FSC_DEBUG`` () = singleTestBuildAndRun "core/libtest" FSC_DEBUG
+ []
+ let ``letrec (mutrec variations part one) FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/letrec-mutrec" FSC_OPTIMIZED
-[]
-let ``libtest-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/libtest" FSC_OPTIMIZED
+ []
+ let ``letrec (mutrec variations part one) FSI`` () = singleTestBuildAndRun "core/letrec-mutrec" FSI
-[]
-let ``libtest-FSI`` () = singleTestBuildAndRun "core/libtest" FSI
+module Tests3 =
-[]
-let ``lift-FSC_DEBUG`` () = singleTestBuildAndRun "core/lift" FSC_DEBUG
+ []
+ let ``libtest-FSC_DEBUG`` () = singleTestBuildAndRun "core/libtest" FSC_DEBUG
-[]
-let ``lift-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/lift" FSC_OPTIMIZED
+ []
+ let ``libtest-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/libtest" FSC_OPTIMIZED
-[]
-let ``lift-FSI`` () = singleTestBuildAndRun "core/lift" FSI
+ []
+ let ``libtest-FSI`` () = singleTestBuildAndRun "core/libtest" FSI
-[]
-let ``map-FSC_DEBUG`` () = singleTestBuildAndRun "core/map" FSC_DEBUG
+ []
+ let ``lift-FSC_DEBUG`` () = singleTestBuildAndRun "core/lift" FSC_DEBUG
-[]
-let ``map-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/map" FSC_OPTIMIZED
+ []
+ let ``lift-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/lift" FSC_OPTIMIZED
-[]
-let ``map-FSI`` () = singleTestBuildAndRun "core/map" FSI
+ []
+ let ``lift-FSI`` () = singleTestBuildAndRun "core/lift" FSI
-[]
-let ``measures-FSC_DEBUG`` () = singleTestBuildAndRun "core/measures" FSC_DEBUG
+ []
+ let ``map-FSC_DEBUG`` () = singleTestBuildAndRun "core/map" FSC_DEBUG
-[]
-let ``measures-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/measures" FSC_OPTIMIZED
+ []
+ let ``map-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/map" FSC_OPTIMIZED
-[]
-let ``measures-FSI`` () = singleTestBuildAndRun "core/measures" FSI
+ []
+ let ``map-FSI`` () = singleTestBuildAndRun "core/map" FSI
-[]
-let ``nested-FSC_DEBUG`` () = singleTestBuildAndRun "core/nested" FSC_DEBUG
+ []
+ let ``measures-FSC_DEBUG`` () = singleTestBuildAndRun "core/measures" FSC_DEBUG
-[]
-let ``nested-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/nested" FSC_OPTIMIZED
+ []
+ let ``measures-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/measures" FSC_OPTIMIZED
-[]
-let ``nested-FSI`` () = singleTestBuildAndRun "core/nested" FSI
+ []
+ let ``measures-FSI`` () = singleTestBuildAndRun "core/measures" FSI
-[]
-let ``members-basics-hw`` () = singleTestBuildAndRun "core/members/basics-hw" FSC_OPTIMIZED
+ []
+ let ``nested-FSC_DEBUG`` () = singleTestBuildAndRun "core/nested" FSC_DEBUG
-[]
-let ``members-basics-hw-mutrec-realinternalsignature`` () = singleTestBuildAndRun "core/members/basics-hw-mutrec" FSC_DEBUG//OPTIMIZED
+ []
+ let ``nested-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/nested" FSC_OPTIMIZED
-[]
-let ``members-incremental-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/incremental" FSC_OPTIMIZED
+ []
+ let ``nested-FSI`` () = singleTestBuildAndRun "core/nested" FSI
-[]
-let ``members-incremental-FSI`` () = singleTestBuildAndRun "core/members/incremental" FSI
+ []
+ let ``members-basics-hw`` () = singleTestBuildAndRun "core/members/basics-hw" FSC_OPTIMIZED
-[]
-let ``members-incremental-hw-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/incremental-hw" FSC_OPTIMIZED
+ []
+ let ``members-basics-hw-mutrec-realinternalsignature`` () = singleTestBuildAndRun "core/members/basics-hw-mutrec" FSC_DEBUG//OPTIMIZED
-[]
-let ``members-incremental-hw-FSI`` () = singleTestBuildAndRun "core/members/incremental-hw" FSI
+ []
+ let ``members-incremental-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/incremental" FSC_OPTIMIZED
-[]
-let ``members-incremental-hw-mutrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/incremental-hw-mutrec" FSC_OPTIMIZED
+ []
+ let ``members-incremental-FSI`` () = singleTestBuildAndRun "core/members/incremental" FSI
-[]
-let ``members-ops-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/ops" FSC_OPTIMIZED
+ []
+ let ``members-incremental-hw-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/incremental-hw" FSC_OPTIMIZED
-[]
-let ``members-ops-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/ops" FSC_DEBUG
+ []
+ let ``members-incremental-hw-FSI`` () = singleTestBuildAndRun "core/members/incremental-hw" FSI
-[]
-let ``members-ops-FSI`` () = singleTestBuildAndRun "core/members/ops" FSI
+ []
+ let ``members-incremental-hw-mutrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/incremental-hw-mutrec" FSC_OPTIMIZED
-[]
-let ``members-ops-mutrec-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/ops-mutrec" FSC_DEBUG
+ []
+ let ``members-ops-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/ops" FSC_OPTIMIZED
-[]
-let ``members-ops-mutrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/ops-mutrec" FSC_OPTIMIZED
+ []
+ let ``members-ops-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/ops" FSC_DEBUG
-[]
-let ``members-ops-mutrec-FSI`` () = singleTestBuildAndRun "core/members/ops-mutrec" FSI
+ []
+ let ``members-ops-FSI`` () = singleTestBuildAndRun "core/members/ops" FSI
-[]
-let ``seq-FSC_DEBUG`` () = singleTestBuildAndRun "core/seq" FSC_DEBUG
+ []
+ let ``members-ops-mutrec-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/ops-mutrec" FSC_DEBUG
-[]
-let ``seq-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/seq" FSC_OPTIMIZED
+ []
+ let ``members-ops-mutrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/ops-mutrec" FSC_OPTIMIZED
-[]
-let ``seq-FSI`` () = singleTestBuildAndRun "core/seq" FSI
+ []
+ let ``members-ops-mutrec-FSI`` () = singleTestBuildAndRun "core/members/ops-mutrec" FSI
-[]
-let ``math-numbers-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/math/numbers" FSC_OPTIMIZED
+module Tests4 =
-[]
-let ``math-numbers-FSI`` () = singleTestBuildAndRun "core/math/numbers" FSI
+ []
+ let ``seq-FSC_DEBUG`` () = singleTestBuildAndRun "core/seq" FSC_DEBUG
-[]
-let ``members-ctree-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/ctree" FSC_DEBUG
+ []
+ let ``seq-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/seq" FSC_OPTIMIZED
-[]
-let ``members-ctree-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/ctree" FSC_OPTIMIZED
+ []
+ let ``seq-FSI`` () = singleTestBuildAndRun "core/seq" FSI
-[]
-let ``members-ctree-FSI`` () = singleTestBuildAndRun "core/members/ctree" FSI
+ []
+ let ``math-numbers-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/math/numbers" FSC_OPTIMIZED
-[]
-let ``members-factors-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/factors" FSC_DEBUG
+ []
+ let ``math-numbers-FSI`` () = singleTestBuildAndRun "core/math/numbers" FSI
-[]
-let ``members-factors-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/factors" FSC_OPTIMIZED
+ []
+ let ``members-ctree-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/ctree" FSC_DEBUG
-[]
-let ``members-factors-FSI`` () = singleTestBuildAndRun "core/members/factors" FSI
+ []
+ let ``members-ctree-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/ctree" FSC_OPTIMIZED
-[]
-let ``members-factors-mutrec-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/factors-mutrec" FSC_DEBUG
+ []
+ let ``members-ctree-FSI`` () = singleTestBuildAndRun "core/members/ctree" FSI
-[]
-let ``members-factors-mutrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/factors-mutrec" FSC_OPTIMIZED
+ []
+ let ``members-factors-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/factors" FSC_DEBUG
-[]
-let ``members-factors-mutrec-FSI`` () = singleTestBuildAndRun "core/members/factors-mutrec" FSI
+ []
+ let ``members-factors-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/factors" FSC_OPTIMIZED
-[]
-let ``graph-FSC_DEBUG`` () = singleTestBuildAndRunVersion "perf/graph" FSC_DEBUG LangVersion.SupportsMl
+ []
+ let ``members-factors-FSI`` () = singleTestBuildAndRun "core/members/factors" FSI
-[]
-let ``graph-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "perf/graph" FSC_OPTIMIZED LangVersion.SupportsMl
+ []
+ let ``members-factors-mutrec-FSC_DEBUG`` () = singleTestBuildAndRun "core/members/factors-mutrec" FSC_DEBUG
-[]
-let ``graph-FSI`` () = singleTestBuildAndRunVersion "perf/graph" FSI LangVersion.SupportsMl
+ []
+ let ``members-factors-mutrec-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/members/factors-mutrec" FSC_OPTIMIZED
-[]
-let ``nbody-FSC_DEBUG`` () = singleTestBuildAndRunVersion "perf/nbody" FSC_DEBUG LangVersion.SupportsMl
+ []
+ let ``members-factors-mutrec-FSI`` () = singleTestBuildAndRun "core/members/factors-mutrec" FSI
-[]
-let ``nbody-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "perf/nbody" FSC_OPTIMIZED LangVersion.SupportsMl
+ []
+ let ``graph-FSC_DEBUG`` () = singleTestBuildAndRunVersion "perf/graph" FSC_DEBUG LangVersion.SupportsMl
-[]
-let ``nbody-FSI`` () = singleTestBuildAndRunVersion "perf/nbody" FSI LangVersion.SupportsMl
+ []
+ let ``graph-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "perf/graph" FSC_OPTIMIZED LangVersion.SupportsMl
-[]
-let ``forexpression-FSC_DEBUG`` () = singleTestBuildAndRun "core/forexpression" FSC_DEBUG
+ []
+ let ``graph-FSI`` () = singleTestBuildAndRunVersion "perf/graph" FSI LangVersion.SupportsMl
-[]
-let ``forexpression-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/forexpression" FSC_OPTIMIZED
+ []
+ let ``nbody-FSC_DEBUG`` () = singleTestBuildAndRunVersion "perf/nbody" FSC_DEBUG LangVersion.SupportsMl
-[]
-let ``forexpression-FSI`` () = singleTestBuildAndRun "core/forexpression" FSI
+ []
+ let ``nbody-FSC_OPTIMIZED`` () = singleTestBuildAndRunVersion "perf/nbody" FSC_OPTIMIZED LangVersion.SupportsMl
-[]
-let ``letrec (mutrec variations part two) FSC_DEBUG`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSC_DEBUG
+ []
+ let ``nbody-FSI`` () = singleTestBuildAndRunVersion "perf/nbody" FSI LangVersion.SupportsMl
-[]
-let ``letrec (mutrec variations part two) FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSC_OPTIMIZED
+module Tests5 =
-[]
-let ``letrec (mutrec variations part two) FSI`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSI
+ []
+ let ``forexpression-FSC_DEBUG`` () = singleTestBuildAndRun "core/forexpression" FSC_DEBUG
-[]
-let ``printf`` () = singleTestBuildAndRunVersion "core/printf" FSC_OPTIMIZED LangVersion.Preview
+ []
+ let ``forexpression-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/forexpression" FSC_OPTIMIZED
-[]
-let ``printf-interpolated`` () = singleTestBuildAndRunVersion "core/printf-interpolated" FSC_OPTIMIZED LangVersion.Preview
+ []
+ let ``forexpression-FSI`` () = singleTestBuildAndRun "core/forexpression" FSI
-[]
-let ``tlr-FSC_DEBUG`` () = singleTestBuildAndRun "core/tlr" FSC_DEBUG
+ []
+ let ``letrec (mutrec variations part two) FSC_DEBUG`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSC_DEBUG
-[]
-let ``tlr-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/tlr" FSC_OPTIMIZED
+ []
+ let ``letrec (mutrec variations part two) FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSC_OPTIMIZED
-[]
-let ``tlr-FSI`` () = singleTestBuildAndRun "core/tlr" FSI
+ []
+ let ``letrec (mutrec variations part two) FSI`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSI
-[]
-let ``subtype-FSC_DEBUG`` () = singleTestBuildAndRun "core/subtype" FSC_DEBUG
+ []
+ let ``printf`` () = singleTestBuildAndRunVersion "core/printf" FSC_OPTIMIZED LangVersion.Preview
-[]
-let ``subtype-FSC_OPTIMIZED`` () = singleTestBuildAndRun "core/subtype" FSC_OPTIMIZED
+ []
+ let ``printf-interpolated`` () = singleTestBuildAndRunVersion "core/printf-interpolated" FSC_OPTIMIZED LangVersion.Preview
-[]
-let ``subtype-FSI`` () = singleTestBuildAndRun "core/subtype" FSI
+ [