Blame test/Tests/Readers/Org/Directive.hs

Packit Service d2f85f
{-# LANGUAGE OverloadedStrings #-}
Packit Service d2f85f
module Tests.Readers.Org.Directive (tests) where
Packit Service d2f85f
Packit Service d2f85f
import Data.Time (UTCTime (UTCTime), secondsToDiffTime)
Packit Service d2f85f
import Data.Time.Calendar (Day (ModifiedJulianDay))
Packit Service d2f85f
import Test.Tasty (TestTree, testGroup)
Packit Service d2f85f
import Tests.Helpers ((=?>), ToString, purely, test)
Packit Service d2f85f
import Tests.Readers.Org.Shared ((=:), tagSpan)
Packit Service d2f85f
import Text.Pandoc
Packit Service d2f85f
import Text.Pandoc.Builder
Packit Service d2f85f
import qualified Data.ByteString as BS
Packit Service d2f85f
import qualified Data.Text as T
Packit Service d2f85f
Packit Service d2f85f
testWithFiles :: (ToString c)
Packit Service d2f85f
              => [(FilePath, BS.ByteString)]
Packit Service d2f85f
              -> String         -- ^ name of test case
Packit Service d2f85f
              -> (T.Text, c)    -- ^ (input, expected value)
Packit Service d2f85f
              -> TestTree
Packit Service d2f85f
testWithFiles fileDefs = test (orgWithFiles fileDefs)
Packit Service d2f85f
  where
Packit Service d2f85f
orgWithFiles :: [(FilePath, BS.ByteString)] -> T.Text -> Pandoc
Packit Service d2f85f
orgWithFiles fileDefs input =
Packit Service d2f85f
  let readOrg' = readOrg def{ readerExtensions = getDefaultExtensions "org" }
Packit Service d2f85f
  in flip purely input $ \inp -> do
Packit Service d2f85f
    modifyPureState (\st -> st { stFiles = files fileDefs })
Packit Service d2f85f
    readOrg' inp
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
files :: [(FilePath, BS.ByteString)] -> FileTree
Packit Service d2f85f
files fileDefs =
Packit Service d2f85f
  let dummyTime = UTCTime (ModifiedJulianDay 125) (secondsToDiffTime 0)
Packit Service d2f85f
  in foldr (\(fp, bs) -> insertInFileTree fp (FileInfo dummyTime bs))
Packit Service d2f85f
      mempty fileDefs
Packit Service d2f85f
Packit Service d2f85f
tests :: [TestTree]
Packit Service d2f85f
tests =
Packit Service d2f85f
  [ testGroup "export options"
Packit Service d2f85f
    [ "disable simple sub/superscript syntax" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: ^:nil"
Packit Service d2f85f
                  , "a^b"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        para "a^b"
Packit Service d2f85f
Packit Service d2f85f
    , "directly select drawers to be exported" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: d:(\"IMPORTANT\")"
Packit Service d2f85f
                  , ":IMPORTANT:"
Packit Service d2f85f
                  , "23"
Packit Service d2f85f
                  , ":END:"
Packit Service d2f85f
                  , ":BORING:"
Packit Service d2f85f
                  , "very boring"
Packit Service d2f85f
                  , ":END:"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        divWith (mempty, ["IMPORTANT", "drawer"], mempty) (para "23")
Packit Service d2f85f
Packit Service d2f85f
    , "exclude drawers from being exported" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: d:(not \"BORING\")"
Packit Service d2f85f
                  , ":IMPORTANT:"
Packit Service d2f85f
                  , "5"
Packit Service d2f85f
                  , ":END:"
Packit Service d2f85f
                  , ":BORING:"
Packit Service d2f85f
                  , "very boring"
Packit Service d2f85f
                  , ":END:"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        divWith (mempty, ["IMPORTANT", "drawer"], mempty) (para "5")
Packit Service d2f85f
Packit Service d2f85f
    , "don't include archive trees" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: arch:nil"
Packit Service d2f85f
                  , "* old  :ARCHIVE:"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        (mempty ::Blocks)
Packit Service d2f85f
Packit Service d2f85f
    , "include complete archive trees" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: arch:t"
Packit Service d2f85f
                  , "* old  :ARCHIVE:"
Packit Service d2f85f
                  , "  boring"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        mconcat [ headerWith ("old", [], mempty) 1
Packit Service d2f85f
                             ("old" <> space <> tagSpan "ARCHIVE")
Packit Service d2f85f
                , para "boring"
Packit Service d2f85f
                ]
Packit Service d2f85f
Packit Service d2f85f
    , "include archive tree header only" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: arch:headline"
Packit Service d2f85f
                  , "* old  :ARCHIVE:"
Packit Service d2f85f
                  , "  boring"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        headerWith ("old", [], mempty) 1 ("old" <> space <> tagSpan "ARCHIVE")
Packit Service d2f85f
Packit Service d2f85f
    , "limit headline depth" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: H:2"
Packit Service d2f85f
                  , "* top-level section"
Packit Service d2f85f
                  , "** subsection"
Packit Service d2f85f
                  , "*** list item 1"
Packit Service d2f85f
                  , "*** list item 2"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        mconcat [ headerWith ("top-level-section", [], [])    1 "top-level section"
Packit Service d2f85f
                , headerWith ("subsection", [], []) 2 "subsection"
Packit Service d2f85f
                , orderedList [ para "list item 1", para "list item 2" ]
Packit Service d2f85f
                ]
Packit Service d2f85f
Packit Service d2f85f
    , "turn all headlines into lists" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: H:0"
Packit Service d2f85f
                  , "first block"
Packit Service d2f85f
                  , "* top-level section 1"
Packit Service d2f85f
                  , "** subsection"
Packit Service d2f85f
                  , "* top-level section 2"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        mconcat [ para "first block"
Packit Service d2f85f
                , orderedList
Packit Service d2f85f
                  [ (para "top-level section 1" <>
Packit Service d2f85f
                     orderedList [ para "subsection" ])
Packit Service d2f85f
                  , para "top-level section 2" ]
Packit Service d2f85f
                ]
Packit Service d2f85f
Packit Service d2f85f
    , "preserve linebreaks as hard breaks" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: \\n:t"
Packit Service d2f85f
                  , "first"
Packit Service d2f85f
                  , "second"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        para ("first" <> linebreak <> "second")
Packit Service d2f85f
Packit Service d2f85f
    , "disable author export" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: author:nil"
Packit Service d2f85f
                  , "#+AUTHOR: ShyGuy"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        Pandoc nullMeta mempty
Packit Service d2f85f
Packit Service d2f85f
    , "disable creator export" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: creator:nil"
Packit Service d2f85f
                  , "#+creator: The Architect"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        Pandoc nullMeta mempty
Packit Service d2f85f
Packit Service d2f85f
    , "disable email export" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: email:nil"
Packit Service d2f85f
                  , "#+email: no-mail-please@example.com"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        Pandoc nullMeta mempty
Packit Service d2f85f
Packit Service d2f85f
    , "disable inclusion of todo keywords" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: todo:nil"
Packit Service d2f85f
                  , "** DONE todo export"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        headerWith ("todo-export", [], []) 2 "todo export"
Packit Service d2f85f
Packit Service d2f85f
    , "remove tags from headlines" =:
Packit Service d2f85f
        T.unlines [ "#+OPTIONS: tags:nil"
Packit Service d2f85f
                  , "* Headline :hello:world:"
Packit Service d2f85f
                  ] =?>
Packit Service d2f85f
        headerWith ("headline", [], mempty) 1 "Headline"
Packit Service d2f85f
    ]
Packit Service d2f85f
Packit Service d2f85f
  , testGroup "Include"
Packit Service d2f85f
    [ testWithFiles [("./other.org", "content of other file\n")]
Packit Service d2f85f
      "file inclusion"
Packit Service d2f85f
      (T.unlines [ "#+include: \"other.org\"" ] =?>
Packit Service d2f85f
       plain "content of other file")
Packit Service d2f85f
Packit Service d2f85f
    , testWithFiles [("./world.org", "World\n\n")]
Packit Service d2f85f
      "Included file belongs to item"
Packit Service d2f85f
      (T.unlines [ "- Hello,\n  #+include: \"world.org\"" ] =?>
Packit Service d2f85f
       bulletList [para "Hello," <> para "World"])
Packit Service d2f85f
Packit Service d2f85f
    , testWithFiles [("./level3.org", "*** Level3\n\n")]
Packit Service d2f85f
      "Default include preserves level"
Packit Service d2f85f
      (T.unlines [ "#+include: \"level3.org\"" ] =?>
Packit Service d2f85f
       headerWith ("level3", [], []) 3 "Level3")
Packit Service d2f85f
Packit Service d2f85f
    , testWithFiles [("./level3.org", "*** Level3\n\n")]
Packit Service d2f85f
      "Minlevel shifts level"
Packit Service d2f85f
      (T.unlines [ "#+include: \"level3.org\" :minlevel 1" ] =?>
Packit Service d2f85f
       headerWith ("level3", [], []) 1 "Level3")
Packit Service d2f85f
Packit Service d2f85f
    , testWithFiles [("./src.hs", "putStrLn outString\n")]
Packit Service d2f85f
      "Include file as source code snippet"
Packit Service d2f85f
      (T.unlines [ "#+include: \"src.hs\" src haskell" ] =?>
Packit Service d2f85f
       codeBlockWith ("", ["haskell"], []) "putStrLn outString\n")
Packit Service d2f85f
Packit Service d2f85f
    , testWithFiles [("./export-latex.org", "\\emph{Hello}\n")]
Packit Service d2f85f
      "Include file as export snippet"
Packit Service d2f85f
      (T.unlines [ "#+include: \"export-latex.org\" export latex" ] =?>
Packit Service d2f85f
       rawBlock "latex" "\\emph{Hello}\n")
Packit Service d2f85f
Packit Service d2f85f
    , testWithFiles [("./subdir/foo-bar.latex", "foo\n"),
Packit Service d2f85f
                     ("./hello.lisp", "(print \"Hello!\")\n")
Packit Service d2f85f
                    ]
Packit Service d2f85f
      "include directive is limited to one line"
Packit Service d2f85f
      (T.unlines [ "#+INCLUDE: \"hello.lisp\" src lisp"
Packit Service d2f85f
                 , "#+include: \"subdir/foo-bar.latex\" export latex"
Packit Service d2f85f
                 , "bar"
Packit Service d2f85f
                 ] =?>
Packit Service d2f85f
       mconcat
Packit Service d2f85f
         [ codeBlockWith ("", ["lisp"], []) "(print \"Hello!\")\n"
Packit Service d2f85f
         , rawBlock "latex" "foo\n"
Packit Service d2f85f
         , para "bar"
Packit Service d2f85f
         ]
Packit Service d2f85f
      )
Packit Service d2f85f
    ]
Packit Service d2f85f
  ]