Blame test/Tests/Old.hs

Packit Service d2f85f
module Tests.Old (tests) where
Packit Service d2f85f
Packit Service d2f85f
import Data.Algorithm.Diff
Packit Service d2f85f
import Prelude hiding (readFile)
Packit Service d2f85f
import System.Exit
Packit Service d2f85f
import System.FilePath (joinPath, splitDirectories, (<.>), ())
Packit Service d2f85f
import System.IO.Temp (withTempFile)
Packit Service d2f85f
import System.Process (runProcess, waitForProcess)
Packit Service d2f85f
import Test.Tasty (TestTree, testGroup)
Packit Service d2f85f
import Test.Tasty.Golden.Advanced (goldenTest)
Packit Service d2f85f
import Tests.Helpers hiding (test)
Packit Service d2f85f
import qualified Text.Pandoc.UTF8 as UTF8
Packit Service d2f85f
Packit Service d2f85f
tests :: [TestTree]
Packit Service d2f85f
tests = [ testGroup "markdown"
Packit Service d2f85f
          [ testGroup "writer"
Packit Service d2f85f
            $ writerTests "markdown" ++ lhsWriterTests "markdown"
Packit Service d2f85f
          , testGroup "reader"
Packit Service d2f85f
            [ test "basic" ["-r", "markdown", "-w", "native", "-s"]
Packit Service d2f85f
              "testsuite.txt" "testsuite.native"
Packit Service d2f85f
            , test "tables" ["-r", "markdown", "-w", "native", "--columns=80"]
Packit Service d2f85f
              "tables.txt" "tables.native"
Packit Service d2f85f
            , test "pipe tables" ["-r", "markdown", "-w", "native", "--columns=80"]
Packit Service d2f85f
              "pipe-tables.txt" "pipe-tables.native"
Packit Service d2f85f
            , test "more" ["-r", "markdown", "-w", "native", "-s"]
Packit Service d2f85f
              "markdown-reader-more.txt" "markdown-reader-more.native"
Packit Service d2f85f
            , lhsReaderTest "markdown+lhs"
Packit Service d2f85f
            ]
Packit Service d2f85f
          , testGroup "citations"
Packit Service d2f85f
            [ test "citations" ["-r", "markdown", "-w", "native"]
Packit Service d2f85f
              "markdown-citations.txt" "markdown-citations.native"
Packit Service d2f85f
            ]
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "rst"
Packit Service d2f85f
          [ testGroup "writer" (writerTests "rst" ++ lhsWriterTests "rst")
Packit Service d2f85f
          , testGroup "reader"
Packit Service d2f85f
            [ test "basic" ["-r", "rst+smart", "-w", "native",
Packit Service d2f85f
              "-s", "--columns=80"] "rst-reader.rst" "rst-reader.native"
Packit Service d2f85f
            , test "tables" ["-r", "rst", "-w", "native", "--columns=80"]
Packit Service d2f85f
              "tables.rst" "tables-rstsubset.native"
Packit Service d2f85f
            , lhsReaderTest "rst+lhs"
Packit Service d2f85f
            ]
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "latex"
Packit Service d2f85f
          [ testGroup "writer" (writerTests "latex" ++ lhsWriterTests "latex")
Packit Service d2f85f
          , testGroup "reader"
Packit Service d2f85f
            [ test "basic" ["-r", "latex+raw_tex", "-w", "native", "-s"]
Packit Service d2f85f
              "latex-reader.latex" "latex-reader.native"
Packit Service d2f85f
            , lhsReaderTest "latex+lhs"
Packit Service d2f85f
            ]
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "html"
Packit Service d2f85f
          [ testGroup "writer" (writerTests "html4" ++ writerTests "html5" ++
Packit Service d2f85f
                                lhsWriterTests "html")
Packit Service d2f85f
          , test "reader" ["-r", "html", "-w", "native", "-s"]
Packit Service d2f85f
            "html-reader.html" "html-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "s5"
Packit Service d2f85f
          [ s5WriterTest "basic" ["-s"] "s5"
Packit Service d2f85f
          , s5WriterTest "fancy" ["-s","-m","-i"] "s5"
Packit Service d2f85f
          , s5WriterTest "fragment" [] "html4"
Packit Service d2f85f
          , s5WriterTest "inserts"  ["-s", "-H", "insert",
Packit Service d2f85f
            "-B", "insert", "-A", "insert", "-c", "main.css"] "html4"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "textile"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "textile"
Packit Service d2f85f
          , test "reader" ["-r", "textile", "-w", "native", "-s"]
Packit Service d2f85f
            "textile-reader.textile" "textile-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "docbook"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "docbook4"
Packit Service d2f85f
          , test "reader" ["-r", "docbook", "-w", "native", "-s"]
Packit Service d2f85f
            "docbook-reader.docbook" "docbook-reader.native"
Packit Service d2f85f
          , test "reader" ["-r", "docbook", "-w", "native", "-s"]
Packit Service d2f85f
            "docbook-xref.docbook" "docbook-xref.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "docbook5"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "docbook5"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "jats"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "jats"
Packit Service d2f85f
          , test "reader" ["-r", "jats", "-w", "native", "-s"]
Packit Service d2f85f
            "jats-reader.xml" "jats-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "native"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "native"
Packit Service d2f85f
          , test "reader" ["-r", "native", "-w", "native", "-s"]
Packit Service d2f85f
            "testsuite.native" "testsuite.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "fb2"
Packit Service d2f85f
          [ fb2WriterTest "basic" [] "fb2/basic.markdown" "fb2/basic.fb2"
Packit Service d2f85f
          , fb2WriterTest "titles" [] "fb2/titles.markdown" "fb2/titles.fb2"
Packit Service d2f85f
          , fb2WriterTest "images" [] "fb2/images.markdown" "fb2/images.fb2"
Packit Service d2f85f
          , fb2WriterTest "images-embedded" [] "fb2/images-embedded.html" "fb2/images-embedded.fb2"
Packit Service d2f85f
          , fb2WriterTest "math" [] "fb2/math.markdown" "fb2/math.fb2"
Packit Service d2f85f
          , fb2WriterTest "tables" [] "tables.native" "tables.fb2"
Packit Service d2f85f
          , fb2WriterTest "testsuite" [] "testsuite.native" "writer.fb2"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "mediawiki"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "mediawiki"
Packit Service d2f85f
          , test "reader" ["-r", "mediawiki", "-w", "native", "-s"]
Packit Service d2f85f
            "mediawiki-reader.wiki" "mediawiki-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "vimwiki"
Packit Service d2f85f
          [ test "reader" ["-r", "vimwiki", "-w", "native", "-s"]
Packit Service d2f85f
            "vimwiki-reader.wiki" "vimwiki-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "dokuwiki"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "dokuwiki"
Packit Service d2f85f
          , test "inline_formatting" ["-r", "native", "-w", "dokuwiki", "-s"]
Packit Service d2f85f
            "dokuwiki_inline_formatting.native" "dokuwiki_inline_formatting.dokuwiki"
Packit Service d2f85f
          , test "multiblock table" ["-r", "native", "-w", "dokuwiki", "-s"]
Packit Service d2f85f
            "dokuwiki_multiblock_table.native" "dokuwiki_multiblock_table.dokuwiki"
Packit Service d2f85f
          , test "external images" ["-r", "native", "-w", "dokuwiki", "-s"]
Packit Service d2f85f
            "dokuwiki_external_images.native" "dokuwiki_external_images.dokuwiki"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "opml"
Packit Service d2f85f
          [ test "basic" ["-r", "native", "-w", "opml", "--columns=78", "-s"]
Packit Service d2f85f
             "testsuite.native" "writer.opml"
Packit Service d2f85f
          , test "reader" ["-r", "opml", "-w", "native", "-s"]
Packit Service d2f85f
            "opml-reader.opml" "opml-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "haddock"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "haddock"
Packit Service d2f85f
          , test "reader" ["-r", "haddock", "-w", "native", "-s"]
Packit Service d2f85f
            "haddock-reader.haddock" "haddock-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "txt2tags"
Packit Service d2f85f
          [ test "reader" ["-r", "t2t", "-w", "native", "-s"]
Packit Service d2f85f
              "txt2tags.t2t" "txt2tags.native" ]
Packit Service d2f85f
        , testGroup "epub" [
Packit Service d2f85f
            test "features" ["-r", "epub", "-w", "native"]
Packit Service d2f85f
              "epub/features.epub" "epub/features.native"
Packit Service d2f85f
          , test "wasteland" ["-r", "epub", "-w", "native"]
Packit Service d2f85f
              "epub/wasteland.epub" "epub/wasteland.native"
Packit Service d2f85f
          , test "formatting" ["-r", "epub", "-w", "native"]
Packit Service d2f85f
              "epub/formatting.epub" "epub/formatting.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "twiki"
Packit Service d2f85f
          [ test "reader" ["-r", "twiki", "-w", "native", "-s"]
Packit Service d2f85f
              "twiki-reader.twiki" "twiki-reader.native" ]
Packit Service d2f85f
        , testGroup "tikiwiki"
Packit Service d2f85f
          [ test "reader" ["-r", "tikiwiki", "-w", "native", "-s"]
Packit Service d2f85f
              "tikiwiki-reader.tikiwiki" "tikiwiki-reader.native" ]
Packit Service d2f85f
        , testGroup "other writers" $ map (\f -> testGroup f $ writerTests f)
Packit Service d2f85f
          [ "opendocument" , "context" , "texinfo", "icml", "tei"
Packit Service d2f85f
          , "man" , "plain" , "rtf", "org", "asciidoc", "zimwiki"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "writers-lang-and-dir"
Packit Service d2f85f
          [ test "latex" ["-f", "native", "-t", "latex", "-s"]
Packit Service d2f85f
            "writers-lang-and-dir.native" "writers-lang-and-dir.latex"
Packit Service d2f85f
          , test "context" ["-f", "native", "-t", "context", "-s"]
Packit Service d2f85f
            "writers-lang-and-dir.native" "writers-lang-and-dir.context"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "muse"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "muse"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "ms"
Packit Service d2f85f
          [ testGroup "writer" $ writerTests "ms"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "creole"
Packit Service d2f85f
          [ test "reader" ["-r", "creole", "-w", "native", "-s"]
Packit Service d2f85f
            "creole-reader.txt" "creole-reader.native"
Packit Service d2f85f
          ]
Packit Service d2f85f
        , testGroup "custom writer"
Packit Service d2f85f
          [ test "basic" ["-f", "native", "-t", "../data/sample.lua"]
Packit Service d2f85f
            "testsuite.native" "writer.custom"
Packit Service d2f85f
          , test "tables" ["-f", "native", "-t", "../data/sample.lua"]
Packit Service d2f85f
            "tables.native" "tables.custom"
Packit Service d2f85f
          ]
Packit Service d2f85f
        ]
Packit Service d2f85f
Packit Service d2f85f
-- makes sure file is fully closed after reading
Packit Service d2f85f
readFile' :: FilePath -> IO String
Packit Service d2f85f
readFile' f = do s <- UTF8.readFile f
Packit Service d2f85f
                 return $! (length s `seq` s)
Packit Service d2f85f
Packit Service d2f85f
lhsWriterTests :: String -> [TestTree]
Packit Service d2f85f
lhsWriterTests format
Packit Service d2f85f
  = [ t "lhs to normal" format
Packit Service d2f85f
    , t "lhs to lhs"    (format ++ "+lhs")
Packit Service d2f85f
    ]
Packit Service d2f85f
  where
Packit Service d2f85f
    t n f = test n ["--wrap=preserve", "-r", "native", "-s", "-w", f]
Packit Service d2f85f
             "lhs-test.native" ("lhs-test" <.> f)
Packit Service d2f85f
Packit Service d2f85f
lhsReaderTest :: String -> TestTree
Packit Service d2f85f
lhsReaderTest format =
Packit Service d2f85f
  test "lhs" ["-r", format, "-w", "native"]
Packit Service d2f85f
    ("lhs-test" <.> format) norm
Packit Service d2f85f
   where norm = if format == "markdown+lhs"
Packit Service d2f85f
                   then "lhs-test-markdown.native"
Packit Service d2f85f
                   else "lhs-test.native"
Packit Service d2f85f
Packit Service d2f85f
writerTests :: String -> [TestTree]
Packit Service d2f85f
writerTests format
Packit Service d2f85f
  = [ test "basic"  (opts ++ ["-s"]) "testsuite.native" ("writer" <.> format)
Packit Service d2f85f
    , test "tables" opts             "tables.native"    ("tables" <.> format)
Packit Service d2f85f
    ]
Packit Service d2f85f
  where
Packit Service d2f85f
    opts = ["-r", "native", "-w", format, "--columns=78",
Packit Service d2f85f
            "--variable", "pandoc-version="]
Packit Service d2f85f
Packit Service d2f85f
s5WriterTest :: String -> [String] -> String -> TestTree
Packit Service d2f85f
s5WriterTest modifier opts format
Packit Service d2f85f
  = test (format ++ " writer (" ++ modifier ++ ")")
Packit Service d2f85f
    (["-r", "native", "-w", format] ++ opts)
Packit Service d2f85f
    "s5.native"  ("s5-" ++ modifier <.> "html")
Packit Service d2f85f
Packit Service d2f85f
fb2WriterTest :: String -> [String] -> String -> String -> TestTree
Packit Service d2f85f
fb2WriterTest title opts inputfile normfile =
Packit Service d2f85f
  testWithNormalize (ignoreBinary . formatXML)
Packit Service d2f85f
                    title (["-t", "fb2"]++opts) inputfile normfile
Packit Service d2f85f
  where
Packit Service d2f85f
    formatXML xml = splitTags $ zip xml (drop 1 xml)
Packit Service d2f85f
    splitTags []               = []
Packit Service d2f85f
    splitTags [end]            = fst end : snd end : []
Packit Service d2f85f
    splitTags (('>','<'):rest) = ">\n" ++ splitTags rest
Packit Service d2f85f
    splitTags ((c,_):rest)     = c : splitTags rest
Packit Service d2f85f
    ignoreBinary = unlines . filter (not . startsWith "
Packit Service d2f85f
    startsWith tag str = all (uncurry (==)) $ zip tag str
Packit Service d2f85f
Packit Service d2f85f
-- | Run a test without normalize function, return True if test passed.
Packit Service d2f85f
test :: String    -- ^ Title of test
Packit Service d2f85f
     -> [String]  -- ^ Options to pass to pandoc
Packit Service d2f85f
     -> String    -- ^ Input filepath
Packit Service d2f85f
     -> FilePath  -- ^ Norm (for test results) filepath
Packit Service d2f85f
     -> TestTree
Packit Service d2f85f
test = testWithNormalize id
Packit Service d2f85f
Packit Service d2f85f
-- | Run a test with normalize function, return True if test passed.
Packit Service d2f85f
testWithNormalize  :: (String -> String) -- ^ Normalize function for output
Packit Service d2f85f
                   -> String    -- ^ Title of test
Packit Service d2f85f
                   -> [String]  -- ^ Options to pass to pandoc
Packit Service d2f85f
                   -> String    -- ^ Input filepath
Packit Service d2f85f
                   -> FilePath  -- ^ Norm (for test results) filepath
Packit Service d2f85f
                   -> TestTree
Packit Service d2f85f
testWithNormalize normalizer testname opts inp norm =
Packit Service d2f85f
  goldenTest testname getExpected getActual
Packit Service d2f85f
    (compareValues norm options) updateGolden
Packit Service d2f85f
  where getExpected = normalizer <$> readFile' norm
Packit Service d2f85f
        getActual   =
Packit Service d2f85f
          withTempFile "." "pandoc-test" $ \outputPath hOut -> do
Packit Service d2f85f
            withTempFile "." "pandoc-test" $ \errorPath hErr -> do
Packit Service d2f85f
              pandocPath <- findPandoc
Packit Service d2f85f
              let mbDynlibDir = findDynlibDir (reverse $
Packit Service d2f85f
                                 splitDirectories pandocPath)
Packit Service d2f85f
              let dynlibEnv = case mbDynlibDir of
Packit Service d2f85f
                                   Nothing  -> []
Packit Service d2f85f
                                   Just d   -> [("DYLD_LIBRARY_PATH", d),
Packit Service d2f85f
                                                ("LD_LIBRARY_PATH", d)]
Packit Service d2f85f
              let env = dynlibEnv ++
Packit Service d2f85f
                        [("TMP","."),("LANG","en_US.UTF-8"),("HOME", "./"),
Packit Service d2f85f
                         ("pandoc_datadir","..")]
Packit Service d2f85f
              ph <- runProcess pandocPath options Nothing
Packit Service d2f85f
                    (Just env) Nothing (Just hOut) (Just hErr)
Packit Service d2f85f
              ec <- waitForProcess ph
Packit Service d2f85f
              if ec == ExitSuccess
Packit Service d2f85f
                 then
Packit Service d2f85f
                   -- filter \r so the tests will work on Windows machines
Packit Service d2f85f
                   (filter (/='\r') . normalizer) <$> readFile' outputPath
Packit Service d2f85f
                 else do
Packit Service d2f85f
                   errcontents <- UTF8.readFile errorPath
Packit Service d2f85f
                   fail $ "Pandoc failed with " ++ show ec ++
Packit Service d2f85f
                           if null errcontents
Packit Service d2f85f
                              then ""
Packit Service d2f85f
                              else '\n':errcontents
Packit Service d2f85f
        updateGolden = UTF8.writeFile norm
Packit Service d2f85f
        options = ["--quiet"] ++ [inp] ++ opts
Packit Service d2f85f
Packit Service d2f85f
compareValues :: FilePath -> [String] -> String -> String -> IO (Maybe String)
Packit Service d2f85f
compareValues norm options expected actual = do
Packit Service d2f85f
  pandocPath <- findPandoc
Packit Service d2f85f
  let cmd  = pandocPath ++ " " ++ unwords options
Packit Service d2f85f
  let dash = replicate 72 '-'
Packit Service d2f85f
  let diff = getDiff (lines actual) (lines expected)
Packit Service d2f85f
  if expected == actual
Packit Service d2f85f
     then return Nothing
Packit Service d2f85f
     else return $ Just $
Packit Service d2f85f
        '\n' : dash ++
Packit Service d2f85f
        "\n--- " ++ norm ++
Packit Service d2f85f
        "\n+++ " ++ cmd ++ "\n" ++
Packit Service d2f85f
        showDiff (1,1) diff ++ dash
Packit Service d2f85f
Packit Service d2f85f
findDynlibDir :: [FilePath] -> Maybe FilePath
Packit Service d2f85f
findDynlibDir []           = Nothing
Packit Service d2f85f
findDynlibDir ("build":xs) = Just $ joinPath (reverse xs)  "build"
Packit Service d2f85f
findDynlibDir (_:xs)       = findDynlibDir xs
Packit Service d2f85f