blob: d692cb0c43588b3936f5ff4183a64aad83db89d0 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
{-# LANGUAGE OverloadedStrings, StandaloneDeriving, FlexibleInstances, UndecidableInstances, IncoherentInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Haddock.ParseSpec (main, spec) where
import Test.Hspec
import RdrName (RdrName)
import DynFlags (DynFlags, defaultDynFlags)
import Haddock.Lex (tokenise)
import qualified Haddock.Parse as Parse
import Haddock.Types
import Outputable (Outputable, showSDoc, ppr)
import Data.Monoid
import Data.String
dynFlags :: DynFlags
dynFlags = defaultDynFlags (error "dynFlags for Haddock tests: undefined")
instance Outputable a => Show a where
show = showSDoc dynFlags . ppr
deriving instance Show a => Show (Doc a)
deriving instance Eq a =>Eq (Doc a)
instance IsString (Doc RdrName) where
fromString = DocString
parseParas :: String -> Maybe (Doc RdrName)
parseParas s = Parse.parseParas $ tokenise dynFlags s (0,0)
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "parseParas" $ do
it "parses a paragraph" $ do
parseParas "foobar" `shouldBe` Just (DocParagraph "foobar\n")
context "when parsing an example" $ do
it "requires an example to be separated from a previous paragrap by an empty line" $ do
parseParas "foobar\n\n>>> fib 10\n55" `shouldBe`
Just (DocParagraph "foobar\n" <> DocExamples [Example "fib 10" ["55"]])
-- parse error
parseParas "foobar\n>>> fib 10\n55" `shouldBe` Nothing
it "parses a result line that only contains <BLANKLINE> as an emptly line" $ do
parseParas ">>> putFooBar\nfoo\n<BLANKLINE>\nbar" `shouldBe`
Just (DocExamples [Example "putFooBar" ["foo","","bar"]])
context "when parsing a code block" $ do
it "requires a code blocks to be separated from a previous paragrap by an empty line" $ do
parseParas "foobar\n\n> some code" `shouldBe`
Just (DocParagraph "foobar\n" <> DocCodeBlock " some code\n")
-- parse error
parseParas "foobar\n> some code" `shouldBe` Nothing
context "when parsing a URL" $ do
it "parses a URL" $ do
parseParas "<http://example.com/>" `shouldBe`
Just (DocParagraph $ hyperlink "http://example.com/" Nothing <> "\n")
it "accepts an optional label" $ do
parseParas "<http://example.com/ some link>" `shouldBe`
Just (DocParagraph $ hyperlink "http://example.com/" (Just "some link") <> "\n")
context "when parsing properties" $ do
it "can parse a single property" $ do
parseParas "prop> 23 == 23" `shouldBe` Just (DocProperty "23 == 23")
it "can parse multiple subsequent properties" $ do
parseParas $ unlines [
"prop> 23 == 23"
, "prop> 42 == 42"
]
`shouldBe` Just (DocProperty "23 == 23" <> DocProperty "42 == 42")
where
hyperlink :: String -> Maybe String -> Doc RdrName
hyperlink url = DocHyperlink . Hyperlink url
|