{-# LANGUAGE OverloadedStrings, OverloadedLists #-} module Text.BBCodeSpec (spec) where import Test.Hspec import Test.Hspec.QuickCheck (prop) import Test.QuickCheck.Instances import Text.BBCode import Data.Text (Text) import Control.Monad (zipWithM_) import Data.Monoid ((<>)) spec :: Spec spec = do zipWithM_ example [1..] examples where example n (s, ts) = let str = "Example " <> show n in specify str (bbcode s == Right ts) examples :: [(Text, DomForest)] examples = [ ("[t]test[/t]" , pure [Element "t" [] [Content "test"]]) , ("[t]te\\st[/t]" , pure [Element "t" [] [Content "te\\st"]]) , ("[t]te\\[st[/t]" , pure [Element "t" [] [Content "te[st"]]) , ("[t]test\\\\[/t]" , pure [Element "t" [] [Content "test\\"]]) , ("[\\t]test[/\\t]" , pure [Element "\\t" [] [Content "test"]]) , ("[t attr]test[/t]" , pure [Element "t" [("attr", "")] [Content "test"]]) , ("[t=attr]test[/t]" , pure [Element "t" [("", "attr")] [Content "test"]]) , ("[t attr=val]test[/t]" , pure [Element "t" [("attr", "val")] [Content "test"]]) , ("[t attr=\"val\"]test[/t]" , pure [Element "t" [("attr", "val")] [Content "test"]]) , ("[t attr=\"va]l\"]test[/t]" , pure [Element "t" [("attr", "va]l")] [Content "test"]]) , ("[t attr=\"va\\\"l\"]test[/t]" , pure [Element "t" [("attr", "va\"l")] [Content "test"]]) , ("[t attr=\"val\" attr2=\"val2\" ]test[/t]" , pure [Element "t" [("attr", "val"), ("attr2", "val2")] [Content "test"]]) , ("[br/]" , pure [Element "br" [] []]) , ("[br attr/]" , pure [Element "br" [("attr", "")] []]) , ("[br=val/]" , pure [Element "br" [("", "val")] []]) , ("[br attr=val/]" , pure [Element "br" [("attr", "val")] []]) , ("[br attr=val val2/]" , pure [Element "br" [("attr", "val"), ("val2", "")] []]) , ("foo\n\nbar" , [[Content "foo"], [Content "bar"]]) , ("[b]foo[/b]\n\n[b]bar[/b]" , [[Element "b" [] [Content "foo"]], [Element "b" [] [Content "bar"]]]) , ("[b]foo[/b][b]bar[/b]" , [[Element "b" [] [Content "foo"], Element "b" [] [Content "bar"]]]) , ("[b]foo[/b]\n" , [[Element "b" [] [Content "foo"]]]) , ("[b]foo[/b] \n" , [[Element "b" [] [Content "foo"], Content " "]]) , ("[b]foo[/b] " , [[Element "b" [] [Content "foo"], Content " "]]) ]