100 lines
3.2 KiB
Elm
100 lines
3.2 KiB
Elm
module Test.Values.Timeline exposing (..)
|
|
|
|
import Expect
|
|
import Fuzz exposing (Fuzzer)
|
|
import Internal.Filter.Timeline as Filter exposing (Filter)
|
|
import Internal.Values.Timeline as Timeline exposing (Batch, Timeline)
|
|
import Json.Decode as D
|
|
import Json.Encode as E
|
|
import Test exposing (..)
|
|
import Test.Filter.Timeline as TestFilter
|
|
|
|
|
|
fuzzer : Fuzzer Timeline
|
|
fuzzer =
|
|
TestFilter.fuzzer
|
|
|> Fuzz.andThen
|
|
(\globalFilter ->
|
|
Fuzz.oneOf
|
|
[ Fuzz.map2
|
|
(\start batches ->
|
|
List.foldl
|
|
(\b ( s, f ) ->
|
|
( b.end
|
|
, f >> Timeline.addSync { b | start = Just s, filter = globalFilter }
|
|
)
|
|
)
|
|
( start, identity )
|
|
batches
|
|
|> Tuple.second
|
|
)
|
|
Fuzz.string
|
|
(Fuzz.listOfLengthBetween 0 10 fuzzerBatch)
|
|
, Fuzz.map2
|
|
(\start batches ->
|
|
List.foldl
|
|
(\b ( s, f ) ->
|
|
( b.end
|
|
, f >> Timeline.insert { b | start = Just s, filter = Filter.and globalFilter b.filter }
|
|
)
|
|
)
|
|
( start, identity )
|
|
batches
|
|
|> Tuple.second
|
|
)
|
|
Fuzz.string
|
|
(Fuzz.listOfLengthBetween 0 4 fuzzerBatch)
|
|
]
|
|
|> Fuzz.listOfLengthBetween 0 10
|
|
|> Fuzz.map (List.foldl (<|) Timeline.empty)
|
|
)
|
|
|
|
|
|
fuzzerBatch : Fuzzer Batch
|
|
fuzzerBatch =
|
|
Fuzz.map4 Batch
|
|
(Fuzz.list Fuzz.string)
|
|
TestFilter.fuzzer
|
|
(Fuzz.maybe Fuzz.string)
|
|
Fuzz.string
|
|
|
|
|
|
isEqual : Timeline -> Timeline -> Expect.Expectation
|
|
isEqual t1 t2 =
|
|
Expect.equal
|
|
(E.encode 0 <| Timeline.encode t1)
|
|
(E.encode 0 <| Timeline.encode t2)
|
|
|
|
|
|
suite : Test
|
|
suite =
|
|
describe "Timeline"
|
|
[ describe "empty"
|
|
[ fuzz fuzzerBatch
|
|
"singleton = empty + sync"
|
|
(\batch ->
|
|
isEqual
|
|
(Timeline.singleton batch)
|
|
(Timeline.addSync batch Timeline.empty)
|
|
)
|
|
]
|
|
, describe "JSON"
|
|
[ fuzz fuzzer
|
|
"encode -> decode is same"
|
|
(\timeline ->
|
|
timeline
|
|
|> Timeline.encode
|
|
|> E.encode 0
|
|
|> D.decodeString Timeline.decoder
|
|
|> (\t ->
|
|
case t of
|
|
Ok v ->
|
|
isEqual v timeline
|
|
|
|
Err e ->
|
|
Expect.fail (D.errorToString e)
|
|
)
|
|
)
|
|
]
|
|
]
|