We'll have a lot more stuff that we need to compute from the actual interactions, so let's just get the boilerplate ready.
49 lines
1.7 KiB
FSharp
49 lines
1.7 KiB
FSharp
namespace NightLight.Core.Tests
|
|
|
|
open System
|
|
open FsCheck.Xunit
|
|
open FsCheck.FSharp
|
|
|
|
module InteractionsHelpers =
|
|
let getTimeAfter interactions =
|
|
interactions
|
|
|> Seq.choose (fun interaction ->
|
|
match interaction with
|
|
| TimeChanged time -> Some time
|
|
| _ -> None)
|
|
|> Seq.tryLast
|
|
|> function
|
|
| Some time -> time
|
|
| None -> failwith "Time wasn't changed"
|
|
|
|
let isDayAfter interactions =
|
|
let time = getTimeAfter interactions
|
|
|
|
time.TimeOfDay >= TimeSpan.FromHours 5.5
|
|
&& time.TimeOfDay < TimeSpan.FromHours 20.5
|
|
|
|
let isNightAfter = not << isDayAfter
|
|
|
|
[<Properties(Arbitrary = [| typeof<Arbitraries> |])>]
|
|
type NightLightTests() =
|
|
[<Property>]
|
|
let ``Brightness should always be under 255`` (now: DateTime) (interactions: Interaction list) =
|
|
let fakeHome = FakeHome now
|
|
fakeHome.Interact interactions
|
|
fakeHome.ForAllLightsThatAreOn(fun (_, brightness, _) -> brightness < 255uy)
|
|
|
|
[<Property>]
|
|
let ``Lights should be red during the night`` (now: DateTime) (interactions: Interaction list) =
|
|
let fakeHome = FakeHome now
|
|
fakeHome.Interact interactions
|
|
|
|
InteractionsHelpers.isNightAfter interactions
|
|
==> fakeHome.ForAllLightsThatAreOn(fun (_, _, color) -> color = Red)
|
|
|
|
[<Property>]
|
|
let ``Lights should be white or yellow during the day`` (now: DateTime) (interactions: Interaction list) =
|
|
let fakeHome = FakeHome now
|
|
fakeHome.Interact interactions
|
|
|
|
InteractionsHelpers.isDayAfter interactions
|
|
==> fakeHome.ForAllLightsThatAreOn(fun (_, _, color) -> color = White || color = Yellow)
|