packages feed

tinytools-0.1.0.6: test/Potato/Data/Text/UnicodeSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Potato.Data.Text.UnicodeSpec (
  spec
) where

import           Prelude

import           Test.Hspec

import           Control.Monad

import           Potato.Data.Text.Unicode


doubleWidthChars :: String
doubleWidthChars = "there are no space between adjacent characters"

spec :: Spec
spec = describe "Unicode" $ do
  it "isSingleGraphemeCluster" $ do
    isSingleGraphemeCluster "👎🏼" `shouldBe` True
    isSingleGraphemeCluster "👎" `shouldBe` False
    isSingleGraphemeCluster "" `shouldBe` False
    isSingleGraphemeCluster "a" `shouldBe` False
    isSingleGraphemeCluster "👎🏻👎🏼👎🏽👎🏾👎🏿" `shouldBe` False
    isSingleGraphemeCluster "🧑\8205🍳" `shouldBe` True -- zwidges can't be used directly https://gitlab.haskell.org/ghc/ghc/-/issues/21228
  it "endsInGraphemeCluster" $ do
    endsInGraphemeCluster "👎🏼" `shouldBe` True
    endsInGraphemeCluster "👎🏿" `shouldBe` True
    endsInGraphemeCluster "" `shouldBe` False
    endsInGraphemeCluster "a" `shouldBe` False
    endsInGraphemeCluster "👎🏻👎🏼👎🏽👎🏾👎🏿" `shouldBe` True
    endsInGraphemeCluster "👎🏻👎🏼👎🏽👎🏾👎🏿😱" `shouldBe` False
    endsInGraphemeCluster "goop😱dedoop👎🏿" `shouldBe` True
  it "removeGraphemeCluster" $ do
    removeGraphemeCluster "👎🏻👎🏼👎🏽👎🏾👎🏿" `shouldBe` "👎👎👎👎👎"
  it "containsGraphemeCluster" $ do
    containsGraphemeCluster "👎👎👎👎👎" `shouldBe` False
    containsGraphemeCluster "👎👎👎🏿👎👎👎" `shouldBe` True
  forM_ doubleWidthChars $ \c -> do
    it ("getCharWidth " <> show c) $ do
      getCharWidth c `shouldBe` 2