unicode-0.0: test/Test/Data/Char/Frame.hs
module Test.Data.Char.Frame where
import Test.Utility (checkDuplicates, )
import qualified Data.Char.Frame as Frame
import qualified System.Exit as Exit
import qualified System.IO as IO
import qualified Data.List.HT as ListHT
import qualified Data.Foldable as Fold
import Control.Monad (when, )
import Control.Applicative (pure, )
import Data.Traversable (sequenceA, )
allParts :: [Frame.Parts Bool]
allParts = sequenceA $ pure [False, True]
longParts :: [Frame.Parts Bool]
longParts = filter (ListHT.lengthAtLeast 2 . filter id . Fold.toList) allParts
weightFromBool :: Bool -> Frame.Weight
weightFromBool b =
if b then Frame.Light else Frame.Empty
checkMatches :: (Frame.Parts Bool -> Char) -> IO ()
checkMatches f = do
let mismatches =
filter (uncurry (/=) . snd) $
map (\parts -> (parts, (Frame.simple parts, f parts))) $
allParts
when (not $ null mismatches) $ do
IO.hPutStrLn IO.stderr "mismatches:"
mapM_ (IO.hPrint IO.stderr) mismatches
Exit.exitFailure
test :: IO ()
test = do
putStrLn "Check consistency of weighted frame elements"
checkMatches (Frame.weighted . fmap weightFromBool)
putStrLn "Check consistency of double frame elements"
checkMatches (Frame.double (Frame.Directions False False))
putStrLn "Check duplicates of weighted frame elements"
checkDuplicates (sequenceA $ pure [minBound .. maxBound]) Frame.weighted
Fold.forM_ (sequenceA $ pure [False, True]) $ \dir -> do
putStrLn ("Check duplicates of double frame elements, " ++ show dir)
checkDuplicates longParts (Frame.double dir)