packages feed

unicode-data-security-0.1.0: test/Unicode/Char/Identifiers/SecuritySpec.hs

{-# LANGUAGE BlockArguments, OverloadedLists #-}

module Unicode.Char.Identifiers.SecuritySpec
  ( spec
  ) where

import Control.Monad (when)
import Data.Foldable (traverse_)
import Unicode.Char.Identifiers.Security
import Test.Hspec

spec :: Spec
spec = do
    describe "identifierTypes" do
        it "some values" do
            let check ts = (ts ==) . identifierTypes
            minBound  `shouldSatisfy` check [NotCharacter]
            maxBound  `shouldSatisfy` check [NotCharacter]
            '1'       `shouldSatisfy` check [Recommended]
            'a'       `shouldSatisfy` check [Recommended]
            '\x0149'  `shouldSatisfy` check [Deprecated]
            '\x00AD'  `shouldSatisfy` check [DefaultIgnorable]
            '\x1F240' `shouldSatisfy` check [NotNFKC]
            '\x1F4FF' `shouldSatisfy` check [NotXID]
            '\x082C'  `shouldSatisfy` check [Exclusion]
            '\x1680'  `shouldSatisfy` check [Exclusion, NotXID]
            '\x01B9'  `shouldSatisfy` check [Obsolete]
            '\x05C6'  `shouldSatisfy` check [Obsolete, NotXID]
            '\x0234'  `shouldSatisfy` check [Technical]
            '\x2CF1'  `shouldSatisfy` check [Technical, Exclusion]
            '\x20E4'  `shouldSatisfy` check [Technical, NotXID]
            '\x018D'  `shouldSatisfy` check [Technical, Obsolete]
            '\x2E00'  `shouldSatisfy` check [Technical, Obsolete, NotXID]
            '\x018E'  `shouldSatisfy` check [UncommonUse]
            '\x16A40' `shouldSatisfy` check [UncommonUse, Exclusion]
            '\x05A2'  `shouldSatisfy` check [UncommonUse, Obsolete]
            '\xA8FC'  `shouldSatisfy` check [UncommonUse, Obsolete, NotXID]
            '\x025B'  `shouldSatisfy` check [UncommonUse, Technical]
            '\x1D1DE' `shouldSatisfy` check [UncommonUse, Technical, NotXID]
            '\x07FD'  `shouldSatisfy` check [LimitedUse]
            '\xA9CF'  `shouldSatisfy` check [LimitedUse, Exclusion]
            '\x070F'  `shouldSatisfy` check [LimitedUse, NotXID]
            '\x07FA'  `shouldSatisfy` check [LimitedUse, Obsolete]
            '\x1B6B'  `shouldSatisfy` check [LimitedUse, Technical]
            '\x2019'  `shouldSatisfy` check [Inclusion]
            '\x018F'  `shouldSatisfy` check [Recommended]
        it "invariants" do
            let {
                check c = do
                    let ts = identifierTypes c
                    when (NotCharacter     `elem` ts) (ts `shouldBe` [NotCharacter])
                    when (Deprecated       `elem` ts) (ts `shouldBe` [Deprecated])
                    when (DefaultIgnorable `elem` ts) (ts `shouldBe` [DefaultIgnorable])
                    when (NotNFKC          `elem` ts) (ts `shouldBe` [NotNFKC])
                    when (Recommended      `elem` ts) (ts `shouldBe` [Recommended])
                    when (Inclusion        `elem` ts) (ts `shouldBe` [Inclusion])
            }
            -- [TODO] more invariants
            traverse_ check (enumFromTo minBound maxBound)
    it "Identifier status is consistent with identifier types" do
        let checkChar c = all (== isAllowedInIdentifier c)
                              (isIdentifierTypeAllowed <$> identifierTypes c)
        traverse_ (`shouldSatisfy` checkChar) (enumFromTo minBound maxBound)