packages feed

split-morphism-0.1.0.0: test/SplitMonoSpec.hs

module SplitMonoSpec (
    checkProps
  ) where

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

mono1 :: SplitMono Int Integer
mono1 = SplitMono toInteger fromInteger

mono2 :: SplitMono Integer String
mono2 = SplitMono show (fromMaybe 0 . readMaybe)

mono3 :: SplitMono Int String
mono3 = mono1 `composeSplitMono` mono2

prop_normalize :: Eq a => SplitMono a b -> b -> Bool
prop_normalize mono x =
    reverseGet mono (normalize mono x) == reverseGet mono x

prop_normalized_reverse_get_round_trip :: Eq b => SplitMono a b -> b -> Bool
prop_normalized_reverse_get_round_trip mono x =
    (get mono . reverseGet mono) x' == x'
  where
    x' = normalize mono x

prop_get_round_trip :: Eq a => SplitMono a b -> a -> Bool
prop_get_round_trip mono x =
    (reverseGet mono . get mono) x == x

checkProps :: IO ()
checkProps = do
    quickCheck (prop_normalize mono1)
    quickCheck (prop_normalize mono2)
    quickCheck (prop_normalize mono3)
    quickCheck (prop_normalized_reverse_get_round_trip mono1)
    quickCheck (prop_normalized_reverse_get_round_trip mono2)
    quickCheck (prop_normalized_reverse_get_round_trip mono3)
    quickCheck (prop_get_round_trip mono1)
    quickCheck (prop_get_round_trip mono2)
    quickCheck (prop_get_round_trip mono3)