From b3449a84aa19edd3b31e2f49fddb924b54d99df6 Mon Sep 17 00:00:00 2001 From: Jesse Rosenthal Date: Fri, 26 Jan 2018 14:23:18 -0500 Subject: Docx writer tests: Use new golden framework These are based off the reader tests, with some removed (where the reader output was identical, based on different docx inputs). There are still more to be added. In particular, tests for custom-styles need to be added. All golden docx files have been checked in MS Word 2013 (windows). There is no corruption. There is questionable output in the `tables` test: the three tables seemed to be joined. This will be addressed in a future commit, and the golden docx file will be changed. --- test/Tests/Writers/Docx.hs | 240 +++++++++++++++++++++------------------------ 1 file changed, 113 insertions(+), 127 deletions(-) (limited to 'test/Tests/Writers/Docx.hs') diff --git a/test/Tests/Writers/Docx.hs b/test/Tests/Writers/Docx.hs index 1537ea85d..57e55e354 100644 --- a/test/Tests/Writers/Docx.hs +++ b/test/Tests/Writers/Docx.hs @@ -1,161 +1,147 @@ module Tests.Writers.Docx (tests) where -import qualified Data.ByteString as BS -import System.FilePath (()) -import System.IO.Unsafe (unsafePerformIO) +import Text.Pandoc import Test.Tasty -import Tests.Helpers -import Text.Pandoc.Class (runIOorExplode, setUserDataDir) -import Text.Pandoc.Definition -import Text.Pandoc.Options -import Text.Pandoc.Readers.Docx -import Text.Pandoc.Readers.Native -import qualified Text.Pandoc.UTF8 as UTF8 -import Text.Pandoc.Walk -import Text.Pandoc.Writers.Docx +import Tests.Writers.OOXML +import Test.Tasty.HUnit +import Data.List (isPrefixOf) -type Options = (WriterOptions, ReaderOptions) - -compareOutput :: Options - -> FilePath - -> FilePath - -> IO (Pandoc, Pandoc) -compareOutput (wopts, ropts) nativeFileIn nativeFileOut = do - nf <- UTF8.toText <$> BS.readFile nativeFileIn - nf' <- UTF8.toText <$> BS.readFile nativeFileOut - runIOorExplode $ do - setUserDataDir $ Just (".." "data") - roundtripped <- readNative def nf >>= - writeDocx wopts >>= readDocx ropts - orig <- readNative def nf' - return (walk fixImages roundtripped, walk fixImages orig) - --- make all image filenames "image", since otherwise round-trip --- tests fail because of different behavior of Data.Unique in --- different ghc versions... -fixImages :: Inline -> Inline -fixImages (Image attr alt (_,tit)) = Image attr alt ("image",tit) -fixImages x = x - -testCompareWithOptsIO :: Options -> String -> FilePath -> FilePath -> IO TestTree -testCompareWithOptsIO opts name nativeFileIn nativeFileOut = do - (dp, np) <- compareOutput opts nativeFileIn nativeFileOut - return $ test id name (dp, np) - -testCompareWithOpts :: Options -> String -> FilePath -> FilePath -> TestTree -testCompareWithOpts opts name nativeFileIn nativeFileOut = - unsafePerformIO $ testCompareWithOptsIO opts name nativeFileIn nativeFileOut - -roundTripCompareWithOpts :: Options -> String -> FilePath -> TestTree -roundTripCompareWithOpts opts name nativeFile = - testCompareWithOpts opts name nativeFile nativeFile - --- testCompare :: String -> FilePath -> FilePath -> TestTree --- testCompare = testCompareWithOpts def - -roundTripCompare :: String -> FilePath -> TestTree -roundTripCompare = roundTripCompareWithOpts def +-- we add an extra check to make sure that we're not writing in the +-- toplevel docx directory. We don't want to accidentally overwrite an +-- Word-generated docx file used to test the reader. +docxTest :: String -> WriterOptions -> FilePath -> FilePath -> TestTree +docxTest testName opts nativeFP goldenFP = + if "docx/golden/" `isPrefixOf` goldenFP + then ooxmlTest writeDocx testName opts nativeFP goldenFP + else testCase testName $ + assertFailure $ + goldenFP ++ " is not in `test/docx/golden`" tests :: [TestTree] tests = [ testGroup "inlines" - [ roundTripCompare + [ docxTest "font formatting" - "docx/inline_formatting_writer.native" - , roundTripCompare - "font formatting with character styles" - "docx/char_styles.native" - , roundTripCompare + def + "docx/inline_formatting.native" + "docx/golden/inline_formatting.docx" + , docxTest "hyperlinks" - "docx/links_writer.native" - , roundTripCompare + def + "docx/links.native" + "docx/golden/links.docx" + , docxTest "inline image" - "docx/image_no_embed_writer.native" - , roundTripCompare - "inline image in links" - "docx/inline_images_writer.native" - , roundTripCompare + def + "docx/image_writer_test.native" + "docx/golden/image.docx" + , docxTest + "inline images" + def + "docx/inline_images_writer_test.native" + "docx/golden/inline_images.docx" + , docxTest "handling unicode input" + def "docx/unicode.native" - , roundTripCompare - "literal tabs" - "docx/tabs.native" - , roundTripCompare - "normalizing inlines" - "docx/normalize.native" - , roundTripCompare - "normalizing inlines deep inside blocks" - "docx/deep_normalize.native" - , roundTripCompare - "move trailing spaces outside of formatting" - "docx/trailing_spaces_in_formatting.native" - , roundTripCompare - "inline code (with VerbatimChar style)" + "docx/golden/unicode.docx" + , docxTest + "inline code" + def "docx/inline_code.native" - , roundTripCompare + "docx/golden/inline_code.docx" + , docxTest "inline code in subscript and superscript" + def "docx/verbatim_subsuper.native" + "docx/golden/verbatim_subsuper.docx" ] , testGroup "blocks" - [ roundTripCompare + [ docxTest "headers" + def "docx/headers.native" - , roundTripCompare - "headers already having auto identifiers" - "docx/already_auto_ident.native" - , roundTripCompare - "numbered headers automatically made into list" - "docx/numbered_header.native" - , roundTripCompare - "i18n blocks (headers and blockquotes)" - "docx/i18n_blocks.native" - -- Continuation does not survive round-trip - , roundTripCompare + "docx/golden/headers.docx" + , docxTest + "nested anchor spans in header" + def + "docx/nested_anchors_in_header.native" + "docx/golden/nested_anchors_in_header.docx" + , docxTest "lists" - "docx/lists_writer.native" - , roundTripCompare + def + "docx/lists.native" + "docx/golden/lists.docx" + , docxTest + "lists continuing after interruption" + def + "docx/lists_continuing.native" + "docx/golden/lists_continuing.docx" + , docxTest + "lists restarting after interruption" + def + "docx/lists_restarting.native" + "docx/golden/lists_restarting.docx" + , docxTest "definition lists" + def "docx/definition_list.native" - , roundTripCompare - "custom defined lists in styles" - "docx/german_styled_lists.native" - , roundTripCompare + "docx/golden/definition_list.docx" + , docxTest "footnotes and endnotes" + def "docx/notes.native" - , roundTripCompare - "blockquotes (parsing indent as blockquote)" + "docx/golden/notes.docx" + , docxTest + "links in footnotes and endnotes" + def + "docx/link_in_notes.native" + "docx/golden/link_in_notes.docx" + , docxTest + "blockquotes" + def "docx/block_quotes_parse_indent.native" - , roundTripCompare - "hanging indents" - "docx/hanging_indent.native" - -- tables headers do not survive round-trip, should look into that - , roundTripCompare + "docx/golden/block_quotes.docx" + , docxTest "tables" + def "docx/tables.native" - , roundTripCompare + "docx/golden/tables.docx" + , docxTest "tables with lists in cells" + def "docx/table_with_list_cell.native" - , roundTripCompare + "docx/golden/table_with_list_cell.docx" + , docxTest + "tables with one row" + def + "docx/table_one_row.native" + "docx/golden/table_one_row.docx" + , docxTest "code block" + def "docx/codeblock.native" - , roundTripCompare - "dropcap paragraphs" - "docx/drop_cap.native" + "docx/golden/codeblock.docx" ] - , testGroup "metadata" - [ roundTripCompareWithOpts (def,def{readerStandalone=True}) - "metadata fields" - "docx/metadata.native" - , roundTripCompareWithOpts (def,def{readerStandalone=True}) - "stop recording metadata with normal text" - "docx/metadata_after_normal.native" + , testGroup "track changes" + [ docxTest + "insertion" + def + "docx/track_changes_insertion_all.native" + "docx/golden/track_changes_insertion.docx" + , docxTest + "deletion" + def + "docx/track_changes_deletion_all.native" + "docx/golden/track_changes_deletion.docx" + , docxTest + "move text" + def + "docx/track_changes_move_all.native" + "docx/golden/track_changes_move.docx" + , docxTest + "comments" + def + "docx/comments.native" + "docx/golden/comments.docx" ] - , testGroup "customized styles" - [ testCompareWithOpts - ( def{writerReferenceDoc=Just "docx/custom-style-reference.docx"} - , def) - "simple customized blocks and inlines" - "docx/custom-style-roundtrip-start.native" - "docx/custom-style-roundtrip-end.native" - ] - ] -- cgit v1.2.3