{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Z.Data.Text.ExtraSpec where
import qualified Data.List as List
import Data.Word
import qualified Z.Data.Text.Base as T
import qualified Z.Data.Text.Extra as T
import Test.QuickCheck
import Test.QuickCheck.Function
import Test.QuickCheck.Property
import Test.Hspec
import Test.Hspec.QuickCheck
spec :: Spec
spec = describe "text-extra" $ do
describe "T.cons" $ do
prop "T.cons == List.(:)" $ \ xs x ->
(T.cons x $ T.pack xs) === (T.pack . (:) x $ xs)
describe "T.snoc" $ do
prop "T.snoc == List.++" $ \ xs x ->
((`T.snoc` x) $ T.pack xs) === (T.pack . (++ [x]) $ xs)
describe "Text.headMaybe" $ do
prop "T.headMaybe === Just . list.head" $ \ (NonEmpty xs) ->
(T.headMaybe $ T.pack xs) === (Just . List.head $ xs)
describe "T.initMayEmpty" $ do
prop "T.initMayEmpty === List.init" $ \ (NonEmpty xs) ->
(T.initMayEmpty $ T.pack xs) === (T.pack . List.init $ xs)
describe "T.lastMaybe" $ do
prop "T.lastMaybe === Just . list.last" $ \ (NonEmpty xs) ->
(T.lastMaybe $ T.pack xs) === (Just . List.last $ xs)
describe "T.tailMayEmpty" $ do
prop "T.tailMayEmpty === List.tail" $ \ (NonEmpty xs) ->
(T.tailMayEmpty $ T.pack xs) === (T.pack . List.tail $ xs)
describe "T.take" $ do
prop "T.take == List.take" $ \ xs x ->
(T.take x $ T.pack xs) === (T.pack . List.take x $ xs)
describe "T.takeR" $ do
prop "T.takeR x == List.reverse . List.take x . List.reverse" $ \ xs x ->
(T.takeR x $ T.pack xs) ===
(T.pack . List.reverse . List.take x . List.reverse $ xs)
describe "T.drop" $ do
prop "T.drop == List.drop" $ \ xs x ->
(T.drop x $ T.pack xs) === (T.pack . List.drop x $ xs)
describe "T.dropR" $ do
prop "T.dropR x == List.reverse . List.drop x . List.reverse" $ \ xs x ->
(T.dropR x $ T.pack xs) ===
(T.pack . List.reverse . List.drop x . List.reverse $ xs)
describe "T.slice x y" $ do
prop "T.slice x y === drop x . take (x+y)" $ \ x y xs ->
(T.slice x y $ T.pack xs) === (T.pack . drop x . take (x+y) $ xs)
describe "T.splitAt" $ do
prop "T.splitAt == List.splitAt" $ \ xs x ->
(T.splitAt x $ T.pack xs) ===
(let (a,b) = List.splitAt x $ xs in (T.pack a, T.pack b))
describe "T.takeWhile" $ do
prop "T.takeWhile == List.takeWhile" $ \ xs (Fun _ x) ->
(T.takeWhile x $ T.pack xs) ===
(T.pack . List.takeWhile x $ xs)
describe "T.takeWhileR" $ do
prop "T.takeWhileR == reverse . List.takeWhile . reverse" $ \ xs (Fun _ x) ->
(T.takeWhileR x $ T.pack xs) ===
(T.pack . List.reverse . List.takeWhile x $ List.reverse xs)
describe "T.dropWhile" $ do
prop "T.dropWhile == List.dropWhile" $ \ xs (Fun _ x) ->
(T.dropWhile x $ T.pack xs) === (T.pack . List.dropWhile x $ xs)
describe "T.dropWhileR" $ do
prop "T.dropWhileR == reverse . List.dropWhile . reverse" $ \ xs (Fun _ x) ->
(T.dropWhileR x $ T.pack xs) ===
(T.pack . List.reverse . List.dropWhile x $ List.reverse xs)
describe "T.break" $ do
prop "T.break == List.break" $ \ xs (Fun _ x) ->
(T.break x $ T.pack xs) ===
(let (a,b) = List.break x xs in (T.pack a, T.pack b))
describe "T.breakOn" $ do
prop "T.breakOn rules" $ \ xs ys ->
(let (a, b) = T.breakOn (T.pack xs) $ T.pack ys
in (a `T.append` b, T.pack xs `T.isPrefixOf` b || T.null b) === (T.pack ys, True))
describe "T.span" $ do
prop "T.span == List.span" $ \ xs (Fun _ x) ->
(T.span x $ T.pack xs) ===
(let (a,b) = List.span x $ xs in (T.pack a, T.pack b))
describe "T.breakR" $ do
prop "T.breakR == List.break in reverse driection" $ \ xs (Fun _ x) ->
(T.breakR x $ T.pack xs) ===
(let (b,a) = List.break x . List.reverse $ xs
in (T.reverse $ T.pack a, T.reverse $ T.pack b))
describe "T.spanR" $ do
prop "T.spanR == List.span in reverse driection" $ \ xs (Fun _ x) ->
(T.spanR x $ T.pack xs) ===
(let (b,a) = List.span x . List.reverse $ xs
in (T.reverse $ T.pack a, T.reverse $ T.pack b))
describe "T.group" $ do
prop "T.group == List.group" $ \ xs ->
(T.group $ T.pack xs) === (T.pack <$> List.group xs)
describe "T.groupBy" $ do
prop "T.groupBy == List.groupBy" $ \ xs x ->
(T.groupBy (applyFun2 x) $ T.pack xs) ===
(T.pack <$> List.groupBy (applyFun2 x) xs)
describe "T.stripPrefix" $ do
prop "T.stripPrefix a (a+b) = b " $ \ xs ys ->
(T.stripPrefix (T.pack xs) . T.pack $ xs++ys) ===
(Just $ T.pack ys)
describe "T.stripSuffix" $ do
prop "T.stripSuffix b (a+b) = a " $ \ xs ys ->
(T.stripSuffix (T.pack xs) . T.pack $ ys++xs) ===
(Just $ T.pack ys)
describe "T.isInfixOf" $ do
prop "T.isInfixOf b (a+b+c) = True" $ \ xs ys zs ->
(T.isInfixOf (T.pack xs) . T.pack $ ys++xs++zs) === True
describe "T.commonPrefix" $ do
prop "let (c,a,b) = T.commonPrefix x y in (a,b) = (stripPrefix c x,stripPrefix c y)" $ \ xs ys ->
let (c,a,b) = T.commonPrefix (T.pack xs) $ T.pack ys
Just xs' = T.stripPrefix c $ T.pack xs
Just ys' = T.stripPrefix c $ T.pack ys
in (a,b) === (xs', ys')
describe "T.intercalate" $ do
prop "T.intercalate [x] . split x == id" $ \ xs x ->
(T.intercalate (T.singleton x) . T.split x $ T.pack xs) === T.pack xs
describe "T.intercalate" $ do
prop "T.intercalate x . splitOn x == id" $ \ xs x ->
(T.intercalate (T.pack x) . T.splitOn (T.pack x) $ T.pack xs) ===
T.pack xs
describe "T.words" $ do
prop "T.words === List.words" $ \ xs ->
(T.words $ T.pack xs) === (T.pack <$> List.words xs)
describe "T.lines" $ do
prop "T.lines === List.lines" $ \ xs ->
(T.lines $ T.pack xs) === (T.pack <$> List.lines xs)
describe "T.unwords" $ do
prop "T.unwords === List.unwords" $ \ xs ->
(T.unwords $ List.map T.pack xs) === (T.pack $ List.unwords xs)
describe "T.unlines" $ do
prop "T.unlines === List.unlines" $ \ (NonEmpty xs) ->
(T.unlines $ List.map T.pack xs) <> (T.pack "\n") === (T.pack $ List.unlines xs)
describe "T.padLeft" $ do
prop "T.padLeft n x xs = if l >= n then xs else replicate (n-l) x ++ xs" $ \ xs n x ->
(T.padLeft n x $ T.pack xs) ===
(let l = List.length xs
in if l >= n then T.pack xs
else T.pack $ (List.replicate (n-l) x ++ xs))
describe "T.padRight" $ do
prop "T.padRight n x xs = if l >= n then xs else xs ++ List.replicate (n-l) x" $ \ xs n x ->
(T.padRight n x $ T.pack xs) ===
(let l = List.length xs
in if l >= n then T.pack xs
else T.pack $ xs ++ (List.replicate (n-l) x))
describe "T.reverse" $ do
prop "reverse . pack === packR XX" $ \ xs ->
(T.reverse $ T.pack xs) === (T.packR xs)
prop "unpack reverse === List.reverse" $ \ xs ->
(T.unpack . T.reverse $ T.pack xs) === (List.reverse xs)
describe "T.intersperse" $ do
prop "T.intersperse === List.intersperse" $ \ xs x ->
(T.intersperse x $ T.pack xs) ===
(T.pack . List.intersperse x $ xs)
describe "T.intercalate" $ do
prop "T.intercalate === List.intercalate" $ \ xs ys ->
(T.intercalate (T.pack ys) $ List.map T.pack xs) ===
(T.pack . List.intercalate ys $ xs)
describe "T.intercalateElem" $ do
prop "T.intercalateElem x === List.intercalate [x]" $ \ xs x ->
(T.intercalateElem x $ List.map T.pack xs) ===
(T.pack . List.intercalate [x] $ xs)
describe "T.transpose" $ do
prop "T.transpose === List.transpose" $ \ xss ->
(T.transpose $ List.map T.pack xss) === (List.map T.pack $ List.transpose xss)