{-# LANGUAGE OverloadedStrings #-} module Block ( blockSpecs ) where import Test.Hspec import Data.Text (Text) import Data.Conduit import qualified Data.Conduit.List as CL import Text.Markdown (def, MarkdownSettings(..)) import Text.Markdown.Block import Data.Functor.Identity (runIdentity) checkWith :: MarkdownSettings -> Text -> [Block Text] -> Expectation checkWith ms md blocks = runIdentity (yield md $$ toBlocks ms =$ CL.consume) `shouldBe` blocks check :: Text -> [Block Text] -> Expectation check = checkWith def blockSpecs :: Spec blockSpecs = do describe "tilde code" $ do it "simple" $ check "~~~haskell\nfoo\n\nbar\n~~~" [BlockCode (Just "haskell") "foo\n\nbar"] it "no lang" $ check "~~~\nfoo\n\nbar\n~~~" [BlockCode Nothing "foo\n\nbar"] it "no close" $ check "~~~\nfoo\n\nbar\n" [BlockPara " ~~~\nfoo", BlockPara "bar"] describe "list" $ do it "simple unordered" $ check "* foo\n\n* bar\n\n*\t\tqux" [ BlockList Unordered (Right [BlockPara "foo"]) , BlockList Unordered (Right [BlockPara "bar"]) , BlockList Unordered (Right [BlockPara "qux"]) ] it "simple ordered" $ check "1. foo\n\n3. bar\n\n17.\t\tqux" [ BlockList Ordered (Right [BlockPara "foo"]) , BlockList Ordered (Right [BlockPara "bar"]) , BlockList Ordered (Right [BlockPara "qux"]) ] it "nested" $ check "* foo\n* \n 1. bar\n 2. baz" [ BlockList Unordered (Left "foo") , BlockList Unordered (Right [ BlockList Ordered $ Left "bar" , BlockList Ordered $ Left "baz" ]) ] it "with blank" $ check "* foo\n\n bar\n\n* baz" [ BlockList Unordered $ Right [ BlockPara "foo" , BlockPara "bar" ] , BlockList Unordered $ Right [ BlockPara "baz" ] ] it "without whitespace" $ check "*foo\n\n1.bar" [ BlockPara "*foo" , BlockPara "1.bar" ] describe "blockquote" $ do it "simple" $ check "> foo\n>\n> * bar" [ BlockQuote [ BlockPara "foo" , BlockList Unordered $ Left "bar" ] ] it "blank" $ check "> foo\n\n> * bar" [ BlockQuote [BlockPara "foo"] , BlockQuote [BlockList Unordered $ Left "bar"] ] it "require blank before blockquote" $ check "foo\n> bar" [ BlockPara "foo\n> bar" ] it "no blank before blockquote" $ checkWith def { msBlankBeforeBlockquote = False } "foo\n> bar" [ BlockPara "foo", BlockQuote [BlockPara "bar"]] describe "indented code" $ do it "simple" $ check " foo\n bar\n" [ BlockCode Nothing "foo\nbar" ] it "blank" $ check " foo\n\n bar\n" [ BlockCode Nothing "foo\n\nbar" ] it "extra space" $ check " foo\n\n bar\n" [ BlockCode Nothing "foo\n\n bar" ] describe "html" $ do it "simple" $ check "<p>Hello world!</p>" [ BlockHtml "<p>Hello world!</p>" ] it "multiline" $ check "<p>Hello world!\n</p>" [ BlockHtml "<p>Hello world!\n</p>" ]