packages feed

titlecase-1: tests/Unit.hs

module Unit where

import Data.Text.Titlecase
import qualified Data.Text.Titlecase.Internal as Titlecase
import Data.Text.Titlecase.Internal hiding (articles, conjunctions, prepositions)

import Test.Tasty
import Test.Tasty.HUnit
import Data.Char ( toLower )

tests :: TestTree
tests = testGroup "Unit tests" [articles, conjunctions, prepositions]

articles :: TestTree
articles = testGroup "Articles" [articleFirst, articleLast, articleIgnored]

conjunctions :: TestTree
conjunctions = testGroup "Conjunctions" [conjunctionFirst, conjunctionLast, conjunctionIgnored]

prepositions :: TestTree
prepositions = testGroup "Prepositions" [prepositionFirst, prepositionLast, prepositionIgnored]

testTitlecase, testFirst, testLast, testIgnored :: String -> Assertion
testTitlecase t = titlecase (map toLower t) @?= t

toTitleFirst :: String -> String
toTitleFirst t = unwords $ case words t of
  []     -> []
  (x:xs) -> toTitle x : xs

toTitleLast :: String -> String
toTitleLast t = unwords $ go $ words t
  where
    go []     = []
    go [x]    = [toTitle x]
    go (x:xs) = x : go xs

testFirst   t = testTitlecase $ toTitleFirst t <#> "Is First, so It Is Capitalized"
testLast    t = testTitlecase $ "This Sentence Capitalizes" <#> toTitleLast t
testIgnored t = testTitlecase $ "This Sentence Keeps" <#> t <#> "As Is"

articleFirst, articleLast, articleIgnored :: TestTree
articleFirst   = testCase "article is first"   $ mapM_ (testFirst   . unArticle) Titlecase.articles
articleLast    = testCase "article is last"    $ mapM_ (testLast    . unArticle) Titlecase.articles
articleIgnored = testCase "article is ignored" $ mapM_ (testIgnored . unArticle) Titlecase.articles

conjunctionFirst, conjunctionLast, conjunctionIgnored :: TestTree
conjunctionFirst   = testCase "conjunction is first"   $ mapM_ (testFirst   . unConjunction) Titlecase.conjunctions
conjunctionLast    = testCase "conjunction is last"    $ mapM_ (testLast    . unConjunction) Titlecase.conjunctions
conjunctionIgnored = testCase "conjunction is ignored" $ mapM_ (testIgnored . unConjunction) Titlecase.conjunctions

prepositionFirst, prepositionLast, prepositionIgnored :: TestTree
prepositionFirst   = testCase "preposition is first"   $ mapM_ (testFirst   . unPreposition) Titlecase.prepositions
prepositionLast    = testCase "preposition is last"    $ mapM_ (testLast    . unPreposition) Titlecase.prepositions
prepositionIgnored = testCase "preposition is ignored" $ mapM_ (testIgnored . unPreposition) Titlecase.prepositions