module TestDatabase exposing (..) import Card exposing (CardData, CardDetails, CardPerformanceData, CardType(..), ManaColor(..), ManaCost(..), Power(..)) import Database exposing (Database) import Expect import Fuzz exposing (Fuzzer) import Json.Decode as Decode import Json.Encode as Encode import Test exposing (Test, describe, fuzz) niceFloat : Fuzzer Float niceFloat = Fuzz.floatRange 0 100 fuzzDatabase : Fuzzer Database fuzzDatabase = Fuzz.listOfLengthBetween 1 2 fuzzCardData |> Fuzz.map Database.fromCardData fuzzCardData : Fuzzer CardData fuzzCardData = Fuzz.string |> Fuzz.andThen (\cardName -> Fuzz.constant CardData |> Fuzz.andMap (fuzzCardDetails cardName) |> Fuzz.andMap fuzzCardPerformance ) fuzzCardPerformance : Fuzzer CardPerformanceData fuzzCardPerformance = Fuzz.constant CardPerformanceData |> Fuzz.andMap Fuzz.int |> Fuzz.andMap Fuzz.int |> Fuzz.andMap (Fuzz.maybe niceFloat) |> Fuzz.andMap (Fuzz.maybe niceFloat) |> Fuzz.andMap (Fuzz.maybe (Fuzz.constant 0.5)) |> Fuzz.andMap (Fuzz.maybe niceFloat) fuzzCardDetails : String -> Fuzzer CardDetails fuzzCardDetails name = Fuzz.constant (CardDetails name) |> Fuzz.andMap Fuzz.int |> Fuzz.andMap (Fuzz.constant Creature) |> Fuzz.andMap (Fuzz.constant "Creature // Pirate") |> Fuzz.andMap (Fuzz.maybe Fuzz.string) |> Fuzz.andMap (Fuzz.maybe fuzzPower) |> Fuzz.andMap (Fuzz.maybe fuzzPower) |> Fuzz.andMap (Fuzz.list fuzzManaColor) |> Fuzz.andMap (Fuzz.constant "{X}{R}") |> Fuzz.andMap (Fuzz.constant (Just [ X, Color Red ])) |> Fuzz.andMap Fuzz.string fuzzCardType : Fuzzer CardType fuzzCardType = Fuzz.oneOfValues [ Creature , Instant , Sorcery , Enchantment , Artifact , Planeswalker , Land , Other ] fuzzPower : Fuzzer Power fuzzPower = Fuzz.oneOf [ Fuzz.constant VariablePower , Fuzz.intAtLeast 0 |> Fuzz.map ConstantPower , Fuzz.intAtLeast 0 |> Fuzz.map ConstantPlusVariablePower ] fuzzManaColor : Fuzzer ManaColor fuzzManaColor = Fuzz.oneOfValues [ Red , Green , Blue , White , Black , Colorless ] fuzzManaCost : Fuzzer ManaCost fuzzManaCost = Fuzz.oneOf [ Fuzz.constant X , Fuzz.constant Y , Fuzz.constant Tap , Fuzz.constant Pay , Fuzz.int |> Fuzz.map AnyColor , fuzzManaColor |> Fuzz.map Color , fuzzManaColor |> Fuzz.map ColorPay , fuzzManaColor |> Fuzz.map TwoOrColor , Fuzz.map2 Hybrid fuzzManaColor fuzzManaColor , Fuzz.map2 HybridPay fuzzManaColor fuzzManaColor ] suite : Test suite = describe "Database" [ fuzz fuzzDatabase "encoder / decoder round trip" <| \database -> let roundTrip = Database.encode ( "mkm", database ) |> Encode.encode 0 |> Decode.decodeString Database.decoder in Expect.equal roundTrip (Ok ( "mkm", Just database )) ]