mirror of
https://github.com/Smaug123/WoofWare.PawPrint
synced 2025-10-10 16:28:41 +00:00
Add test harness and run the first program (#5)
This commit is contained in:
64
WoofWare.PawPrint.Test/LoggerFactory.fs
Normal file
64
WoofWare.PawPrint.Test/LoggerFactory.fs
Normal file
@@ -0,0 +1,64 @@
|
||||
namespace WoofWare.PawPrint.Test
|
||||
|
||||
open System
|
||||
open Microsoft.Extensions.Logging
|
||||
|
||||
type LogLine =
|
||||
{
|
||||
Level : LogLevel
|
||||
LoggerName : string
|
||||
Message : string
|
||||
}
|
||||
|
||||
/// Very small, in-memory implementation of `ILoggerFactory` for unit tests.
|
||||
[<RequireQualifiedAccess>]
|
||||
module LoggerFactory =
|
||||
|
||||
/// Returns a pair: `(getLogs, loggerFactory)` where `getLogs ()` retrieves all
|
||||
/// log messages emitted so far, in chronological order.
|
||||
let makeTest () : (unit -> LogLine list) * ILoggerFactory =
|
||||
// Shared sink for all loggers created by the factory.
|
||||
let sink = ResizeArray ()
|
||||
|
||||
let createLogger (category : string) : ILogger =
|
||||
{ new ILogger with
|
||||
member _.BeginScope _state =
|
||||
{ new IDisposable with
|
||||
member _.Dispose () = ()
|
||||
}
|
||||
|
||||
member _.IsEnabled _logLevel = true
|
||||
|
||||
member _.Log (logLevel, eventId, state, ex, formatter) =
|
||||
let message =
|
||||
try
|
||||
formatter.Invoke (state, ex)
|
||||
with _ ->
|
||||
"<formatter threw>"
|
||||
|
||||
lock
|
||||
sink
|
||||
(fun () ->
|
||||
{
|
||||
Level = logLevel
|
||||
LoggerName = category
|
||||
Message = message
|
||||
}
|
||||
|> sink.Add
|
||||
)
|
||||
}
|
||||
|
||||
// Minimal `ILoggerFactory` that just hands out instances of the above.
|
||||
let factory =
|
||||
{ new ILoggerFactory with
|
||||
member _.CreateLogger categoryName = createLogger categoryName
|
||||
|
||||
member _.AddProvider _provider = ()
|
||||
|
||||
member _.Dispose () = ()
|
||||
}
|
||||
|
||||
// Expose accessor that snapshots the current sink contents.
|
||||
let getLogs () = lock sink (fun () -> List.ofSeq sink)
|
||||
|
||||
getLogs, factory
|
Reference in New Issue
Block a user