module Main (main) where import Test.Hspec import ASCII.Refinement (ASCII, asciiUnsafe) import ASCII.CaseRefinement (ASCII'lower, ASCII'upper, asciiCaseUnsafe) import qualified ASCII.CaseRefinement as CaseRefinement import qualified ASCII.Lift as Lift import qualified ASCII.Refinement as Refinement import ASCII.Char (Char (..)) import qualified ASCII.Caseless as CC import Data.Text (Text) import Data.Word (Word8) import Prelude main :: IO () main = hspec $ do describe "lift" $ do it "letter" $ do let f x = Lift.lift x :: Word8 f CapitalLetterA `shouldBe` 65 it "list" $ do let f x = Lift.lift x :: Text f [CapitalLetterH, SmallLetterI, ExclamationMark] `shouldBe` "Hi!" describe "refinement" $ do it "validateChar" $ do let f x = Refinement.validateChar x :: Maybe (ASCII Int) f (-1) `shouldBe` Nothing f 65 `shouldBe` Just (asciiUnsafe 65) f 97 `shouldBe` Just (asciiUnsafe 97) f 128 `shouldBe` Nothing it "fromCharList" $ do let f x = Refinement.fromCharList x :: ASCII Text f [CapitalLetterH, SmallLetterI, ExclamationMark] `shouldBe` asciiUnsafe "Hi!" it "toCharList" $ do let f x = Refinement.toCharList (Refinement.substituteString x :: ASCII Text) f "Piñata" `shouldBe` [CapitalLetterP, SmallLetterI, Substitute, SmallLetterA, SmallLetterT, SmallLetterA] it "substituteString" $ do let f x = Refinement.substituteString x :: ASCII Text f "Cristóbal" `shouldBe` asciiUnsafe "Crist\SUBbal" it "validateString" $ do let f x = Refinement.validateString x :: Maybe (ASCII Text) f "Hello" `shouldBe` Just (asciiUnsafe "Hello") f "Cristóbal" `shouldBe` Nothing describe "case refinement" $ do describe "validateChar" $ do it "lower" $ do let f x = CaseRefinement.validateChar x :: Maybe (ASCII'lower Int) f (-1) `shouldBe` Nothing f 65 `shouldBe` Nothing f 97 `shouldBe` Just (asciiCaseUnsafe 97) f 128 `shouldBe` Nothing it "upper" $ do let f x = CaseRefinement.validateChar x :: Maybe (ASCII'upper Int) f (-1) `shouldBe` Nothing f 65 `shouldBe` Just (asciiCaseUnsafe 65) f 97 `shouldBe` Nothing f 128 `shouldBe` Nothing describe "fromCaselessCharList" $ do it "lower" $ do let f x = CaseRefinement.fromCaselessCharList x :: ASCII'lower Text f [CC.LetterH, CC.LetterI, CC.ExclamationMark] `shouldBe` asciiCaseUnsafe "hi!" it "upper" $ do let f x = CaseRefinement.fromCaselessCharList x :: ASCII'upper Text f [CC.LetterH, CC.LetterI, CC.ExclamationMark] `shouldBe` asciiCaseUnsafe "HI!" describe "toCaselessCharList" $ do it "lower" $ do let f x = CaseRefinement.toCaselessCharList (x :: ASCII'lower Text) f (asciiCaseUnsafe "hi!") `shouldBe` [CC.LetterH, CC.LetterI, CC.ExclamationMark] it "upper" $ do let f x = CaseRefinement.toCaselessCharList (x :: ASCII'upper Text) f (asciiCaseUnsafe "HI!") `shouldBe` [CC.LetterH, CC.LetterI, CC.ExclamationMark] describe "substituteString" $ do it "lower" $ do let f x = CaseRefinement.substituteString x :: ASCII'lower Text f "Cób" `shouldBe` asciiCaseUnsafe "\SUB\SUBb" it "upper" $ do let f x = CaseRefinement.substituteString x :: ASCII'upper Text f "Cób" `shouldBe` asciiCaseUnsafe "C\SUB\SUB" describe "validateString" $ do it "lower" $ do let f x = CaseRefinement.validateString x :: Maybe (ASCII'lower Text) f "hello" `shouldBe` Just (asciiCaseUnsafe "hello") f "Hello" `shouldBe` Nothing it "upper" $ do let f x = CaseRefinement.validateString x :: Maybe (ASCII'upper Text) f "HELLO" `shouldBe` Just (asciiCaseUnsafe "HELLO") f "Hello" `shouldBe` Nothing