packages feed

chez-grater-0.0.1: test/Chez/Grater/Gen.hs

module Chez.Grater.Gen where

import Chez.Grater.Internal.Prelude

import Test.QuickCheck (Gen, arbitrary, elements, oneof)
import qualified Data.CaseInsensitive as CI
import qualified Data.Text as Text

import Chez.Grater.Types

maybeGen :: Gen a -> Gen (Maybe a)
maybeGen gen = oneof
  [ Just <$> gen
  , pure Nothing
  ]

arbitraryAlphaNum :: Gen Char
arbitraryAlphaNum = elements $ ['a'..'z'] <> ['A'..'Z'] <> ['0'..'9']

arbitraryAlphaNumStr :: Gen Text
arbitraryAlphaNumStr = do
  n <- arbitrary
  Text.pack <$> replicateM (abs n + 10) arbitraryAlphaNum

arbitraryCi :: Gen (CI Text)
arbitraryCi = CI.mk <$> arbitraryAlphaNumStr

arbitraryIngredientName :: Gen IngredientName
arbitraryIngredientName = IngredientName <$> arbitraryCi

arbitraryRecipeName :: Gen RecipeName
arbitraryRecipeName = RecipeName <$> arbitraryAlphaNumStr

trunc :: Int -> Double -> Double
trunc n x = (fromIntegral (floor (x * t) :: Int)) / t
  where t = 10^n

arbitraryDouble :: Gen Double
arbitraryDouble = trunc 5 . abs <$> arbitrary

arbitraryInt :: Gen Int
arbitraryInt = abs <$> arbitrary

arbitraryFraction :: Gen Fraction
arbitraryFraction = Fraction
  <$> arbitraryInt
  <*> ((+1) <$> arbitraryInt)

arbitraryQuantity :: Gen Quantity
arbitraryQuantity = Quantity
  <$> maybeGen arbitraryInt
  <*> maybeGen arbitraryFraction

arbitraryUnit :: Gen (Maybe Unit)
arbitraryUnit = maybeGen (Unit <$> arbitraryCi)

arbitraryIngredient :: Gen Ingredient
arbitraryIngredient = Ingredient
  <$> arbitraryIngredientName
  <*> arbitraryQuantity
  <*> arbitraryUnit

arbitraryStep :: Gen Step
arbitraryStep = Step
  <$> arbitraryAlphaNumStr