TestDatabase.elm 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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.intAtLeast 0 |> Fuzz.map ConstantPower
  64. , Fuzz.intAtLeast 0 |> Fuzz.map ConstantPlusVariablePower
  65. ]
  66. fuzzManaColor : Fuzzer ManaColor
  67. fuzzManaColor =
  68. Fuzz.oneOfValues
  69. [ Red
  70. , Green
  71. , Blue
  72. , White
  73. , Black
  74. , Colorless
  75. ]
  76. fuzzManaCost : Fuzzer ManaCost
  77. fuzzManaCost =
  78. Fuzz.oneOf
  79. [ Fuzz.constant X
  80. , Fuzz.constant Y
  81. , Fuzz.constant Tap
  82. , Fuzz.constant Pay
  83. , Fuzz.int |> Fuzz.map AnyColor
  84. , fuzzManaColor |> Fuzz.map Color
  85. , fuzzManaColor |> Fuzz.map ColorPay
  86. , fuzzManaColor |> Fuzz.map TwoOrColor
  87. , Fuzz.map2 Hybrid fuzzManaColor fuzzManaColor
  88. , Fuzz.map2 HybridPay fuzzManaColor fuzzManaColor
  89. ]
  90. suite : Test
  91. suite =
  92. describe "Database"
  93. [ fuzz fuzzDatabase "encoder / decoder round trip" <|
  94. \database ->
  95. let
  96. roundTrip =
  97. Database.encode ( "mkm", database )
  98. |> Encode.encode 0
  99. |> Decode.decodeString Database.decoder
  100. in
  101. Expect.equal roundTrip (Ok ( "mkm", Just database ))
  102. ]