TestDatabase.elm 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. module TestDatabase exposing (..)
  2. import Card exposing (CardData, CardDetails, CardPerformanceData, CardType(..), ManaColor(..), ManaCost(..), Power(..))
  3. import Database exposing (Database)
  4. import Expect
  5. import Fuzz exposing (Fuzzer)
  6. import Json.Decode as Decode
  7. import Json.Encode as Encode
  8. import Test exposing (Test, describe, fuzz)
  9. niceFloat : Fuzzer Float
  10. niceFloat =
  11. Fuzz.floatRange 0 100
  12. fuzzDatabase : Fuzzer Database
  13. fuzzDatabase =
  14. Fuzz.listOfLengthBetween 1 2 fuzzCardData
  15. |> Fuzz.map Database.fromCardData
  16. fuzzCardData : Fuzzer CardData
  17. fuzzCardData =
  18. Fuzz.string
  19. |> Fuzz.andThen
  20. (\cardName ->
  21. Fuzz.constant CardData
  22. |> Fuzz.andMap (fuzzCardDetails cardName)
  23. |> Fuzz.andMap fuzzCardPerformance
  24. )
  25. fuzzCardPerformance : Fuzzer CardPerformanceData
  26. fuzzCardPerformance =
  27. Fuzz.constant CardPerformanceData
  28. |> Fuzz.andMap Fuzz.int
  29. |> Fuzz.andMap Fuzz.int
  30. |> Fuzz.andMap (Fuzz.maybe niceFloat)
  31. |> Fuzz.andMap (Fuzz.maybe niceFloat)
  32. |> Fuzz.andMap (Fuzz.maybe (Fuzz.constant 0.5))
  33. |> Fuzz.andMap (Fuzz.maybe niceFloat)
  34. fuzzCardDetails : String -> Fuzzer CardDetails
  35. fuzzCardDetails name =
  36. Fuzz.constant (CardDetails name)
  37. |> Fuzz.andMap Fuzz.int
  38. |> Fuzz.andMap (Fuzz.constant Creature)
  39. |> Fuzz.andMap (Fuzz.constant "Creature // Pirate")
  40. |> Fuzz.andMap (Fuzz.maybe Fuzz.string)
  41. |> Fuzz.andMap (Fuzz.maybe fuzzPower)
  42. |> Fuzz.andMap (Fuzz.maybe fuzzPower)
  43. |> Fuzz.andMap (Fuzz.list fuzzManaColor)
  44. |> Fuzz.andMap (Fuzz.constant "{X}{R}")
  45. |> Fuzz.andMap (Fuzz.constant (Just [ X, Color Red ]))
  46. |> Fuzz.andMap Fuzz.string
  47. fuzzCardType : Fuzzer CardType
  48. fuzzCardType =
  49. Fuzz.oneOfValues
  50. [ Creature
  51. , Instant
  52. , Sorcery
  53. , Enchantment
  54. , Artifact
  55. , Planeswalker
  56. , Land
  57. , Other
  58. ]
  59. fuzzPower : Fuzzer Power
  60. fuzzPower =
  61. Fuzz.oneOf
  62. [ Fuzz.constant VariablePower
  63. , Fuzz.int |> Fuzz.map ConstantPower
  64. ]
  65. fuzzManaColor : Fuzzer ManaColor
  66. fuzzManaColor =
  67. Fuzz.oneOfValues
  68. [ Red
  69. , Green
  70. , Blue
  71. , White
  72. , Black
  73. , Colorless
  74. ]
  75. fuzzManaCost : Fuzzer ManaCost
  76. fuzzManaCost =
  77. Fuzz.oneOf
  78. [ Fuzz.constant X
  79. , Fuzz.constant Y
  80. , Fuzz.constant Tap
  81. , Fuzz.constant Pay
  82. , Fuzz.int |> Fuzz.map AnyColor
  83. , fuzzManaColor |> Fuzz.map Color
  84. , fuzzManaColor |> Fuzz.map ColorPay
  85. , fuzzManaColor |> Fuzz.map TwoOrColor
  86. , Fuzz.map2 Hybrid fuzzManaColor fuzzManaColor
  87. , Fuzz.map2 HybridPay fuzzManaColor fuzzManaColor
  88. ]
  89. suite : Test
  90. suite =
  91. describe "Database"
  92. [ fuzz fuzzDatabase "encoder / decoder round trip" <|
  93. \database ->
  94. let
  95. roundTrip =
  96. Database.encode ( "mkm", database )
  97. |> Encode.encode 0
  98. |> Decode.decodeString Database.decoder
  99. in
  100. Expect.equal roundTrip (Ok ( "mkm", Just database ))
  101. ]