module SplitEpiSpec (
    checkProps
  ) where

import Control.Lens.SplitEpi
import Data.Maybe (fromMaybe)
import Test.QuickCheck
import Text.Read (readMaybe)

epi1 :: SplitEpi String Integer
epi1 = SplitEpi (fromMaybe 0 . readMaybe) show

epi2 :: SplitEpi Integer Int
epi2 = SplitEpi fromInteger toInteger

epi3 :: SplitEpi String Int
epi3 = epi1 `composeSplitEpi` epi2

prop_normalize :: Eq b => SplitEpi a b -> a -> Bool
prop_normalize epi x =
    get epi (normalize epi x) == get epi x

prop_normalized_get_round_trip :: Eq a => SplitEpi a b -> a -> Bool
prop_normalized_get_round_trip epi x =
    (reverseGet epi . get epi) x' == x'
  where
    x' = normalize epi x

prop_reverse_get_round_trip :: Eq b => SplitEpi a b -> b -> Bool
prop_reverse_get_round_trip epi x =
    (get epi . reverseGet epi) x == x

checkProps :: IO ()
checkProps = do
    quickCheck (prop_normalize epi1)
    quickCheck (prop_normalize epi2)
    quickCheck (prop_normalize epi3)
    quickCheck (prop_normalized_get_round_trip epi1)
    quickCheck (prop_normalized_get_round_trip epi2)
    quickCheck (prop_normalized_get_round_trip epi3)
    quickCheck (prop_reverse_get_round_trip epi1)
    quickCheck (prop_reverse_get_round_trip epi2)
    quickCheck (prop_reverse_get_round_trip epi3)