unicode-data-0.3.0: test/Unicode/CharSpec.hs
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE CPP #-}
module Unicode.CharSpec
( spec
) where
import qualified Data.Char as Char
import qualified Unicode.Char as UChar
-- [TODO] Remove the following qualified imports once isLetter and isSpace
-- are removed from Unicode.Char.General
import qualified Unicode.Char.General.Compat as UCharCompat
-- [TODO] Remove the following qualified imports once isUpper and isLower
-- are removed from Unicode.Char.Case
import qualified Unicode.Char.Case.Compat as UCharCompat
import Data.Foldable (traverse_)
import Test.Hspec
{- [NOTE]
These tests may fail if the compiler’s Unicode version
does not match the version of this package.
+-------------+----------------+-----------------+
| GHC version | @base@ version | Unicode version |
+=============+================+=================+
| 8.8 | 4.13 | 12.0 |
| 8.10.[1-4] | 4.14.{0,1} | 12.0 |
| 8.10.5+ | 4.14.2+ | 13.0 |
| 9.0.1 | 4.15.0 | 12.1 |
| 9.2.1 | 4.16.0 | 14.0 |
+-------------+----------------+-----------------+
-}
spec :: Spec
spec = do
#ifdef COMPATIBLE_GHC_UNICODE
let describe' = describe
#else
let describe' t = before_ (pendingWith "Incompatible GHC Unicode version")
. describe t
#endif
describe' "Unicode general categories" do
it "generalCategory" do
-- Note: we cannot compare the categories directly, so use 'show'.
(show . UChar.generalCategory) `shouldBeEqualTo` (show . Char.generalCategory)
describe' "Character classification" do
it "isAlpha" do
UChar.isAlpha `shouldBeEqualTo` Char.isAlpha
it "isAlphaNum" do
UChar.isAlphaNum `shouldBeEqualTo` Char.isAlphaNum
it "isControl" do
UChar.isControl `shouldBeEqualTo` Char.isControl
it "isLetter" do
UCharCompat.isLetter `shouldBeEqualTo` Char.isLetter
it "isMark" do
UChar.isMark `shouldBeEqualTo` Char.isMark
it "isNumber" do
UChar.isNumber `shouldBeEqualTo` Char.isNumber
it "isPrint" do
UChar.isPrint `shouldBeEqualTo` Char.isPrint
it "isPunctuation" do
UChar.isPunctuation `shouldBeEqualTo` Char.isPunctuation
it "isSeparator" do
UChar.isSeparator `shouldBeEqualTo` Char.isSeparator
it "isSpace" do
UCharCompat.isSpace `shouldBeEqualTo` Char.isSpace
it "isSymbol" do
UChar.isSymbol `shouldBeEqualTo` Char.isSymbol
describe' "Case" do
it "isLower" do
UCharCompat.isLower `shouldBeEqualTo` Char.isLower
it "isUpper" do
UCharCompat.isUpper `shouldBeEqualTo` Char.isUpper
it "toLower" do
UChar.toLower `shouldBeEqualTo` Char.toLower
it "toUpper" do
UChar.toUpper `shouldBeEqualTo` Char.toUpper
it "toTitle" do
UChar.toTitle `shouldBeEqualTo` Char.toTitle
where
shouldBeEqualTo
:: forall a b. (Bounded a, Enum a, Show a, Eq b, Show b)
=> (a -> b)
-> (a -> b)
-> IO ()
shouldBeEqualTo f g =
let same x = f x == g x
in traverse_ (`shouldSatisfy` same) [minBound..maxBound]