{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE ScopedTypeVariables #-} module CheckTableProperties ( checkTableProperties ) where import Core.Text import Control.DeepSeq (force) import Control.Exception (evaluate) import Test.Hspec import FormatDocument (markdownToPandoc) import PandocToMarkdown (NotSafe, Rectangle(..), rectanglerize , combineRectangles, buildRow, pandocToMarkdown, heightOf , tableToMarkdown) import Text.Pandoc (Block(..), Inline(..), Alignment(..)) notsafe :: Selector NotSafe notsafe = const True checkTableProperties :: Spec checkTableProperties = do describe "Table rendering code" $ do it "Making wrapped text into rectangles" $ rectanglerize 6 AlignLeft "First Name" `shouldBe` Rectangle 6 2 [ "First " , "Name " ] it "Rectanglerizing a block with too long lines should throw" $ (evaluate . force) (rectanglerize 7 AlignLeft "Borough of Kensington") `shouldThrow` notsafe it "Two rectangles of equal size combine" $ let rect1 = rectanglerize 8 AlignLeft "This is a test" rect2 = rectanglerize 8 AlignLeft "Ode to Joy" result = combineRectangles rect1 rect2 in do heightOf rect1 `shouldBe` 2 heightOf rect2 `shouldBe` 2 heightOf result `shouldBe` 2 result `shouldBe` Rectangle 16 2 [ "This is Ode to " , "a test Joy " ] it "Two rectangles of unequal size combine (1)" $ let -- 1234567890 rect1 = rectanglerize 10 AlignLeft "Emergency Broadcast System" rect2 = rectanglerize 10 AlignLeft "Ode to Joy is nice" result = combineRectangles rect1 rect2 in do heightOf rect1 `shouldBe` 3 heightOf rect2 `shouldBe` 2 heightOf result `shouldBe` 3 result `shouldBe` Rectangle 20 3 [ "Emergency Ode to Joy" , "Broadcast is nice " , "System " ] it "Two rectangles of unequal size combine (2)" $ let -- 1234567890 rect3 = rectanglerize 10 AlignLeft "This is an emergency" rect4 = rectanglerize 10 AlignLeft "Ode to Joy is nice piece that lots play" result = combineRectangles rect3 rect4 in do heightOf rect3 `shouldBe` 2 heightOf rect4 `shouldBe` 4 heightOf result `shouldBe` 4 result `shouldBe` Rectangle 20 4 [ "This is anOde to Joy" , "emergency is nice " , " piece that" , " lots play " ] it "Given several cells, builds a row" $ let cell1 = Rectangle 10 3 [ "This is an" , "emergency " , "no problem" ] cell2 = Rectangle 10 4 [ "Ode to Joy" , "is nice " , "piece that" , "lots play "] result = buildRow [10,10] [cell1,cell2] in do result `shouldBe` "This is an Ode to Joy\n" <> "emergency is nice \n" <> "no problem piece that\n" <> " lots play " it "Header rows format" $ let result = tableToMarkdown [] [AlignLeft, AlignLeft, AlignLeft] [0.3,0.3,0.3] [ [Plain [Str "First"]] , [Plain [Str "Second"]] , [Plain [Str "Third"]] ] [] in do result `shouldBe` [quote| ----------------------------------------------------------------------- First Second Third ----------------------- ----------------------- ----------------------- ----------------------------------------------------------------------- |] it "A minimal complete example reformats properly" $ let table = [quote| | First | Second | Third | |------:|:----:|---------| | 1 | 2 | 3 | |] in do doc <- markdownToPandoc table let result = pandocToMarkdown doc result `shouldBe` [quote| -------------------------------------------- First Second Third -------------- -------------- -------------- 1 2 3 -------------------------------------------- |]