11namespace YoloDev.Expecto.TestSdk
22
3- open Expecto.Impl
43open Expecto.Tests
5- open System.IO
64open System.Threading
75open System.Diagnostics
6+ open Microsoft.Testing .Extensions .VSTestBridge
7+ open Microsoft.Testing .Extensions .VSTestBridge .Requests
88open Microsoft.VisualStudio .TestPlatform .ObjectModel
99open Microsoft.VisualStudio .TestPlatform .ObjectModel .Adapter
10- open Microsoft.VisualStudio .TestPlatform .ObjectModel .Logging
10+ open System.Threading .Tasks
11+ open System.Reflection
1112
1213[<FileExtension( " .dll" ) >]
1314[<FileExtension( " .exe" ) >]
@@ -34,24 +35,17 @@ type VsTestAdapter() =
3435
3536 interface System.IDisposable with
3637 member x.Dispose () =
37- match cts with
38- | null -> ()
39- | s -> s.Dispose()
38+ cts.Dispose()
4039
4140 interface ITestDiscoverer with
4241 member x.DiscoverTests ( sources , discoveryContext , logger , discoverySink ) =
4342 x.Breakpoint()
4443
45- let sources = Guard.argNotNull " sources" sources
46- let logger = Guard.argNotNull " logger" logger
47- let discoverySink = Guard.argNotNull " discoverySink" discoverySink
48-
4944 let stopwatch = Stopwatch.StartNew()
5045 let logger = Logger( logger, stopwatch)
5146
5247 let runSettings =
53- Option.ofObj discoveryContext
54- |> Option.bind ( fun c -> Option.ofObj c.RunSettings)
48+ Option.ofObj discoveryContext.RunSettings
5549 |> Option.map ( RunSettings.read logger)
5650 |> Option.defaultValue RunSettings.defaultSettings
5751
@@ -62,7 +56,7 @@ type VsTestAdapter() =
6256 interface ITestExecutor with
6357 member x.Cancel () = cts.Cancel()
6458
65- member x.RunTests ( tests : TestCase seq , runContext : IRunContext , frameworkHandle : IFrameworkHandle ) : unit =
59+ member x.RunTests ( tests : TestCase seq , runContext : IRunContext | null , frameworkHandle : IFrameworkHandle | null ) : unit =
6660 x.Breakpoint()
6761 let tests = Guard.argNotNull " tests" tests
6862 let runContext = Guard.argNotNull " runContext" runContext
@@ -80,7 +74,7 @@ type VsTestAdapter() =
8074 Execution.runSpecifiedTests logger runSettings frameworkHandle tests
8175 |> Async.RunSynchronously
8276
83- member x.RunTests ( sources : string seq , runContext : IRunContext , frameworkHandle : IFrameworkHandle ) : unit =
77+ member x.RunTests ( sources : string seq , runContext : IRunContext | null , frameworkHandle : IFrameworkHandle | null ) : unit =
8478 x.Breakpoint()
8579 let sources = Guard.argNotNull " sources" sources
8680 let runContext = Guard.argNotNull " runContext" runContext
@@ -102,3 +96,37 @@ type VsTestAdapter() =
10296
10397 Execution.runTests logger runSettings frameworkHandle sources
10498 |> Async.RunSynchronously
99+
100+ /// Defines the identity of the Expecto extension for Microsoft.Testing.Platform.
101+ type ExpectoExtension () =
102+ interface Microsoft.Testing.Platform.Extensions.IExtension with
103+ member _.Uid = nameof( ExpectoExtension)
104+ member _.Version =
105+ match Assembly.GetExecutingAssembly() .GetCustomAttribute< AssemblyInformationalVersionAttribute>() with
106+ | null -> " 0.0.0"
107+ | x -> x.InformationalVersion
108+ member _.DisplayName = " Expecto"
109+ member _.Description = " Expecto test adapter for Microsoft Testing Platform"
110+ member _.IsEnabledAsync () = System.Threading.Tasks.Task.FromResult true
111+
112+ /// Defines the ITestFramework extension of Microsoft.Testing.Platform for Expecto using the VSTest bridge.
113+ type ExpectoTestFramework ( extension , getTestAssemblies , serviceProvider , capabilities ) =
114+ inherit SynchronizedSingleSessionVSTestBridgedTestFramework( extension, getTestAssemblies, serviceProvider, capabilities) with
115+
116+ let vstestAdapter = new VsTestAdapter()
117+
118+ let discoverTests ( request : VSTestDiscoverTestExecutionRequest ) =
119+ let discoverer = vstestAdapter :> ITestDiscoverer
120+ discoverer.DiscoverTests( request.AssemblyPaths, request.DiscoveryContext, request.MessageLogger, request.DiscoverySink)
121+ Task.CompletedTask
122+
123+ let runTests ( request : VSTestRunTestExecutionRequest ) ( token : CancellationToken ) =
124+ let runner = vstestAdapter :> ITestExecutor
125+ use _ = token.Register ( fun _ -> runner.Cancel())
126+ match request.VSTestFilter.TestCases |> Option.ofNullable with
127+ | Some testCases -> runner.RunTests( testCases, request.RunContext, request.FrameworkHandle)
128+ | None -> runner.RunTests( request.AssemblyPaths, request.RunContext, request.FrameworkHandle)
129+ Task.CompletedTask
130+
131+ override _.SynchronizedDiscoverTestsAsync ( request , _ , _ ) = discoverTests request
132+ override _.SynchronizedRunTestsAsync ( request , _ , token ) = runTests request token
0 commit comments