TestDatabase.elm 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. module TestDatabase exposing (..)
  2. import Card exposing (CardData, CardDetails, CardPerformanceData, CardType(..), ManaColor(..), ManaCost(..), Power(..), Rarity(..))
  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. |> Fuzz.andMap fuzzRarity
  48. fuzzCardType : Fuzzer CardType
  49. fuzzCardType =
  50. Fuzz.oneOfValues
  51. [ Creature
  52. , Instant
  53. , Sorcery
  54. , Enchantment
  55. , Artifact
  56. , Planeswalker
  57. , Land
  58. , Other
  59. ]
  60. fuzzPower : Fuzzer Power
  61. fuzzPower =
  62. Fuzz.oneOf
  63. [ Fuzz.constant VariablePower
  64. , Fuzz.intAtLeast 0 |> Fuzz.map ConstantPower
  65. , Fuzz.intAtLeast 0 |> Fuzz.map ConstantPlusVariablePower
  66. ]
  67. fuzzRarity : Fuzzer Rarity
  68. fuzzRarity =
  69. Fuzz.oneOfValues
  70. [ Common
  71. , Uncommon
  72. , Rare
  73. , Mythic
  74. ]
  75. fuzzManaColor : Fuzzer ManaColor
  76. fuzzManaColor =
  77. Fuzz.oneOfValues
  78. [ Red
  79. , Green
  80. , Blue
  81. , White
  82. , Black
  83. , Colorless
  84. ]
  85. fuzzManaCost : Fuzzer ManaCost
  86. fuzzManaCost =
  87. Fuzz.oneOf
  88. [ Fuzz.constant X
  89. , Fuzz.constant Y
  90. , Fuzz.constant Tap
  91. , Fuzz.constant Pay
  92. , Fuzz.int |> Fuzz.map AnyColor
  93. , fuzzManaColor |> Fuzz.map Color
  94. , fuzzManaColor |> Fuzz.map ColorPay
  95. , fuzzManaColor |> Fuzz.map TwoOrColor
  96. , Fuzz.map2 Hybrid fuzzManaColor fuzzManaColor
  97. , Fuzz.map2 HybridPay fuzzManaColor fuzzManaColor
  98. ]
  99. suite : Test
  100. suite =
  101. describe "Database"
  102. [ fuzz fuzzDatabase "encoder / decoder round trip" <|
  103. \database ->
  104. let
  105. roundTrip =
  106. Database.encode ( "mkm", database )
  107. |> Encode.encode 0
  108. |> Decode.decodeString Database.decoder
  109. in
  110. Expect.equal roundTrip (Ok ( "mkm", Just database ))
  111. ]