git.iko.soy/typeable/pandoc
on 99aba1e help sign in
106 lines 4.1 kB history raw
1{-# Language OverloadedStrings #-}
2module Tests.Lua ( tests ) where
4import Control.Monad (when)
5import System.FilePath ((</>))
6import Test.Tasty (TestTree, localOption)
7import Test.Tasty.HUnit (Assertion, assertEqual, testCase)
8import Test.Tasty.QuickCheck (ioProperty, testProperty, QuickCheckTests(..))
9import Text.Pandoc.Arbitrary ()
10import Text.Pandoc.Builder ( (<>), bulletList, doc, doubleQuoted, emph
11 , linebreak, rawBlock, singleQuoted, para, plain
12 , space, str, strong)
13import Text.Pandoc.Class (runIOorExplode)
14import Text.Pandoc.Definition (Block, Inline, Meta, Pandoc)
15import Text.Pandoc.Lua
17import Foreign.Lua
19tests :: [TestTree]
20tests = map (localOption (QuickCheckTests 20))
21 [ testProperty "inline elements can be round-tripped through the lua stack" $
22 \x -> ioProperty (roundtripEqual (x::Inline))
24 , testProperty "block elements can be round-tripped through the lua stack" $
25 \x -> ioProperty (roundtripEqual (x::Block))
27 , testProperty "meta blocks can be round-tripped through the lua stack" $
28 \x -> ioProperty (roundtripEqual (x::Meta))
30 , testProperty "documents can be round-tripped through the lua stack" $
31 \x -> ioProperty (roundtripEqual (x::Pandoc))
33 , testCase "macro expansion via filter" $
34 assertFilterConversion "a '{{helloworld}}' string is expanded"
35 "strmacro.lua"
36 (doc . para $ str "{{helloworld}}")
37 (doc . para . emph $ str "Hello, World")
39 , testCase "convert all plains to paras" $
40 assertFilterConversion "plains become para"
41 "plain-to-para.lua"
42 (doc $ bulletList [plain (str "alfa"), plain (str "bravo")])
43 (doc $ bulletList [para (str "alfa"), para (str "bravo")])
45 , testCase "make hello world document" $
46 assertFilterConversion "Document contains 'Hello, World!'"
47 "hello-world-doc.lua"
48 (doc . para $ str "Hey!" <> linebreak <> str "What's up?")
49 (doc . para $ str "Hello," <> space <> str "World!")
51 , testCase "implicit doc filter" $
52 assertFilterConversion "Document contains 'Hello, World!'"
53 "implicit-doc-filter.lua"
54 (doc . plain $ linebreak)
55 (doc . para $ str "Hello," <> space <> str "World!")
57 , testCase "parse raw markdown blocks" $
58 assertFilterConversion "raw markdown block is converted"
59 "markdown-reader.lua"
60 (doc $ rawBlock "markdown" "*charly* **delta**")
61 (doc . para $ emph "charly" <> space <> strong "delta")
63 , testCase "allow shorthand functions for quote types" $
64 assertFilterConversion "single quoted becomes double quoted string"
65 "single-to-double-quoted.lua"
66 (doc . para . singleQuoted $ str "simple")
67 (doc . para . doubleQuoted $ str "simple")
69 , testCase "Count inlines via metatable catch-all" $
70 assertFilterConversion "filtering with metatable catch-all failed"
71 "metatable-catch-all.lua"
72 (doc . para $ "four words, three spaces")
73 (doc . para $ str "7")
75 , testCase "Count blocks via Block-specific catch-all" $
76 assertFilterConversion "filtering with Block catch-all failed"
77 "block-count.lua"
78 (doc $ para "one" <> para "two")
79 (doc $ para "2")
80 ]
82assertFilterConversion :: String -> FilePath -> Pandoc -> Pandoc -> Assertion
83assertFilterConversion msg filterPath docIn docExpected = do
84 docEither <- runIOorExplode $
85 runLuaFilter (Just "../data") ("lua" </> filterPath) [] docIn
86 case docEither of
87 Left _ -> fail "lua filter failed"
88 Right docRes -> assertEqual msg docExpected docRes
90roundtripEqual :: (Eq a, FromLuaStack a, ToLuaStack a) => a -> IO Bool
91roundtripEqual x = (x ==) <$> roundtripped
92 where
93 roundtripped :: (FromLuaStack a, ToLuaStack a) => IO a
94 roundtripped = runLua $ do
95 openlibs
96 pushPandocModule (Just "../data")
97 setglobal "pandoc"
98 oldSize <- gettop
99 push x
100 size <- gettop
101 when ((size - oldSize) /= 1) $
102 error ("not exactly one additional element on the stack: " ++ show size)
103 res <- peekEither (-1)
104 case res of
105 Left _ -> error "could not read from stack"
106 Right y -> return y