night-light/NightLight.Core.Tests/NightLightStateMachine.fs
Sven van Heugten bd550bfcd9 Encapsulate State to make it impossible to read
This was NightLightStateMachine's purpose, but it fits equally well
in the actual production code.
2026-01-04 12:09:07 +01:00

34 lines
971 B
FSharp

namespace NightLight.Core.Tests
open System
open System.Collections.Generic
open FsToolkit.ErrorHandling
open NightLight.Core.Models
open NightLight.Core.Core
type NightLightStateMachine(now: DateTime) =
let mutable state = State now
let transmittedCommands = new List<Message>()
let assertIsOk (result: Result<unit, 'a>) : unit =
match result with
| Ok() -> ()
| Error error -> failwith $"Expected Ok, got Error {error}"
let sendEvent event =
result {
let! newState, commands = state.OnEventReceived event
state <- newState
transmittedCommands.AddRange commands
}
|> assertIsOk
member _.TransmittedCommands = transmittedCommands.AsReadOnly()
member _.SendMessage message =
ReceivedZigbeeEvent message |> sendEvent
member _.ChangeTime time = TimeChanged time |> sendEvent
member _.ClearTransmittedCommands() = transmittedCommands.Clear()