module Main (main) where import ASCII.Case (Case (..)) import qualified ASCII.Char as ASCII import qualified ASCII.Decimal as Dec import qualified ASCII.Hexadecimal as Hex import qualified ASCII.Word4 as Word4 import Control.Applicative (liftA2) import Control.Monad (Monad (..), when) import Data.Bool (not) import Data.Eq (Eq) import Data.Foldable (for_) import Data.Function (fix, ($), (.)) import Data.List (map, splitAt) import Data.Maybe (Maybe (..)) import Data.String (String) import Data.Tuple (uncurry) import Data.Word (Word8) import Numeric.Natural (Natural) import Prelude (Bounded (..), Enum (..), Integer, negate, (+), (-)) import System.Exit (exitFailure) import System.IO (IO) import Text.Show (Show) import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS import qualified Data.List as List import qualified Data.Text as T import qualified Data.Text.Lazy as LT import qualified Invert as I import Hedgehog (Gen, MonadTest, Property, PropertyT, checkParallel, discover, forAll, property, withTests, (===)) import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range main :: IO () main = checkParallel $$(discover) >>= \ok -> when (not ok) exitFailure prop_showNatural_12 :: Property prop_showNatural_12 = withTests 1 $ property $ Dec.showNatural 12 === ("12" :: T.Text) prop_showNatural_268 :: Property prop_showNatural_268 = withTests 1 $ property $ Dec.showNatural 268 === ("268" :: String) prop_showInteger_12 :: Property prop_showInteger_12 = withTests 1 $ property $ Dec.showInteger 12 === ("12" :: T.Text) prop_showInteger_minus12 :: Property prop_showInteger_minus12 = withTests 1 $ property $ Dec.showInteger (negate 12) === ("-12" :: LT.Text) prop_showInteger_268 :: Property prop_showInteger_268 = withTests 1 $ property $ Dec.showInteger 268 === ("268" :: LT.Text) prop_showInteger_minus268 :: Property prop_showInteger_minus268 = withTests 1 $ property $ Dec.showInteger (negate 268) === ("-268" :: LT.Text) prop_showNatural_0_to_9 :: Property prop_showNatural_0_to_9 = withTests 1 $ property $ T.unwords (map Dec.showNatural [0..9]) === ("0 1 2 3 4 5 6 7 8 9" :: T.Text) prop_showNatural_10_to_99 :: Property prop_showNatural_10_to_99 = withTests 1 $ property $ let ne f xs = case xs of [] -> []; _ -> f xs groupsOf n = fix $ \r -> ne $ \xs -> let (x, ys) = splitAt n xs in x : r ys res :: [T.Text] res = map T.unwords $ groupsOf 10 $ map Dec.showNatural [10..99] in res === [ "10 11 12 13 14 15 16 17 18 19" , "20 21 22 23 24 25 26 27 28 29" , "30 31 32 33 34 35 36 37 38 39" , "40 41 42 43 44 45 46 47 48 49" , "50 51 52 53 54 55 56 57 58 59" , "60 61 62 63 64 65 66 67 68 69" , "70 71 72 73 74 75 76 77 78 79" , "80 81 82 83 84 85 86 87 88 89" , "90 91 92 93 94 95 96 97 98 99" ] prop_showNaturalHex_0_to_f_lower :: Property prop_showNaturalHex_0_to_f_lower = withTests 1 $ property $ T.unwords (List.map (Hex.showNatural LowerCase) [0..15]) === "0 1 2 3 4 5 6 7 8 9 a b c d e f" prop_showNaturalHex_0_to_f_upper :: Property prop_showNaturalHex_0_to_f_upper = withTests 1 $ property $ T.unwords (List.map (Hex.showNatural UpperCase) [0..15]) === "0 1 2 3 4 5 6 7 8 9 A B C D E F" prop_showNaturalHex_10_to_ff :: Property prop_showNaturalHex_10_to_ff = withTests 1 $ property $ let ne f xs = case xs of [] -> []; _ -> f xs groupsOf n = fix $ \r -> ne $ \xs -> let (x, ys) = splitAt n xs in x : r ys res :: [LT.Text] res = map LT.unwords $ groupsOf 16 $ map (Hex.showNatural LowerCase) [16..255] in res === [ "10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f" , "20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f" , "30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f" , "40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f" , "50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f" , "60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f" , "70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f" , "80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f" , "90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f" , "a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af" , "b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf" , "c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf" , "d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df" , "e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef" , "f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff" ] prop_toDigitListMaybe :: Property prop_toDigitListMaybe = withTests 1 $ property $ Dec.toDigitListMaybe ("846" :: T.Text) === Just [Dec.Digit8, Dec.Digit4, Dec.Digit6] prop_toDigitListMaybe_fail :: Property prop_toDigitListMaybe_fail = withTests 1 $ property $ Dec.toDigitListMaybe ("84a6" :: T.Text) === Nothing prop_showNatural_0 :: Property prop_showNatural_0 = withTests 1 $ property $ Dec.showNatural 0 === ("0" :: T.Text) prop_showInteger_0 :: Property prop_showInteger_0 = withTests 1 $ property $ Dec.showInteger 0 === ("0" :: T.Text) prop_readNatural_0 :: Property prop_readNatural_0 = withTests 1 $ property $ Dec.readNatural ("0" :: T.Text) === Just 0 prop_readNatural_268 :: Property prop_readNatural_268 = withTests 1 $ property $ Dec.readNatural ("268" :: BS.ByteString) === Just 268 prop_readNatural_0004 :: Property prop_readNatural_0004 = withTests 1 $ property $ Dec.readNatural ("0004" :: T.Text) === Just 4 prop_readNatural_empty :: Property prop_readNatural_empty = withTests 1 $ property $ Dec.readNatural ("" :: T.Text) === Nothing prop_readNatural_minus4 :: Property prop_readNatural_minus4 = withTests 1 $ property $ Dec.readNatural ("-4" :: BS.ByteString) === Nothing prop_readNatural_big :: Property prop_readNatural_big = withTests 1 $ property $ Dec.readNatural ("12345678901234567890" :: T.Text) === Just 12345678901234567890 prop_readInteger_0 :: Property prop_readInteger_0 = withTests 1 $ property $ Dec.readInteger ("0" :: T.Text) === Just 0 prop_readInteger_268 :: Property prop_readInteger_268 = withTests 1 $ property $ Dec.readInteger ("268" :: T.Text) === Just 268 prop_readInteger_0004 :: Property prop_readInteger_0004 = withTests 1 $ property $ Dec.readInteger ("0004" :: T.Text) === Just 4 prop_readInteger_empty :: Property prop_readInteger_empty = withTests 1 $ property $ Dec.readInteger ("" :: T.Text) === Nothing prop_readInteger_minus4 :: Property prop_readInteger_minus4 = withTests 1 $ property $ Dec.readInteger ("-4" :: BS.ByteString) === Just (-4) prop_readInteger_minus :: Property prop_readInteger_minus = withTests 1 $ property $ Dec.readInteger ("-" :: T.Text) === Nothing prop_readInteger_big :: Property prop_readInteger_big = withTests 1 $ property $ Dec.readInteger ("12345678901234567890" :: BS.ByteString) === Just 12345678901234567890 prop_readIntegral_word8_0 :: Property prop_readIntegral_word8_0 = withTests 1 $ property $ Dec.readIntegral ("0" :: T.Text) === Just (0 :: Word8) prop_readIntegral_word8_175 :: Property prop_readIntegral_word8_175 = withTests 1 $ property $ Dec.readIntegral ("175" :: T.Text) === Just (175 :: Word8) prop_readIntegral_word8_268 :: Property prop_readIntegral_word8_268 = withTests 1 $ property $ Dec.readIntegral ("268" :: T.Text) === (Nothing :: Maybe Word8) prop_readIntegral_word8_0004 :: Property prop_readIntegral_word8_0004 = withTests 1 $ property $ Dec.readIntegral ("0004" :: T.Text) === Just (4 :: Word8) prop_readIntegral_word8_empty :: Property prop_readIntegral_word8_empty = withTests 1 $ property $ Dec.readIntegral ("" :: T.Text) === (Nothing :: Maybe Word8) prop_readIntegral_word8_minus4 :: Property prop_readIntegral_word8_minus4 = withTests 1 $ property $ Dec.readIntegral ("-4" :: T.Text) === (Nothing :: Maybe Word8) prop_readIntegral_word8_big :: Property prop_readIntegral_word8_big = withTests 1 $ property $ Dec.readIntegral ("12345678901234567890" :: T.Text) === (Nothing :: Maybe Word8) prop_readIntegral_natural_4 :: Property prop_readIntegral_natural_4 = withTests 1 $ property $ Dec.readIntegral ("4" :: T.Text) === Just (4 :: Natural) prop_readIntegral_natural_minus4 :: Property prop_readIntegral_natural_minus4 = withTests 1 $ property $ Dec.readIntegral ("-4" :: T.Text) === (Nothing :: Maybe Natural) prop_naturalDigitMaybe_5 :: Property prop_naturalDigitMaybe_5 = withTests 1 $ property $ Dec.naturalDigitMaybe 5 === Just Dec.Digit5 prop_naturalDigitMaybe_12 :: Property prop_naturalDigitMaybe_12 = withTests 1 $ property $ Dec.naturalDigitMaybe 12 === Nothing prop_integerDigitMaybe_5 :: Property prop_integerDigitMaybe_5 = withTests 1 $ property $ Dec.integerDigitMaybe 5 === Just Dec.Digit5 prop_integerDigitMaybe_12 :: Property prop_integerDigitMaybe_12 = withTests 1 $ property $ Dec.integerDigitMaybe 12 === Nothing checkEnumBounded :: forall a f. (MonadTest f, Enum a, Bounded a, Eq a, Show a) => [a] -> f () checkEnumBounded xs = do [minBound .. maxBound] === xs List.map toEnum [0 .. List.length xs - 1] === xs List.map fromEnum xs === [0 .. List.length xs - 1] prop_D16_enumBounded :: Property prop_D16_enumBounded = withTests 1 $ property $ checkEnumBounded [ Word4.Number0, Word4.Number1, Word4.Number2, Word4.Number3 , Word4.Number4, Word4.Number5, Word4.Number6, Word4.Number7 , Word4.Number8, Word4.Number9, Word4.Number10, Word4.Number11 , Word4.Number12, Word4.Number13, Word4.Number14, Word4.Number15 ] prop_HexLetter_enumBounded :: Property prop_HexLetter_enumBounded = withTests 1 $ property $ checkEnumBounded [ Hex.LetterA, Hex.LetterB, Hex.LetterC , Hex.LetterD, Hex.LetterE, Hex.LetterF ] prop_HexChar_enumBounded :: Property prop_HexChar_enumBounded = withTests 1 $ property $ checkEnumBounded [ Hex.Digit0, Hex.Digit1, Hex.Digit2, Hex.Digit3, Hex.Digit4 , Hex.Digit5, Hex.Digit6, Hex.Digit7, Hex.Digit8, Hex.Digit9 , Hex.CapitalLetterA, Hex.CapitalLetterB, Hex.CapitalLetterC , Hex.CapitalLetterD, Hex.CapitalLetterE, Hex.CapitalLetterF , Hex.SmallLetterA, Hex.SmallLetterB, Hex.SmallLetterC , Hex.SmallLetterD, Hex.SmallLetterE, Hex.SmallLetterF ] prop_HexCharBreakdown_enumBounded :: Property prop_HexCharBreakdown_enumBounded = withTests 1 $ property $ checkEnumBounded [ Hex.HexDigit Dec.Digit0 , Hex.HexDigit Dec.Digit1 , Hex.HexDigit Dec.Digit2 , Hex.HexDigit Dec.Digit3 , Hex.HexDigit Dec.Digit4 , Hex.HexDigit Dec.Digit5 , Hex.HexDigit Dec.Digit6 , Hex.HexDigit Dec.Digit7 , Hex.HexDigit Dec.Digit8 , Hex.HexDigit Dec.Digit9 , Hex.HexLetter UpperCase Hex.LetterA , Hex.HexLetter UpperCase Hex.LetterB , Hex.HexLetter UpperCase Hex.LetterC , Hex.HexLetter UpperCase Hex.LetterD , Hex.HexLetter UpperCase Hex.LetterE , Hex.HexLetter UpperCase Hex.LetterF , Hex.HexLetter LowerCase Hex.LetterA , Hex.HexLetter LowerCase Hex.LetterB , Hex.HexLetter LowerCase Hex.LetterC , Hex.HexLetter LowerCase Hex.LetterD , Hex.HexLetter LowerCase Hex.LetterE , Hex.HexLetter LowerCase Hex.LetterF ] every :: (Enum a, Bounded a) => [a] every = [minBound .. maxBound] functionEq :: (MonadTest f, Eq a, Show a) => [t] -> (t -> a) -> (t -> a) -> f () functionEq xs f g = for_ xs $ \x -> f x === g x prop_hexLetterD16 :: Property prop_hexLetterD16 = withTests 1 $ property $ functionEq every Hex.hexLetterD16 $ \case Hex.LetterA -> Word4.Number10 Hex.LetterB -> Word4.Number11 Hex.LetterC -> Word4.Number12 Hex.LetterD -> Word4.Number13 Hex.LetterE -> Word4.Number14 Hex.LetterF -> Word4.Number15 prop_d16HexLetter :: Property prop_d16HexLetter = withTests 1 $ property $ functionEq every Hex.d16HexLetter $ I.injection I.linearSearchLazy every Hex.hexLetterD16 prop_letterHexChar :: Property prop_letterHexChar = withTests 1 $ property $ functionEq (liftA2 (,) every every) (uncurry Hex.letterHexChar) $ \case (UpperCase, Hex.LetterA) -> Hex.CapitalLetterA (UpperCase, Hex.LetterB) -> Hex.CapitalLetterB (UpperCase, Hex.LetterC) -> Hex.CapitalLetterC (UpperCase, Hex.LetterD) -> Hex.CapitalLetterD (UpperCase, Hex.LetterE) -> Hex.CapitalLetterE (UpperCase, Hex.LetterF) -> Hex.CapitalLetterF (LowerCase, Hex.LetterA) -> Hex.SmallLetterA (LowerCase, Hex.LetterB) -> Hex.SmallLetterB (LowerCase, Hex.LetterC) -> Hex.SmallLetterC (LowerCase, Hex.LetterD) -> Hex.SmallLetterD (LowerCase, Hex.LetterE) -> Hex.SmallLetterE (LowerCase, Hex.LetterF) -> Hex.SmallLetterF prop_hexCharLetter :: Property prop_hexCharLetter = withTests 1 $ property $ functionEq every Hex.hexCharLetter $ \case Hex.CapitalLetterA -> Just Hex.LetterA Hex.CapitalLetterB -> Just Hex.LetterB Hex.CapitalLetterC -> Just Hex.LetterC Hex.CapitalLetterD -> Just Hex.LetterD Hex.CapitalLetterE -> Just Hex.LetterE Hex.CapitalLetterF -> Just Hex.LetterF Hex.SmallLetterA -> Just Hex.LetterA Hex.SmallLetterB -> Just Hex.LetterB Hex.SmallLetterC -> Just Hex.LetterC Hex.SmallLetterD -> Just Hex.LetterD Hex.SmallLetterE -> Just Hex.LetterE Hex.SmallLetterF -> Just Hex.LetterF _ -> Nothing prop_hexAsciiChar :: Property prop_hexAsciiChar = withTests 1 $ property $ functionEq every Hex.hexAsciiChar $ \case Hex.Digit0 -> ASCII.Digit0 Hex.Digit1 -> ASCII.Digit1 Hex.Digit2 -> ASCII.Digit2 Hex.Digit3 -> ASCII.Digit3 Hex.Digit4 -> ASCII.Digit4 Hex.Digit5 -> ASCII.Digit5 Hex.Digit6 -> ASCII.Digit6 Hex.Digit7 -> ASCII.Digit7 Hex.Digit8 -> ASCII.Digit8 Hex.Digit9 -> ASCII.Digit9 Hex.CapitalLetterA -> ASCII.CapitalLetterA Hex.CapitalLetterB -> ASCII.CapitalLetterB Hex.CapitalLetterC -> ASCII.CapitalLetterC Hex.CapitalLetterD -> ASCII.CapitalLetterD Hex.CapitalLetterE -> ASCII.CapitalLetterE Hex.CapitalLetterF -> ASCII.CapitalLetterF Hex.SmallLetterA -> ASCII.SmallLetterA Hex.SmallLetterB -> ASCII.SmallLetterB Hex.SmallLetterC -> ASCII.SmallLetterC Hex.SmallLetterD -> ASCII.SmallLetterD Hex.SmallLetterE -> ASCII.SmallLetterE Hex.SmallLetterF -> ASCII.SmallLetterF prop_asciiCharHex :: Property prop_asciiCharHex = withTests 1 $ property $ functionEq every Hex.asciiCharHex $ I.injection I.linearSearchLazy every Hex.hexAsciiChar prop_d16HexChar :: Property prop_d16HexChar = withTests 1 $ property $ functionEq (liftA2 (,) every every) (uncurry Hex.d16HexChar) $ \case (_, Word4.Number0) -> Hex.Digit0 (_, Word4.Number1) -> Hex.Digit1 (_, Word4.Number2) -> Hex.Digit2 (_, Word4.Number3) -> Hex.Digit3 (_, Word4.Number4) -> Hex.Digit4 (_, Word4.Number5) -> Hex.Digit5 (_, Word4.Number6) -> Hex.Digit6 (_, Word4.Number7) -> Hex.Digit7 (_, Word4.Number8) -> Hex.Digit8 (_, Word4.Number9) -> Hex.Digit9 (UpperCase, Word4.Number10) -> Hex.CapitalLetterA (UpperCase, Word4.Number11) -> Hex.CapitalLetterB (UpperCase, Word4.Number12) -> Hex.CapitalLetterC (UpperCase, Word4.Number13) -> Hex.CapitalLetterD (UpperCase, Word4.Number14) -> Hex.CapitalLetterE (UpperCase, Word4.Number15) -> Hex.CapitalLetterF (LowerCase, Word4.Number10) -> Hex.SmallLetterA (LowerCase, Word4.Number11) -> Hex.SmallLetterB (LowerCase, Word4.Number12) -> Hex.SmallLetterC (LowerCase, Word4.Number13) -> Hex.SmallLetterD (LowerCase, Word4.Number14) -> Hex.SmallLetterE (LowerCase, Word4.Number15) -> Hex.SmallLetterF prop_hexCharD16 :: Property prop_hexCharD16 = withTests 1 $ property $ functionEq every Hex.hexCharD16 $ \case Hex.Digit0 -> Word4.Number0 Hex.Digit1 -> Word4.Number1 Hex.Digit2 -> Word4.Number2 Hex.Digit3 -> Word4.Number3 Hex.Digit4 -> Word4.Number4 Hex.Digit5 -> Word4.Number5 Hex.Digit6 -> Word4.Number6 Hex.Digit7 -> Word4.Number7 Hex.Digit8 -> Word4.Number8 Hex.Digit9 -> Word4.Number9 Hex.CapitalLetterA -> Word4.Number10 Hex.CapitalLetterB -> Word4.Number11 Hex.CapitalLetterC -> Word4.Number12 Hex.CapitalLetterD -> Word4.Number13 Hex.CapitalLetterE -> Word4.Number14 Hex.CapitalLetterF -> Word4.Number15 Hex.SmallLetterA -> Word4.Number10 Hex.SmallLetterB -> Word4.Number11 Hex.SmallLetterC -> Word4.Number12 Hex.SmallLetterD -> Word4.Number13 Hex.SmallLetterE -> Word4.Number14 Hex.SmallLetterF -> Word4.Number15 prop_breakDownHexChar :: Property prop_breakDownHexChar = withTests 1 $ property $ functionEq every Hex.breakDownHexChar $ \case Hex.Digit0 -> Hex.HexDigit Dec.Digit0 Hex.Digit1 -> Hex.HexDigit Dec.Digit1 Hex.Digit2 -> Hex.HexDigit Dec.Digit2 Hex.Digit3 -> Hex.HexDigit Dec.Digit3 Hex.Digit4 -> Hex.HexDigit Dec.Digit4 Hex.Digit5 -> Hex.HexDigit Dec.Digit5 Hex.Digit6 -> Hex.HexDigit Dec.Digit6 Hex.Digit7 -> Hex.HexDigit Dec.Digit7 Hex.Digit8 -> Hex.HexDigit Dec.Digit8 Hex.Digit9 -> Hex.HexDigit Dec.Digit9 Hex.CapitalLetterA -> Hex.HexLetter UpperCase Hex.LetterA Hex.CapitalLetterB -> Hex.HexLetter UpperCase Hex.LetterB Hex.CapitalLetterC -> Hex.HexLetter UpperCase Hex.LetterC Hex.CapitalLetterD -> Hex.HexLetter UpperCase Hex.LetterD Hex.CapitalLetterE -> Hex.HexLetter UpperCase Hex.LetterE Hex.CapitalLetterF -> Hex.HexLetter UpperCase Hex.LetterF Hex.SmallLetterA -> Hex.HexLetter LowerCase Hex.LetterA Hex.SmallLetterB -> Hex.HexLetter LowerCase Hex.LetterB Hex.SmallLetterC -> Hex.HexLetter LowerCase Hex.LetterC Hex.SmallLetterD -> Hex.HexLetter LowerCase Hex.LetterD Hex.SmallLetterE -> Hex.HexLetter LowerCase Hex.LetterE Hex.SmallLetterF -> Hex.HexLetter LowerCase Hex.LetterF prop_assembleHexChar :: Property prop_assembleHexChar = withTests 1 $ property $ functionEq every Hex.assembleHexChar $ I.bijection I.linearSearchLazy every Hex.breakDownHexChar prop_hexCharNatural :: Property prop_hexCharNatural = withTests 1 $ property $ functionEq every Hex.hexCharNatural $ \case Hex.Digit0 -> 0 Hex.Digit1 -> 1 Hex.Digit2 -> 2 Hex.Digit3 -> 3 Hex.Digit4 -> 4 Hex.Digit5 -> 5 Hex.Digit6 -> 6 Hex.Digit7 -> 7 Hex.Digit8 -> 8 Hex.Digit9 -> 9 Hex.CapitalLetterA -> 10 Hex.CapitalLetterB -> 11 Hex.CapitalLetterC -> 12 Hex.CapitalLetterD -> 13 Hex.CapitalLetterE -> 14 Hex.CapitalLetterF -> 15 Hex.SmallLetterA -> 10 Hex.SmallLetterB -> 11 Hex.SmallLetterC -> 12 Hex.SmallLetterD -> 13 Hex.SmallLetterE -> 14 Hex.SmallLetterF -> 15 prop_naturalHexCharMaybe :: Property prop_naturalHexCharMaybe = withTests 1 $ property $ functionEq (liftA2 (,) every [0 .. 20]) (uncurry Hex.naturalHexCharMaybe) $ \case (_, 0) -> Just Hex.Digit0 (_, 1) -> Just Hex.Digit1 (_, 2) -> Just Hex.Digit2 (_, 3) -> Just Hex.Digit3 (_, 4) -> Just Hex.Digit4 (_, 5) -> Just Hex.Digit5 (_, 6) -> Just Hex.Digit6 (_, 7) -> Just Hex.Digit7 (_, 8) -> Just Hex.Digit8 (_, 9) -> Just Hex.Digit9 (UpperCase, 10) -> Just Hex.CapitalLetterA (UpperCase, 11) -> Just Hex.CapitalLetterB (UpperCase, 12) -> Just Hex.CapitalLetterC (UpperCase, 13) -> Just Hex.CapitalLetterD (UpperCase, 14) -> Just Hex.CapitalLetterE (UpperCase, 15) -> Just Hex.CapitalLetterF (LowerCase, 10) -> Just Hex.SmallLetterA (LowerCase, 11) -> Just Hex.SmallLetterB (LowerCase, 12) -> Just Hex.SmallLetterC (LowerCase, 13) -> Just Hex.SmallLetterD (LowerCase, 14) -> Just Hex.SmallLetterE (LowerCase, 15) -> Just Hex.SmallLetterF _ -> Nothing prop_hexCharInteger :: Property prop_hexCharInteger = withTests 1 $ property $ functionEq every Hex.hexCharInteger $ \case Hex.Digit0 -> 0 Hex.Digit1 -> 1 Hex.Digit2 -> 2 Hex.Digit3 -> 3 Hex.Digit4 -> 4 Hex.Digit5 -> 5 Hex.Digit6 -> 6 Hex.Digit7 -> 7 Hex.Digit8 -> 8 Hex.Digit9 -> 9 Hex.CapitalLetterA -> 10 Hex.CapitalLetterB -> 11 Hex.CapitalLetterC -> 12 Hex.CapitalLetterD -> 13 Hex.CapitalLetterE -> 14 Hex.CapitalLetterF -> 15 Hex.SmallLetterA -> 10 Hex.SmallLetterB -> 11 Hex.SmallLetterC -> 12 Hex.SmallLetterD -> 13 Hex.SmallLetterE -> 14 Hex.SmallLetterF -> 15 prop_integerHexCharMaybe :: Property prop_integerHexCharMaybe = withTests 1 $ property $ functionEq (liftA2 (,) every [-4 .. 20]) (uncurry Hex.integerHexCharMaybe) $ \case (_, 0) -> Just Hex.Digit0 (_, 1) -> Just Hex.Digit1 (_, 2) -> Just Hex.Digit2 (_, 3) -> Just Hex.Digit3 (_, 4) -> Just Hex.Digit4 (_, 5) -> Just Hex.Digit5 (_, 6) -> Just Hex.Digit6 (_, 7) -> Just Hex.Digit7 (_, 8) -> Just Hex.Digit8 (_, 9) -> Just Hex.Digit9 (UpperCase, 10) -> Just Hex.CapitalLetterA (UpperCase, 11) -> Just Hex.CapitalLetterB (UpperCase, 12) -> Just Hex.CapitalLetterC (UpperCase, 13) -> Just Hex.CapitalLetterD (UpperCase, 14) -> Just Hex.CapitalLetterE (UpperCase, 15) -> Just Hex.CapitalLetterF (LowerCase, 10) -> Just Hex.SmallLetterA (LowerCase, 11) -> Just Hex.SmallLetterB (LowerCase, 12) -> Just Hex.SmallLetterC (LowerCase, 13) -> Just Hex.SmallLetterD (LowerCase, 14) -> Just Hex.SmallLetterE (LowerCase, 15) -> Just Hex.SmallLetterF _ -> Nothing prop_naturalD16Maybe :: Property prop_naturalD16Maybe = withTests 1 $ property $ functionEq [0 .. 20] Hex.naturalD16Maybe $ I.injection I.linearSearchLazy every Hex.d16Natural prop_integerD16Maybe :: Property prop_integerD16Maybe = withTests 1 $ property $ functionEq [-4 .. 20] Hex.integerD16Maybe $ I.injection I.linearSearchLazy every Hex.d16Integer prop_naturalD16Unsafe :: Property prop_naturalD16Unsafe = withTests 1 $ property $ functionEq [0 .. 15] (Just . Hex.naturalD16Unsafe) Hex.naturalD16Maybe prop_integerD16Unsafe :: Property prop_integerD16Unsafe = withTests 1 $ property $ functionEq [0 .. 15] (Just . Hex.integerD16Unsafe) Hex.integerD16Maybe prop_naturalHexCharUnsafe :: Property prop_naturalHexCharUnsafe = withTests 1 $ property $ functionEq (liftA2 (,) every [0 .. 15]) (Just . uncurry Hex.naturalHexCharUnsafe) (uncurry Hex.naturalHexCharMaybe) prop_integerHexCharUnsafe :: Property prop_integerHexCharUnsafe = withTests 1 $ property $ functionEq (liftA2 (,) every [0 .. 15]) (Just . uncurry Hex.integerHexCharUnsafe) (uncurry Hex.integerHexCharMaybe) prop_hex_showNatural_lower_12 :: Property prop_hex_showNatural_lower_12 = withTests 1 $ property $ Hex.showNatural LowerCase 12 === ("c" :: LBS.ByteString) prop_hex_showNatural_upper_10C :: Property prop_hex_showNatural_upper_10C = withTests 1 $ property $ Hex.showNatural UpperCase (256 + 12) === ("10C" :: BS.ByteString) prop_hex_showNatural_upper_0 :: Property prop_hex_showNatural_upper_0 = withTests 1 $ property $ Hex.showNatural UpperCase 0 === ("0" :: LBS.ByteString) prop_hex_showInteger_lower_12 :: Property prop_hex_showInteger_lower_12 = withTests 1 $ property $ Hex.showInteger LowerCase 12 === ("c" :: T.Text) prop_hex_showInteger_lower_minus12 :: Property prop_hex_showInteger_lower_minus12 = withTests 1 $ property $ Hex.showInteger LowerCase (negate 12) === ("-c" :: LT.Text) prop_hex_showInteger_upper_10C :: Property prop_hex_showInteger_upper_10C = withTests 1 $ property $ Hex.showInteger UpperCase (256 + 12) === ("10C" :: String) prop_hex_showInteger_upper_minus10C :: Property prop_hex_showInteger_upper_minus10C = withTests 1 $ property $ Hex.showInteger UpperCase (negate (256 + 12)) === ("-10C" :: BS.ByteString) prop_hex_showInteger_upper_0 :: Property prop_hex_showInteger_upper_0 = withTests 1 $ property $ Hex.showInteger UpperCase 0 === ("0" :: String) prop_hex_readNatural_5 :: Property prop_hex_readNatural_5 = withTests 1 $ property $ Hex.readNatural ("5" :: String) === Just 5 prop_hex_readNatural_minus5 :: Property prop_hex_readNatural_minus5 = withTests 1 $ property $ Hex.readNatural ("-5" :: T.Text) === Nothing prop_hex_readNatural_1f :: Property prop_hex_readNatural_1f = withTests 1 $ property $ Hex.readNatural ("1f" :: BS.ByteString) === Just 31 prop_hex_readNatural_1F :: Property prop_hex_readNatural_1F = withTests 1 $ property $ Hex.readNatural ("1F" :: LT.Text) === Just 31 prop_hex_readNatural_xa :: Property prop_hex_readNatural_xa = withTests 1 $ property $ Hex.readNatural ("xa" :: String) === Nothing prop_hex_readNatural_empty :: Property prop_hex_readNatural_empty = withTests 1 $ property $ Hex.readNatural ("" :: T.Text) === Nothing prop_hex_readInteger_5 :: Property prop_hex_readInteger_5 = withTests 1 $ property $ Hex.readInteger ("5" :: T.Text) === Just 5 prop_hex_readInteger_minus5 :: Property prop_hex_readInteger_minus5 = withTests 1 $ property $ Hex.readInteger ("-5" :: T.Text) === Just (-5) prop_hex_readInteger_1f :: Property prop_hex_readInteger_1f = withTests 1 $ property $ Hex.readInteger ("1f" :: LT.Text) === Just 31 prop_hex_readInteger_1F :: Property prop_hex_readInteger_1F = withTests 1 $ property $ Hex.readInteger ("1F" :: LT.Text) === Just 31 prop_hex_readInteger_xa :: Property prop_hex_readInteger_xa = withTests 1 $ property $ Hex.readInteger ("xa" :: String) === Nothing prop_hex_readInteger_empty :: Property prop_hex_readInteger_empty = withTests 1 $ property $ Hex.readInteger ("" :: String) === Nothing prop_hex_readInteger_minus :: Property prop_hex_readInteger_minus = withTests 1 $ property $ Hex.readInteger ("-" :: String) === Nothing prop_hex_readIntegral_word8_0014 :: Property prop_hex_readIntegral_word8_0014 = withTests 1 $ property $ Hex.readIntegral ("0014" :: String) === Just (20 :: Word8) prop_hex_readIntegral_word8_empty :: Property prop_hex_readIntegral_word8_empty = withTests 1 $ property $ Hex.readIntegral ("" :: String) === (Nothing :: Maybe Word8) prop_hex_readIntegral_word8_minus4 :: Property prop_hex_readIntegral_word8_minus4 = withTests 1 $ property $ Hex.readIntegral ("-4" :: String) === (Nothing :: Maybe Word8) prop_hex_readIntegral_word8_1234 :: Property prop_hex_readIntegral_word8_1234 = withTests 1 $ property $ Hex.readIntegral ("1234" :: String) === (Nothing :: Maybe Word8) checkReadShow :: forall string number f. (Monad f, Eq number, Show number, Eq string, Show string) => Gen number -> (number -> string) -> (string -> Maybe number) -> PropertyT f () checkReadShow g s r = do x <- forAll g r (s x) === Just x prop_readShow_dec_integer_text :: Property prop_readShow_dec_integer_text = property $ checkReadShow @T.Text @Integer genInteger Dec.showInteger Dec.readInteger prop_readShow_dec_integer_string :: Property prop_readShow_dec_integer_string = property $ checkReadShow @String @Integer genInteger Dec.showInteger Dec.readInteger prop_readShow_dec_integer_byteString :: Property prop_readShow_dec_integer_byteString = property $ checkReadShow @BS.ByteString @Integer genInteger Dec.showInteger Dec.readInteger prop_readShow_dec_natural :: Property prop_readShow_dec_natural = property $ checkReadShow @T.Text @Natural genNatural Dec.showNatural Dec.readNatural prop_readShow_dec_word8 :: Property prop_readShow_dec_word8 = property $ checkReadShow @T.Text @Word8 genWord8 Dec.showIntegral Dec.readIntegral prop_readShow_hex_integer_text :: Property prop_readShow_hex_integer_text = property $ do c <- forAll genCase checkReadShow @T.Text @Integer genInteger (Hex.showInteger c) Hex.readInteger prop_readShow_hex_integer_string :: Property prop_readShow_hex_integer_string = property $ do c <- forAll genCase checkReadShow @String @Integer genInteger (Hex.showInteger c) Hex.readInteger prop_readShow_hex_integer_byteString :: Property prop_readShow_hex_integer_byteString = property $ do c <- forAll genCase checkReadShow @BS.ByteString @Integer genInteger (Hex.showInteger c) Hex.readInteger prop_readShow_hex_natural :: Property prop_readShow_hex_natural = property $ do c <- forAll genCase checkReadShow @T.Text @Natural genNatural (Hex.showNatural c) Hex.readNatural prop_readShow_hex_word8 :: Property prop_readShow_hex_word8 = property $ do c <- forAll genCase checkReadShow @T.Text @Word8 genWord8 (Hex.showIntegral c) Hex.readIntegral genNatural :: Gen Natural genNatural = Gen.integral (Range.exponential 0 10000) genInteger :: Gen Integer genInteger = Gen.integral (Range.exponentialFrom 0 (-10000) 10000) genWord8 :: Gen Word8 genWord8 = Gen.integral (Range.linear minBound maxBound) genCase :: Gen Case genCase = Gen.element [UpperCase, LowerCase]