Compare commits

...

14 Commits

Author SHA1 Message Date
dependabot[bot]
ba46b1edb6 Bump Spectre.Console from 0.50.0 to 0.51.1 (#293)
* Bump Spectre.Console from 0.50.0 to 0.51.1

---
updated-dependencies:
- dependency-name: Spectre.Console
  dependency-version: 0.51.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Deps

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Smaug123 <3138005+Smaug123@users.noreply.github.com>
2025-09-08 17:41:56 +00:00
patrick-conscriptus[bot]
72674e1711 Automated commit (#292)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-09-07 00:46:50 +00:00
dependabot[bot]
c4b862bdd8 Bump actions/attest-build-provenance from 2.4.0 to 3.0.0 (#291) 2025-09-02 07:29:12 +01:00
patrick-conscriptus[bot]
4c629b1d64 Automated commit (#290)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-08-31 00:47:27 +00:00
dependabot[bot]
e67820c56d Bump FsCheck from 3.3.0 to 3.3.1 (#289)
* Bump FsCheck from 3.3.0 to 3.3.1

---
updated-dependencies:
- dependency-name: FsCheck
  dependency-version: 3.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Deps

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Smaug123 <3138005+Smaug123@users.noreply.github.com>
2025-08-27 08:59:47 +00:00
patrick-conscriptus[bot]
31bff4cb03 Automated commit (#288)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-08-24 00:50:07 +00:00
patrick-conscriptus[bot]
d081cfaafb Automated commit (#287)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-08-17 00:52:15 +00:00
dependabot[bot]
c237df3885 Bump actions/checkout from 4 to 5 (#286) 2025-08-12 07:31:15 +01:00
dependabot[bot]
3b9b9eb4c8 Bump actions/download-artifact from 4 to 5 (#285) 2025-08-11 23:30:06 +01:00
patrick-conscriptus[bot]
12e3fc0e4f Automated commit (#284)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-08-10 00:55:19 +00:00
dependabot[bot]
208b809096 Bump fsharp-analyzers from 0.32.0 to 0.32.1 (#282)
* Bump fsharp-analyzers from 0.32.0 to 0.32.1

---
updated-dependencies:
- dependency-name: fsharp-analyzers
  dependency-version: 0.32.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* Deps

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Smaug123 <3138005+Smaug123@users.noreply.github.com>
2025-08-05 19:07:01 +00:00
dependabot[bot]
b4e5baddcf Bump NasAmin/trx-parser from 0.6.0 to 0.7.0 (#283)
* Bump NasAmin/trx-parser from 0.6.0 to 0.7.0

Bumps [NasAmin/trx-parser](https://github.com/nasamin/trx-parser) from 0.6.0 to 0.7.0.
- [Release notes](https://github.com/nasamin/trx-parser/releases)
- [Changelog](https://github.com/NasAmin/trx-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nasamin/trx-parser/compare/v0.6.0...v0.7.0)

---
updated-dependencies:
- dependency-name: NasAmin/trx-parser
  dependency-version: 0.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* Don't run external dependency on main

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Smaug123 <3138005+Smaug123@users.noreply.github.com>
2025-08-05 19:59:56 +01:00
patrick-conscriptus[bot]
5597b3f2f8 Automated commit (#281)
Co-authored-by: patrick-conscriptus[bot] <175414948+patrick-conscriptus[bot]@users.noreply.github.com>
2025-08-03 00:57:08 +00:00
Patrick Stevens
fcfdcef6cf Async tests (#280) 2025-07-29 23:07:12 +00:00
10 changed files with 213 additions and 124 deletions

View File

@@ -9,7 +9,7 @@
] ]
}, },
"fsharp-analyzers": { "fsharp-analyzers": {
"version": "0.32.0", "version": "0.32.1",
"commands": [ "commands": [
"fsharp-analyzers" "fsharp-analyzers"
] ]

View File

@@ -25,7 +25,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
with: with:
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
- name: Install Nix - name: Install Nix
@@ -44,7 +44,7 @@ jobs:
selftest-intended-failures: selftest-intended-failures:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
with: with:
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
- name: Install Nix - name: Install Nix
@@ -81,7 +81,7 @@ jobs:
statuses: read statuses: read
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
with: with:
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
- name: Install Nix - name: Install Nix
@@ -96,8 +96,8 @@ jobs:
- name: Test using self - name: Test using self
run: 'nix develop --command dotnet exec ./WoofWare.NUnitTestRunner/bin/Release/net6.0/WoofWare.NUnitTestRunner.dll ./Consumer/bin/Release/net8.0/Consumer.dll --trx TrxOut/out.trx' run: 'nix develop --command dotnet exec ./WoofWare.NUnitTestRunner/bin/Release/net6.0/WoofWare.NUnitTestRunner.dll ./Consumer/bin/Release/net8.0/Consumer.dll --trx TrxOut/out.trx'
- name: Parse Trx files - name: Parse Trx files
uses: NasAmin/trx-parser@v0.6.0 uses: NasAmin/trx-parser@v0.7.0
if: always() if: always() && github.ref_name != 'main'
id: trx-parser id: trx-parser
with: with:
TRX_PATH: ${{ github.workspace }}/TrxOut TRX_PATH: ${{ github.workspace }}/TrxOut
@@ -109,7 +109,7 @@ jobs:
security-events: write security-events: write
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
- name: Install Nix - name: Install Nix
@@ -128,7 +128,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install Nix - name: Install Nix
uses: cachix/install-nix-action@v31 uses: cachix/install-nix-action@v31
with: with:
@@ -143,7 +143,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install Nix - name: Install Nix
uses: cachix/install-nix-action@v31 uses: cachix/install-nix-action@v31
with: with:
@@ -156,7 +156,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install Nix - name: Install Nix
uses: cachix/install-nix-action@v31 uses: cachix/install-nix-action@v31
with: with:
@@ -194,7 +194,7 @@ jobs:
nuget-pack: nuget-pack:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
with: with:
fetch-depth: 0 # so that NerdBank.GitVersioning has access to history fetch-depth: 0 # so that NerdBank.GitVersioning has access to history
- name: Install Nix - name: Install Nix
@@ -224,7 +224,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Download NuGet artifact (lib) - name: Download NuGet artifact (lib)
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: nuget-package-lib name: nuget-package-lib
path: packed-lib path: packed-lib
@@ -232,7 +232,7 @@ jobs:
# Verify that there is exactly one nupkg in the artifact that would be NuGet published # Verify that there is exactly one nupkg in the artifact that would be NuGet published
run: if [[ $(find packed-lib -maxdepth 1 -name 'WoofWare.NUnitTestRunner.Lib.*.nupkg' -printf c | wc -c) -ne "1" ]]; then exit 1; fi run: if [[ $(find packed-lib -maxdepth 1 -name 'WoofWare.NUnitTestRunner.Lib.*.nupkg' -printf c | wc -c) -ne "1" ]]; then exit 1; fi
- name: Download NuGet artifact (tool) - name: Download NuGet artifact (tool)
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: nuget-package-tool name: nuget-package-tool
path: packed-tool path: packed-tool
@@ -259,12 +259,12 @@ jobs:
contents: read contents: read
steps: steps:
- name: Download NuGet artifact - name: Download NuGet artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: nuget-package-lib name: nuget-package-lib
path: packed path: packed
- name: Attest Build Provenance - name: Attest Build Provenance
uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0 uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
with: with:
subject-path: "packed/*.nupkg" subject-path: "packed/*.nupkg"
@@ -278,12 +278,12 @@ jobs:
contents: read contents: read
steps: steps:
- name: Download NuGet artifact - name: Download NuGet artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: nuget-package-tool name: nuget-package-tool
path: packed path: packed
- name: Attest Build Provenance - name: Attest Build Provenance
uses: actions/attest-build-provenance@e8998f949152b193b063cb0ec769d69d929409be # v2.4.0 uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0
with: with:
subject-path: "packed/*.nupkg" subject-path: "packed/*.nupkg"
@@ -297,14 +297,14 @@ jobs:
attestations: write attestations: write
contents: read contents: read
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Install Nix - name: Install Nix
uses: cachix/install-nix-action@v31 uses: cachix/install-nix-action@v31
with: with:
extra_nix_config: | extra_nix_config: |
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
- name: Download NuGet artifact - name: Download NuGet artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: nuget-package-lib name: nuget-package-lib
path: packed path: packed
@@ -329,14 +329,14 @@ jobs:
attestations: write attestations: write
contents: read contents: read
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Install Nix - name: Install Nix
uses: cachix/install-nix-action@v31 uses: cachix/install-nix-action@v31
with: with:
extra_nix_config: | extra_nix_config: |
access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} access-tokens = github.com=${{ secrets.GITHUB_TOKEN }}
- name: Download NuGet artifact - name: Download NuGet artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: nuget-package-tool name: nuget-package-tool
path: packed path: packed
@@ -360,9 +360,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [nuget-pack] needs: [nuget-pack]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Download NuGet artifact (tool) - name: Download NuGet artifact (tool)
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: ${{ matrix.artifact }} name: ${{ matrix.artifact }}
- name: Compute package path - name: Compute package path
@@ -396,9 +396,9 @@ jobs:
permissions: permissions:
contents: write contents: write
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v5
- name: Download NuGet artifact (tool) - name: Download NuGet artifact (tool)
uses: actions/download-artifact@v4 uses: actions/download-artifact@v5
with: with:
name: ${{ matrix.artifact }} name: ${{ matrix.artifact }}
- name: Compute package path - name: Compute package path

View File

@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out repository - name: Check out repository
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install Nix - name: Install Nix
uses: DeterminateSystems/nix-installer-action@main uses: DeterminateSystems/nix-installer-action@main

View File

@@ -10,6 +10,7 @@
<Compile Include="NoAttribute.fs" /> <Compile Include="NoAttribute.fs" />
<Compile Include="Inconclusive.fs" /> <Compile Include="Inconclusive.fs" />
<Compile Include="RunSubProcess.fs" /> <Compile Include="RunSubProcess.fs" />
<Compile Include="TestAsync.fs" />
<Compile Include="TestExplicit.fs" /> <Compile Include="TestExplicit.fs" />
<Compile Include="TestNonParallel.fs" /> <Compile Include="TestNonParallel.fs" />
<Compile Include="TestParallel.fs" /> <Compile Include="TestParallel.fs" />

23
Consumer/TestAsync.fs Normal file
View File

@@ -0,0 +1,23 @@
namespace Consumer
open System
open System.Threading.Tasks
open FsUnitTyped
open NUnit.Framework
[<TestFixture>]
module TestAsync =
[<Test>]
let ``an async test`` () =
async {
do! Async.Sleep (TimeSpan.FromMilliseconds 20.0)
1 |> shouldEqual 1
}
[<Test>]
let ``an async test, task-based`` () =
task {
do! Task.Delay (TimeSpan.FromMilliseconds 20.0)
1 |> shouldEqual 1
}

View File

@@ -76,105 +76,168 @@ module TestFixture =
(test : MethodInfo) (test : MethodInfo)
(containingObject : obj) (containingObject : obj)
(args : obj[]) (args : obj[])
: Result<TestMemberSuccess, TestFailure list> * IndividualTestRunMetadata : Async<Result<TestMemberSuccess, TestFailure list> * IndividualTestRunMetadata>
= =
let rec runMethods let rec runMethods
(wrap : UserMethodFailure -> TestFailure) (wrap : UserMethodFailure -> TestFailure)
(toRun : MethodInfo list) (toRun : MethodInfo list)
(args : obj[]) (args : obj[])
: Result<unit, _> : Result<unit, TestFailure> Async
= =
match toRun with match toRun with
| [] -> Ok () | [] -> async.Return (Ok ())
| head :: rest -> | head :: rest ->
let result = async {
try let result =
head.Invoke (containingObject, args) |> Ok try
with head.Invoke (containingObject, args) |> Ok
| :? TargetInvocationException as e -> Error (UserMethodFailure.Threw (head.Name, e.InnerException)) with
| :? TargetParameterCountException -> | :? TargetInvocationException as e ->
UserMethodFailure.BadParameters ( Error (UserMethodFailure.Threw (head.Name, e.InnerException))
head.Name, | :? TargetParameterCountException ->
head.GetParameters () |> Array.map (fun pm -> pm.ParameterType), UserMethodFailure.BadParameters (
args head.Name,
) head.GetParameters () |> Array.map (fun pm -> pm.ParameterType),
|> Error args
)
|> Error
match result with let! ct = Async.CancellationToken
| Error e -> Error (wrap e)
| Ok result ->
match result with
| :? unit -> runMethods wrap rest args
| ret -> UserMethodFailure.ReturnedNonUnit (head.Name, ret) |> wrap |> Error
let start = DateTimeOffset.Now let! result =
match result with
| Error e -> async.Return (Error (wrap e))
| Ok result ->
match result with
| :? unit -> runMethods wrap rest args
| :? Task as result ->
async {
let mutable exc = None
let sw = Stopwatch.StartNew () try
do! Async.AwaitTask result
with e ->
exc <- Some e
let metadata () = match exc with
let name = | None -> return! runMethods wrap rest args
if args.Length = 0 then | Some e -> return Error (UserMethodFailure.Threw (head.Name, e) |> wrap)
test.Name }
else // We'd like to do this type-test:
let argsStr = args |> Seq.map string<obj> |> String.concat "," // | :? Async<unit> as result ->
$"%s{test.Name}(%s{argsStr})" // but instead we have to do all this reflective nonsense, because FSharpAsync is not part
// of the .NET runtime, so is instead in a different AssemblyLoadContext to us!
// It's in the user-code context, not ours.
| ret ->
let ty = ret.GetType ()
{ if ty.Namespace = "Microsoft.FSharp.Control" && ty.Name = "FSharpAsync`1" then
End = DateTimeOffset.Now match ty.GenericTypeArguments |> Array.map (fun t -> t.FullName) with
Start = start | [| "Microsoft.FSharp.Core.Unit" |] ->
Total = sw.Elapsed let asyncModule = ty.Assembly.GetType ("Microsoft.FSharp.Control.FSharpAsync")
ComputerName = Environment.MachineName // let catch = asyncModule.GetMethod("Catch").MakeGenericMethod [| ty.GenericTypeArguments.[0] |]
ExecutionId = Guid.NewGuid () // let caught = catch.Invoke ((null: obj), [| ret |])
TestId = testId let startAsTask =
TestName = name asyncModule.GetMethod("StartAsTask").MakeGenericMethod
ClassName = test.DeclaringType.FullName [| ty.GenericTypeArguments.[0] |]
StdOut =
match contexts.DumpStdout outputId with
| "" -> None
| v -> Some v
StdErr =
match contexts.DumpStderr outputId with
| "" -> None
| v -> Some v
}
let setUpResult = runMethods TestFailure.SetUpFailed setUp [||] let started =
sw.Stop () startAsTask.Invoke ((null : obj), [| ret ; (null : obj) ; (null : obj) |])
|> unbox<Task>
match setUpResult with async {
| Error e -> Error [ e ], metadata () let! res = Async.AwaitTask started |> Async.Catch
| Ok () ->
sw.Start () match res with
| Choice1Of2 () -> return! runMethods wrap rest args
| Choice2Of2 e ->
return
Error (
UserMethodFailure.Threw (head.Name, started.Exception) |> wrap
)
}
| _ ->
UserMethodFailure.ReturnedNonUnit (head.Name, ret)
|> wrap
|> Error
|> async.Return
else
async.Return (UserMethodFailure.ReturnedNonUnit (head.Name, ret) |> wrap |> Error)
let result = return result
let result = runMethods TestFailure.TestFailed [ test ] args }
async {
let start = DateTimeOffset.Now
let sw = Stopwatch.StartNew ()
let metadata () =
let name =
if args.Length = 0 then
test.Name
else
let argsStr = args |> Seq.map string<obj> |> String.concat ","
$"%s{test.Name}(%s{argsStr})"
{
End = DateTimeOffset.Now
Start = start
Total = sw.Elapsed
ComputerName = Environment.MachineName
ExecutionId = Guid.NewGuid ()
TestId = testId
TestName = name
ClassName = test.DeclaringType.FullName
StdOut =
match contexts.DumpStdout outputId with
| "" -> None
| v -> Some v
StdErr =
match contexts.DumpStderr outputId with
| "" -> None
| v -> Some v
}
let! setUpResult = runMethods TestFailure.SetUpFailed setUp [||]
sw.Stop () sw.Stop ()
match result with match setUpResult with
| Ok () -> Ok None | Error e -> return Error [ e ], metadata ()
| Error (TestFailure.TestFailed (UserMethodFailure.Threw (_, exc)) as orig) -> | Ok () ->
match exc.GetType().FullName with
| "NUnit.Framework.SuccessException" -> Ok None
| "NUnit.Framework.IgnoreException" -> Ok (Some (TestMemberSuccess.Ignored (Option.ofObj exc.Message)))
| "NUnit.Framework.InconclusiveException" ->
Ok (Some (TestMemberSuccess.Inconclusive (Option.ofObj exc.Message)))
| _ -> Error orig
| Error orig -> Error orig
// Unconditionally run TearDown after tests, even if tests failed. sw.Start ()
sw.Start () let! result = runMethods TestFailure.TestFailed [ test ] args
let tearDownResult = runMethods TestFailure.TearDownFailed tearDown [||] sw.Stop ()
sw.Stop ()
let metadata = metadata () let result =
match result with
| Ok () -> Ok None
| Error (TestFailure.TestFailed (UserMethodFailure.Threw (_, exc)) as orig) ->
match exc.GetType().FullName with
| "NUnit.Framework.SuccessException" -> Ok None
| "NUnit.Framework.IgnoreException" ->
Ok (Some (TestMemberSuccess.Ignored (Option.ofObj exc.Message)))
| "NUnit.Framework.InconclusiveException" ->
Ok (Some (TestMemberSuccess.Inconclusive (Option.ofObj exc.Message)))
| _ -> Error orig
| Error orig -> Error orig
match result, tearDownResult with // Unconditionally run TearDown after tests, even if tests failed.
| Ok None, Ok () -> Ok TestMemberSuccess.Ok, metadata sw.Start ()
| Ok (Some s), Ok () -> Ok s, metadata let! tearDownResult = runMethods TestFailure.TearDownFailed tearDown [||]
| Error e, Ok () sw.Stop ()
| Ok _, Error e -> Error [ e ], metadata
| Error e1, Error e2 -> Error [ e1 ; e2 ], metadata let metadata = metadata ()
return
match result, tearDownResult with
| Ok None, Ok () -> Ok TestMemberSuccess.Ok, metadata
| Ok (Some s), Ok () -> Ok s, metadata
| Error e, Ok ()
| Ok _, Error e -> Error [ e ], metadata
| Error e1, Error e2 -> Error [ e1 ; e2 ], metadata
}
let private getValues (test : SingleTestMethod) = let private getValues (test : SingleTestMethod) =
let valuesAttrs = let valuesAttrs =
@@ -395,20 +458,22 @@ module TestFixture =
|> Seq.map (fun (testGuid, args) -> |> Seq.map (fun (testGuid, args) ->
task { task {
let runMe () = let runMe () =
progress.OnTestMemberStart test.Name async {
let oldValue = contexts.AsyncLocal.Value progress.OnTestMemberStart test.Name
let outputId = contexts.NewOutputs () let oldValue = contexts.AsyncLocal.Value
contexts.AsyncLocal.Value <- outputId let outputId = contexts.NewOutputs ()
contexts.AsyncLocal.Value <- outputId
let result, meta = let! result, meta =
runOne outputId contexts setUp tearDown testGuid test.Method containingObject args runOne outputId contexts setUp tearDown testGuid test.Method containingObject args
contexts.AsyncLocal.Value <- oldValue contexts.AsyncLocal.Value <- oldValue
progress.OnTestMemberFinished test.Name progress.OnTestMemberFinished test.Name
result, meta return result, meta
}
let! results, summary = par.Run running test.Parallelize runMe let! results, summary = par.RunAsync running test.Parallelize runMe
match results with match results with
| Ok results -> return Ok results, summary | Ok results -> return Ok results, summary

View File

@@ -18,7 +18,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="ApiSurface" Version="4.1.22" /> <PackageReference Include="ApiSurface" Version="4.1.22" />
<PackageReference Include="FsCheck" Version="3.3.0" /> <PackageReference Include="FsCheck" Version="3.3.1" />
<PackageReference Include="FsUnit" Version="7.1.1" /> <PackageReference Include="FsUnit" Version="7.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="NUnit" Version="4.3.2" /> <PackageReference Include="NUnit" Version="4.3.2" />

View File

@@ -35,7 +35,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Spectre.Console" Version="0.50.0" /> <PackageReference Include="Spectre.Console" Version="0.51.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

6
flake.lock generated
View File

@@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1753432016, "lastModified": 1756911493,
"narHash": "sha256-cnL5WWn/xkZoyH/03NNUS7QgW5vI7D1i74g48qplCvg=", "narHash": "sha256-6n/n1GZQ/vi+LhFXMSyoseKdNfc2QQaSBXJdgamrbkE=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "6027c30c8e9810896b92429f0092f624f7b1aace", "rev": "c6a788f552b7b7af703b1a29802a7233c0067908",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -21,13 +21,13 @@
}, },
{ {
"pname": "FsCheck", "pname": "FsCheck",
"version": "3.3.0", "version": "3.3.1",
"hash": "sha256-TFDR/uAGv4OqrMX8/reQ4faaAhH9hxTHr1T/YkNPCCU=" "hash": "sha256-k65ksdOSOGz+meRUUND+yuqJtm5ChaKuaxmRIdKzx2Y="
}, },
{ {
"pname": "fsharp-analyzers", "pname": "fsharp-analyzers",
"version": "0.32.0", "version": "0.32.1",
"hash": "sha256-MnhsK5tOeexL6uQhsV4nTRz8CGbz2o8VyHwAK8x91pE=" "hash": "sha256-le6rPnAF7cKGBZ2w8H2u9glK+6rT2ZjiAVnrkH2IhrM="
}, },
{ {
"pname": "FSharp.Core", "pname": "FSharp.Core",
@@ -261,8 +261,8 @@
}, },
{ {
"pname": "Spectre.Console", "pname": "Spectre.Console",
"version": "0.50.0", "version": "0.51.1",
"hash": "sha256-3MNgumQSXzuXVGj7kLb5FMkTH/LoFohMvUjAZ7nyHfo=" "hash": "sha256-FQAK07dEwEsNYVI1T3S488LHv8AXJ+ZeA9N2hPpWBoo="
}, },
{ {
"pname": "System.Collections.Immutable", "pname": "System.Collections.Immutable",