packages feed

DocTest-0.0.0: Test/DocTest/Parser.hs

module Test.DocTest.Parser (parseModule) where

import System.IO
import Language.Haskell.Parser hiding (parseModule)
import Language.Haskell.Syntax
import Text.ParserCombinators.Parsec
import Test.DocTest
import Test.DocTest.Error
import Data.List

parseModule :: FilePath -> IO [DocTest]
parseModule fileName = do
	moduleSource <- readFile fileName

	let moduleName =
		case (parseModuleWithMode (ParseMode fileName) moduleSource) of
			ParseFailed l m								-> reportError (Error l m)
			ParseOk (HsModule _ (Module name) _ _ _)	-> name

	docTests <-
		case (parse manyTestsParser fileName moduleSource) of
			--Left  e -> error ("parse error at " ++ show e)
			Left  e	-> reportError (toError e)
			Right x	-> return x

	return
		(
			map
			(\(expression, result) -> DocTest fileName moduleName expression result)
			docTests
		)

-- Parser

tillEndOfLine :: Parser String
tillEndOfLine = manyTill anyChar newline

commentLine :: Parser String
commentLine = do
	{
		  string "-- "
		; tillEndOfLine
	}

commentLines :: Parser [String]
commentLines = many1 commentLine

docTestStart = string "-- > "

singelTestParser :: Parser (String, String) 
singelTestParser = do
	{
		  manyTill anyChar (try docTestStart)
		; expression	<- tillEndOfLine
		; result		<- commentLines
		; return (expression, (intercalate "\n" result))
	}

manyTestsParser = (many (try singelTestParser))