packages feed

ascii-group-1.0.0.12: test/Main.hs

module Main (main) where

import ASCII.Group

import ASCII.Char (Char (..), allCharacters)

import Control.Monad (Monad (..))
import Data.Bool (not)
import Data.Foldable (all)
import Data.Function (($))
import Data.List (filter, length)
import System.IO (IO)
import Control.Monad (when)
import System.Exit (exitFailure)

import Hedgehog (Property, assert, checkParallel, discover, property,
                 withTests, (===))

main :: IO ()
main = checkParallel $$(discover) >>= \ok -> when (not ok) exitFailure

prop_letter :: Property
prop_letter = withTests 1 $ property $
    charGroup CapitalLetterA === Printable

prop_control :: Property
prop_control = withTests 1 $ property $
    charGroup EndOfTransmission === Control

prop_not_printable :: Property
prop_not_printable = withTests 1 $ property $
    assert $ not $ inGroup Printable EndOfTransmission

prop_is_control :: Property
prop_is_control = withTests 1 $ property $
    assert $ inGroup Control EndOfTransmission

-- It is perhaps surprising that space is considered a
-- "printable" character, since it does not visibly appear.
prop_space_is_printable :: Property
prop_space_is_printable = withTests 1 $ property $
    charGroup Space === Printable

-- It is perhaps surprising that horizontal tab is not
-- in the same category as space.
prop_horizontal_tab_is_control :: Property
prop_horizontal_tab_is_control = withTests 1 $ property $
    charGroup HorizontalTab === Control

prop_various_printables :: Property
prop_various_printables = withTests 1 $ property $
    assert $ all (inGroup Printable) [CapitalLetterA, SmallLetterZ, Digit4, Tilde]

prop_various_controls :: Property
prop_various_controls = withTests 1 $ property $
    assert $ all (inGroup Control) [Null, Substitute, UnitSeparator, Delete]

prop_count_printables :: Property
prop_count_printables = withTests 1 $ property $
    length (filter (inGroup Printable) allCharacters) === 95

prop_count_controls :: Property
prop_count_controls = withTests 1 $ property $
    length (filter (inGroup Control) allCharacters) === 33