Compare commits

...

7 Commits

Author SHA1 Message Date
Patrick Stevens
eb4dfae8f4 Forbid generics (#55) 2024-06-10 12:18:33 +01:00
Patrick Stevens
78f51d127c Print path to TRX file (#54) 2024-06-10 12:16:16 +01:00
Patrick Stevens
3866823ccd Fix filter (#50) 2024-06-09 14:06:40 +01:00
Patrick Stevens
b600fab887 Fix treatment of optionals which are not in TestCaseData (#49) 2024-06-09 12:24:58 +01:00
Patrick Stevens
8dc23d5b38 Fix path to runtime (#48) 2024-06-09 12:19:29 +01:00
Patrick Stevens
fb9c041959 Continuous integration to true (#47) 2024-06-09 10:56:04 +01:00
Patrick Stevens
4ab66204c4 Cope with multiple TargetFrameworks (#46) 2024-06-09 10:03:48 +01:00
9 changed files with 88 additions and 20 deletions

View File

@@ -74,6 +74,7 @@ jobs:
run: 'nix develop --command dotnet exec ./TestRunner/bin/Release/net8.0/TestRunner.dll ./Consumer/bin/Release/net8.0/Consumer.dll --trx TrxOut/out.trx'
- name: Parse Trx files
uses: NasAmin/trx-parser@v0.6.0
if: always()
id: trx-parser
with:
TRX_PATH: ${{ github.workspace }}/TrxOut

View File

@@ -25,10 +25,15 @@ module TestCaseData =
let ``Consume test data from multiple sources`` (i : int, s : string, arr : float[]) =
lock multipleSources (fun () -> multipleSources.Add (i, s, arr))
let optional = [ Some "hi" ; None ] |> List.map TestCaseData
let optionalData = [ Some "hi" ; None ] |> List.map TestCaseData
[<TestCaseSource(nameof optional)>]
let ``Consume options`` (s : string option) : unit = s |> shouldEqual s
[<TestCaseSource(nameof optionalData)>]
let ``Consume options, TestCaseData`` (s : string option) : unit = s |> shouldEqual s
let optionalRaw = [ Some "hi" ; None ]
[<TestCaseSource(nameof optionalRaw)>]
let ``Consume options, raw`` (s : string option) : unit = s |> shouldEqual s
[<OneTimeTearDown>]
let tearDown () =

View File

@@ -12,4 +12,7 @@
<ItemGroup>
<PackageReference Include="Nerdbank.GitVersioning" Version="3.6.139" PrivateAssets="all"/>
</ItemGroup>
<PropertyGroup Condition="'$(GITHUB_ACTION)' != ''">
<ContinuousIntegrationBuild>true</ContinuousIntegrationBuild>
</PropertyGroup>
</Project>

View File

@@ -291,9 +291,10 @@ module Filter =
fun a b -> inner1 a b || inner2 a b
| Filter.Name (Match.Exact m) -> fun _fixture method -> method.Method.Name = m
| Filter.Name (Match.Contains m) -> fun _fixture method -> method.Method.Name.Contains m
| Filter.FullyQualifiedName (Match.Exact m) -> fun fixture method -> (fixture.Name + method.Method.Name) = m
| Filter.FullyQualifiedName (Match.Exact m) ->
fun _fixture method -> (method.Method.DeclaringType.FullName + "." + method.Method.Name) = m
| Filter.FullyQualifiedName (Match.Contains m) ->
fun fixture method -> (fixture.Name + method.Method.Name).Contains m
fun _fixture method -> (method.Method.DeclaringType.FullName + "." + method.Method.Name).Contains m
| Filter.TestCategory (Match.Contains m) ->
fun _fixture method -> method.Categories |> List.exists (fun cat -> cat.Contains m)
| Filter.TestCategory (Match.Exact m) -> fun _fixture method -> method.Categories |> List.contains m

View File

@@ -230,6 +230,27 @@ module TestFixture =
(test : SingleTestMethod)
: (Result<TestMemberSuccess, TestMemberFailure> * IndividualTestRunMetadata) list
=
if test.Method.ContainsGenericParameters then
let failureMetadata =
{
Total = TimeSpan.Zero
Start = DateTimeOffset.Now
End = DateTimeOffset.Now
ComputerName = Environment.MachineName
ExecutionId = Guid.NewGuid ()
TestId = Guid.NewGuid ()
TestName = test.Name
ClassName = test.Method.DeclaringType.FullName
StdErr = None
StdOut = None
}
let error =
TestMemberFailure.Malformed [ "Test contained generic parameters; generics are not supported." ]
(Error error, failureMetadata) |> List.singleton
else
let resultPreRun =
(None, test.Modifiers)
||> List.fold (fun _result modifier ->
@@ -332,6 +353,7 @@ module TestFixture =
yield
Guid.NewGuid (),
match arg with
| null -> [| (null : obj) |]
| :? Tuple<obj, obj> as (a, b) -> [| a ; b |]
| :? Tuple<obj, obj, obj> as (a, b, c) -> [| a ; b ; c |]
| :? Tuple<obj, obj, obj, obj> as (a, b, c, d) -> [| a ; b ; c ; d |]

View File

@@ -54,23 +54,57 @@ module Program =
|> Option.defaultValue RollForward.Minor
| s -> RollForward.Parse s
let desired = Version config.Framework.Version
let desiredVersions =
match config.Framework with
| Some f -> [ Version f.Version, f.Name ]
| None ->
match config.Frameworks with
| Some f -> f |> List.map (fun f -> Version f.Version, f.Name)
| None ->
failwith
"Could not deduce a framework version due to lack of either Framework or Frameworks in runtimeconfig"
let compatiblyNamedRuntimes =
f.Frameworks
|> Seq.collect (fun availableFramework ->
desiredVersions
|> List.choose (fun (desiredVersion, desiredName) ->
if desiredName = availableFramework.Name then
Some
{|
Desired = desiredVersion
Name = desiredName
Installed = availableFramework
InstalledVersion = Version availableFramework.Version
|}
else
None
)
)
|> Seq.toList
match rollForward with
| RollForward.Minor ->
let available =
f.Frameworks
|> Seq.choose (fun fi ->
if fi.Name = config.Framework.Name then
Some (fi, Version fi.Version)
else
None
compatiblyNamedRuntimes
|> Seq.filter (fun data ->
data.InstalledVersion.Major = data.Desired.Major
&& data.InstalledVersion.Minor >= data.Desired.Minor
)
|> Seq.filter (fun (_, version) -> version.Major = desired.Major && version.Minor >= desired.Minor)
|> Seq.tryMinBy (fun (_, version) -> version.Minor, version.Build)
|> Seq.groupBy (fun data -> data.Name)
|> Seq.map (fun (name, data) ->
let data =
data
|> Seq.minBy (fun data -> data.InstalledVersion.Minor, data.InstalledVersion.Build)
name, data.Installed
)
// TODO: how do we select between many available frameworks?
|> Seq.tryHead
match available with
| Some (f, _) -> Some (Choice1Of2 f)
| Some (_, f) -> Some (Choice1Of2 f)
| None ->
// TODO: maybe we can ask the SDK. But we keep on trucking: maybe we're self-contained,
// and we'll actually find all the runtime next to the DLL.
@@ -99,7 +133,7 @@ module Program =
| None ->
// Keep on trucking: let's be optimistic and hope that we're self-contained.
[ dll.Directory ]
| Some (Choice1Of2 runtime) -> [ dll.Directory ; DirectoryInfo runtime.Path ]
| Some (Choice1Of2 runtime) -> [ dll.Directory ; DirectoryInfo $"%s{runtime.Path}/%s{runtime.Version}" ]
| Some (Choice2Of2 sdk) -> [ dll.Directory ; DirectoryInfo sdk.Path ]
let main argv =
@@ -367,6 +401,7 @@ module Program =
let contents = TrxReport.toXml report |> fun d -> d.OuterXml
trxPath.Directory.Create ()
File.WriteAllText (trxPath.FullName, contents)
Console.Error.WriteLine $"Written TRX file: %s{trxPath.FullName}"
| None -> ()
match outcome with

View File

@@ -14,7 +14,8 @@ type FrameworkDescription =
type RuntimeOptions =
{
Tfm : string
Framework : FrameworkDescription
Framework : FrameworkDescription option
Frameworks : FrameworkDescription list option
RollForward : string option
}

View File

@@ -39,7 +39,7 @@
<ItemGroup>
<PackageReference Include="Spectre.Console" Version="0.49.1" />
<PackageReference Include="WoofWare.DotnetRuntimeLocator" Version="0.1.2" />
<PackageReference Include="WoofWare.DotnetRuntimeLocator" Version="0.1.3" />
<PackageReference Include="WoofWare.Myriad.Plugins.Attributes" Version="3.1.4" />
<PackageReference Include="Myriad.SDK" Version="0.8.3" />
<PackageReference Include="WoofWare.Myriad.Plugins" Version="$(WoofWareMyriadPluginVersion)" PrivateAssets="all" />

View File

@@ -183,8 +183,8 @@
})
(fetchNuGet {
pname = "WoofWare.DotnetRuntimeLocator";
version = "0.1.2";
sha256 = "0kwkq28ddzc0bpr22jmgcl8dhnhg776gf6l054rsxw8lrvpwhmv9";
version = "0.1.3";
sha256 = "0qw41mcvx4qy012pj1dlpdfwsz036qrx7xnzsirk5fz715f1a45m";
})
(fetchNuGet {
pname = "WoofWare.Myriad.Plugins";