haddock2/test/Spec.hs

42 lines
1.2 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-orphans #-}
import Test.Hspec
import Identifier (Identifier)
import Lexer
import Parser
import Types
import Data.String (IsString (..))
import Data.Text (Text)
import Text.Parsec.Pos
shouldParseTo :: Text -> DocMarkup mod Identifier -> Expectation
shouldParseTo input ast = parseText input `shouldBe` ast
type Doc id = DocMarkup () id
instance IsString (Doc String) where
fromString = DocString
main :: IO ()
main = hspec $ do
describe "Lexer" do
it "bare string" do
"some string" `shouldLexTo` [(1, 1, Token "some"), (1, 5, Space), (1, 6, Token "string")]
it "emphasis" do
"has /emphatic/ content" `shouldLexTo` replicate 7 (0, 0, Space)
describe "Parser" do
it "Bold" do
"__bold__" `shouldParseTo` (DocBold (DocString "bold"))
it "Emphasis" do
"/emphasis/" `shouldParseTo` (DocEmphasis (DocString "emphasis"))
shouldLexTo :: String -> [(Int, Int, Token)] -> Expectation
shouldLexTo input expected =
case lexer input of
Right tokens -> do
let actual = map (\(pos, tok) -> (sourceLine pos, sourceColumn pos, tok)) tokens
actual `shouldBe` expected
Left err -> expectationFailure $ "Parse error: " <> show err