Blame test/Tests/Readers/Odt.hs

Packit Service d2f85f
module Tests.Readers.Odt (tests) where
Packit Service d2f85f
Packit Service d2f85f
import Control.Monad (liftM)
Packit Service d2f85f
import qualified Data.ByteString as BS
Packit Service d2f85f
import qualified Data.ByteString.Lazy as B
Packit Service d2f85f
import qualified Data.Map as M
Packit Service d2f85f
import Data.Text (unpack)
Packit Service d2f85f
import System.IO.Unsafe (unsafePerformIO)
Packit Service d2f85f
import Test.Tasty
Packit Service d2f85f
import Tests.Helpers
Packit Service d2f85f
import Text.Pandoc
Packit Service d2f85f
import qualified Text.Pandoc.UTF8 as UTF8
Packit Service d2f85f
Packit Service d2f85f
defopts :: ReaderOptions
Packit Service d2f85f
defopts = def{ readerExtensions = getDefaultExtensions "odt" }
Packit Service d2f85f
Packit Service d2f85f
tests :: [TestTree]
Packit Service d2f85f
tests = testsComparingToMarkdown ++ testsComparingToNative
Packit Service d2f85f
Packit Service d2f85f
testsComparingToMarkdown :: [TestTree]
Packit Service d2f85f
testsComparingToMarkdown    = map nameToTest namesOfTestsComparingToMarkdown
Packit Service d2f85f
  where nameToTest     name = createTest
Packit Service d2f85f
                                compareOdtToMarkdown
Packit Service d2f85f
                                name
Packit Service d2f85f
                                (toOdtPath      name)
Packit Service d2f85f
                                (toMarkdownPath name)
Packit Service d2f85f
        toOdtPath      name = "odt/odt/"      ++ name ++ ".odt"
Packit Service d2f85f
        toMarkdownPath name = "odt/markdown/" ++ name ++ ".md"
Packit Service d2f85f
Packit Service d2f85f
testsComparingToNative   :: [TestTree]
Packit Service d2f85f
testsComparingToNative      = map nameToTest namesOfTestsComparingToNative
Packit Service d2f85f
  where nameToTest     name = createTest
Packit Service d2f85f
                                compareOdtToNative
Packit Service d2f85f
                                name
Packit Service d2f85f
                                (toOdtPath      name)
Packit Service d2f85f
                                (toNativePath   name)
Packit Service d2f85f
        toOdtPath      name = "odt/odt/"      ++ name ++ ".odt"
Packit Service d2f85f
        toNativePath   name = "odt/native/"   ++ name ++ ".native"
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
newtype NoNormPandoc = NoNormPandoc {unNoNorm :: Pandoc}
Packit Service d2f85f
  deriving ( Show )
Packit Service d2f85f
Packit Service d2f85f
instance ToString NoNormPandoc where
Packit Service d2f85f
  toString d = unpack $
Packit Service d2f85f
               purely (writeNative def{ writerTemplate = s }) $ toPandoc d
Packit Service d2f85f
   where s = case d of
Packit Service d2f85f
                  NoNormPandoc (Pandoc (Meta m) _)
Packit Service d2f85f
                    | M.null m  -> Nothing
Packit Service d2f85f
                    | otherwise -> Just "" -- need this for Meta output
Packit Service d2f85f
Packit Service d2f85f
instance ToPandoc NoNormPandoc where
Packit Service d2f85f
  toPandoc = unNoNorm
Packit Service d2f85f
Packit Service d2f85f
getNoNormVia :: (a -> Pandoc) -> String -> Either PandocError a -> NoNormPandoc
Packit Service d2f85f
getNoNormVia _ readerName (Left  _) = error (readerName ++ " reader failed")
Packit Service d2f85f
getNoNormVia f _          (Right a) = NoNormPandoc (f a)
Packit Service d2f85f
Packit Service d2f85f
type TestCreator =  ReaderOptions
Packit Service d2f85f
                 -> FilePath -> FilePath
Packit Service d2f85f
                 -> IO (NoNormPandoc, NoNormPandoc)
Packit Service d2f85f
Packit Service d2f85f
compareOdtToNative   :: TestCreator
Packit Service d2f85f
compareOdtToNative opts odtPath nativePath = do
Packit Service d2f85f
   nativeFile   <- UTF8.toText <$> BS.readFile nativePath
Packit Service d2f85f
   odtFile      <- B.readFile       odtPath
Packit Service d2f85f
   native       <- getNoNormVia id  "native" <$> runIO (readNative def nativeFile)
Packit Service d2f85f
   odt          <- getNoNormVia id  "odt"    <$> runIO (readOdt  opts odtFile)
Packit Service d2f85f
   return (odt,native)
Packit Service d2f85f
Packit Service d2f85f
compareOdtToMarkdown :: TestCreator
Packit Service d2f85f
compareOdtToMarkdown opts odtPath markdownPath = do
Packit Service d2f85f
   markdownFile <- UTF8.toText <$> BS.readFile markdownPath
Packit Service d2f85f
   odtFile      <- B.readFile       odtPath
Packit Service d2f85f
   markdown     <- getNoNormVia id "markdown" <$>
Packit Service d2f85f
                      runIO (readMarkdown def{ readerExtensions = pandocExtensions }
Packit Service d2f85f
                              markdownFile)
Packit Service d2f85f
   odt          <- getNoNormVia id "odt"      <$> runIO (readOdt      opts odtFile)
Packit Service d2f85f
   return (odt,markdown)
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
createTest :: TestCreator
Packit Service d2f85f
           -> TestName
Packit Service d2f85f
           -> FilePath -> FilePath
Packit Service d2f85f
           -> TestTree
Packit Service d2f85f
createTest   creator name path1 path2 =
Packit Service d2f85f
  unsafePerformIO $ liftM (test id name) (creator defopts path1 path2)
Packit Service d2f85f
Packit Service d2f85f
{-
Packit Service d2f85f
--
Packit Service d2f85f
Packit Service d2f85f
getMedia :: FilePath -> FilePath -> IO (Maybe B.ByteString)
Packit Service d2f85f
getMedia archivePath mediaPath = do
Packit Service d2f85f
  zf <- B.readFile archivePath >>= return . toArchive
Packit Service d2f85f
  return $ findEntryByPath ("Pictures/" ++ mediaPath) zf >>= (Just . fromEntry)
Packit Service d2f85f
Packit Service d2f85f
compareMediaPathIO :: FilePath -> MediaBag -> FilePath -> IO Bool
Packit Service d2f85f
compareMediaPathIO mediaPath mediaBag odtPath = do
Packit Service d2f85f
  odtMedia <- getMedia odtPath mediaPath
Packit Service d2f85f
  let mbBS   = case lookupMedia mediaPath mediaBag of
Packit Service d2f85f
                 Just (_, bs) -> bs
Packit Service d2f85f
                 Nothing      -> error ("couldn't find " ++
Packit Service d2f85f
                                        mediaPath ++
Packit Service d2f85f
                                        " in media bag")
Packit Service d2f85f
      odtBS = case odtMedia of
Packit Service d2f85f
                 Just bs -> bs
Packit Service d2f85f
                 Nothing -> error ("couldn't find " ++
Packit Service d2f85f
                                   mediaPath ++
Packit Service d2f85f
                                   " in media bag")
Packit Service d2f85f
  return $ mbBS == odtBS
Packit Service d2f85f
Packit Service d2f85f
compareMediaBagIO :: FilePath -> IO Bool
Packit Service d2f85f
compareMediaBagIO odtFile = do
Packit Service d2f85f
    df <- B.readFile odtFile
Packit Service d2f85f
    let (_, mb) = readOdt def df
Packit Service d2f85f
    bools <- mapM
Packit Service d2f85f
             (\(fp, _, _) -> compareMediaPathIO fp mb odtFile)
Packit Service d2f85f
             (mediaDirectory mb)
Packit Service d2f85f
    return $ and bools
Packit Service d2f85f
Packit Service d2f85f
testMediaBagIO :: String -> FilePath -> IO TestTree
Packit Service d2f85f
testMediaBagIO name odtFile = do
Packit Service d2f85f
  outcome <- compareMediaBagIO odtFile
Packit Service d2f85f
  return $ testCase name (assertBool
Packit Service d2f85f
                          ("Media didn't match media bag in file " ++ odtFile)
Packit Service d2f85f
                          outcome)
Packit Service d2f85f
Packit Service d2f85f
testMediaBag :: String -> FilePath -> TestTree
Packit Service d2f85f
testMediaBag name odtFile = buildTest $ testMediaBagIO name odtFile
Packit Service d2f85f
-}
Packit Service d2f85f
--
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
Packit Service d2f85f
namesOfTestsComparingToMarkdown :: [ String ]
Packit Service d2f85f
namesOfTestsComparingToMarkdown  = [ "bold"
Packit Service d2f85f
--                                 , "citation"
Packit Service d2f85f
                                   , "endnote"
Packit Service d2f85f
                                   , "externalLink"
Packit Service d2f85f
                                   , "footnote"
Packit Service d2f85f
                                   , "headers"
Packit Service d2f85f
--                                 , "horizontalRule"
Packit Service d2f85f
                                   , "italic"
Packit Service d2f85f
--                                 , "listBlocks"
Packit Service d2f85f
                                   , "paragraph"
Packit Service d2f85f
                                   , "strikeout"
Packit Service d2f85f
--                                 , "trackedChanges"
Packit Service d2f85f
                                   , "underlined"
Packit Service d2f85f
                                   ]
Packit Service d2f85f
Packit Service d2f85f
namesOfTestsComparingToNative  :: [ String ]
Packit Service d2f85f
namesOfTestsComparingToNative   = [ "blockquote"
Packit Service d2f85f
                                  , "image"
Packit Service d2f85f
                                  , "imageIndex"
Packit Service d2f85f
                                  , "imageWithCaption"
Packit Service d2f85f
                                  , "inlinedCode"
Packit Service d2f85f
                                  , "orderedListMixed"
Packit Service d2f85f
                                  , "orderedListRoman"
Packit Service d2f85f
                                  , "orderedListSimple"
Packit Service d2f85f
                                  , "referenceToChapter"
Packit Service d2f85f
                                  , "referenceToListItem"
Packit Service d2f85f
                                  , "referenceToText"
Packit Service d2f85f
                                  , "simpleTable"
Packit Service d2f85f
                                  , "simpleTableWithCaption"
Packit Service d2f85f
--                                , "table"
Packit Service d2f85f
                                  , "textMixedStyles"
Packit Service d2f85f
                                  , "tableWithContents"
Packit Service d2f85f
                                  , "unicode"
Packit Service d2f85f
                                  , "unorderedList"
Packit Service d2f85f
                                  ]