diff --git a/NightLight.Core.Tests/Arbitraries.fs b/NightLight.Core.Tests/Arbitraries.fs new file mode 100644 index 0000000..39433dc --- /dev/null +++ b/NightLight.Core.Tests/Arbitraries.fs @@ -0,0 +1,22 @@ +namespace NightLight.Core.Tests + +open System +open FsCheck.FSharp +open NightLight.Core.Models + +type Arbitraries = + static member Interaction() = + let genTimeChangedInteraction = + gen { + let! time = ArbMap.defaults |> ArbMap.generate + return Interaction.TimeChanged time + } + + let genHumanInteraction = + gen { + let! light = Gen.elements lights + let! humanInteraction = Gen.elements [ LightTurnedOn light; LightTurnedOff light ] + return Interaction.HumanInteraction humanInteraction + } + + Gen.oneof [ genTimeChangedInteraction; genHumanInteraction ] |> Arb.fromGen diff --git a/NightLight.Core.Tests/NightLight.Core.Tests.fsproj b/NightLight.Core.Tests/NightLight.Core.Tests.fsproj index 4979a7a..7a4c7eb 100644 --- a/NightLight.Core.Tests/NightLight.Core.Tests.fsproj +++ b/NightLight.Core.Tests/NightLight.Core.Tests.fsproj @@ -9,6 +9,8 @@ + + diff --git a/NightLight.Core.Tests/NightLightTests.fs b/NightLight.Core.Tests/NightLightTests.fs new file mode 100644 index 0000000..b7419fd --- /dev/null +++ b/NightLight.Core.Tests/NightLightTests.fs @@ -0,0 +1,20 @@ +module NightLight.Core.Tests.NightLightTests + +open FsCheck.Xunit + +let private assertIsOk (result: Result) : unit = + match result with + | Ok() -> () + | Error error -> failwith $"Expected Ok, got Error {error}" + +[ |])>] +let ``Brightness should always be under 255`` (fakeHome: FakeHome) (interactions: Interaction list) = + interactions + |> Seq.iter (fun interaction -> fakeHome.Interact interaction |> assertIsOk) + + fakeHome.LightStates + |> Seq.choose (fun (_, state) -> + match state with + | On brightness -> Some brightness + | Off -> None) + |> Seq.forall (fun brightness -> brightness < 255uy)