module Data.Text.ParagraphLayout.Internal.TextContainerSpec (spec) where
import Data.Text (Text, empty, pack)
import Data.Text.Glyphize (Direction(..))
import Test.Hspec
import Data.Text.ParagraphLayout.Internal.Run
import Data.Text.ParagraphLayout.Internal.TextContainer
isSpace :: Char -> Bool
isSpace = (==' ')
inputRuns :: [Run]
inputRuns =
[ Run
-- TODO: We might want both parentheses in the same run.
{ runOffsetInSpan = 0
, runText = pack "Vikipedija ("
, runDirection = Just DirLTR
, runScript = Just "Latn"
}
, Run
{ runOffsetInSpan = 12
, runText = pack "Википедија)"
, runDirection = Just DirLTR
, runScript = Just "Cyrl"
}
]
spec :: Spec
spec = do
describe "splitTextsAt8" $ do
it "negative value splits at beginning of first run" $ do
splitTextsAt8 (-1) inputRuns `shouldBe` ([], inputRuns)
it "zero splits at beginning of first run" $ do
splitTextsAt8 0 inputRuns `shouldBe` ([], inputRuns)
it "splits in first run" $ do
splitTextsAt8 11 inputRuns `shouldBe`
(
[ Run
{ runOffsetInSpan = 0
, runText = pack "Vikipedija "
, runDirection = Just DirLTR
, runScript = Just "Latn"
}
]
,
[ Run
{ runOffsetInSpan = 11
, runText = pack "("
, runDirection = Just DirLTR
, runScript = Just "Latn"
}
, Run
{ runOffsetInSpan = 12
, runText = pack "Википедија)"
, runDirection = Just DirLTR
, runScript = Just "Cyrl"
}
]
)
it "split at run edges does not generate extra run" $ do
splitTextsAt8 12 inputRuns `shouldBe`
(take 1 inputRuns, drop 1 inputRuns)
it "splits in second run" $ do
splitTextsAt8 20 inputRuns `shouldBe`
(
[ Run
{ runOffsetInSpan = 0
, runText = pack "Vikipedija ("
, runDirection = Just DirLTR
, runScript = Just "Latn"
}
, Run
{ runOffsetInSpan = 12
, runText = pack "Вики"
, runDirection = Just DirLTR
, runScript = Just "Cyrl"
}
]
,
[ Run
{ runOffsetInSpan = 20
, runText = pack "педија)"
, runDirection = Just DirLTR
, runScript = Just "Cyrl"
}
]
)
it "split at end does not generate extra run" $ do
splitTextsAt8 33 inputRuns `shouldBe` (inputRuns, [])
it "large value splits at end of last run" $ do
splitTextsAt8 999 inputRuns `shouldBe` (inputRuns, [])
describe "trimTextsEnd" $ do
describe "isSpace" $ do
it "does nothing on an empty list" $ do
let inputTexts = [] :: [Text]
trimTextsEnd isSpace inputTexts `shouldBe` inputTexts
it "does nothing when last run does not end with space" $ do
let inputTexts = [pack "some ", pack "text"]
trimTextsEnd isSpace inputTexts `shouldBe` inputTexts
it "trims empty texts down to an empty list" $ do
let inputTexts = [empty, empty, empty]
trimTextsEnd isSpace inputTexts `shouldBe` []
it "trims empty texts from a list" $ do
let inputTexts = [pack "some ", pack "text", empty, empty]
trimTextsEnd isSpace inputTexts `shouldBe`
[pack "some ", pack "text"]
it "trims spaces from last text" $ do
let inputTexts = [pack "some ", pack "text "]
trimTextsEnd isSpace inputTexts `shouldBe`
[pack "some ", pack "text"]
it "trims texts containing only spaces" $ do
let inputTexts = [pack "some ", pack "text", pack " "]
trimTextsEnd isSpace inputTexts `shouldBe`
[pack "some ", pack "text"]
it "trims last text that contains non-spaces" $ do
let inputTexts = [pack "some ", pack "text ", pack " "]
trimTextsEnd isSpace inputTexts `shouldBe`
[pack "some ", pack "text"]