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"]