Update test coverage
This commit is contained in:
@@ -32,28 +32,9 @@ from novelwriter.core.docbuild import NWBuildDocument
|
||||
from novelwriter.core.project import NWProject
|
||||
from novelwriter.enum import nwBuildFmt
|
||||
from novelwriter.formats.shared import BlockFmt, BlockTyp
|
||||
from novelwriter.formats.todocx import ToDocX, _mkTag, _wTag
|
||||
from novelwriter.formats.todocx import OOXML_SCM, ToDocX, _mkTag, _wTag
|
||||
|
||||
from tests.tools import DOCX_IGNORE, cmpFiles
|
||||
|
||||
OOXML_SCM = "http://schemas.openxmlformats.org"
|
||||
XML_NS = [
|
||||
f' xmlns:r="{OOXML_SCM}/officeDocument/2006/relationships"',
|
||||
f' xmlns:w="{OOXML_SCM}/wordprocessingml/2006/main"',
|
||||
f' xmlns:cp="{OOXML_SCM}/package/2006/metadata/core-properties"',
|
||||
' xmlns:dc="http://purl.org/dc/elements/1.1/"',
|
||||
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"',
|
||||
' xmlns:xml="http://www.w3.org/XML/1998/namespace"',
|
||||
' xmlns:dcterms="http://purl.org/dc/terms/"',
|
||||
]
|
||||
|
||||
|
||||
def xmlToText(xElem):
|
||||
"""Get the text content of an XML element."""
|
||||
rTxt = ET.tostring(xElem, encoding="utf-8", xml_declaration=False).decode()
|
||||
for ns in XML_NS:
|
||||
rTxt = rTxt.replace(ns, "")
|
||||
return rTxt
|
||||
from tests.tools import DOCX_IGNORE, cmpFiles, xmlToText
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
@@ -610,6 +591,49 @@ def testFmtToDocX_Footnotes(mockGUI):
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testFmtToDocX_Fields(mockGUI):
|
||||
"""Test formatting of footnotes."""
|
||||
project = NWProject()
|
||||
doc = ToDocX(project)
|
||||
doc.initDocument()
|
||||
|
||||
# Field Builder
|
||||
xNode = doc._generateField("a:b", 0x00)
|
||||
assert isinstance(xNode, ET.Element)
|
||||
assert xmlToText(xNode) == "<w:r><w:rPr /><w:t>0</w:t></w:r>"
|
||||
assert doc._usedFields == [(xNode.find(_wTag("t")), "b")]
|
||||
|
||||
assert doc._generateField("a", 0x00) is None
|
||||
|
||||
# Full Processing
|
||||
doc._text = (
|
||||
"Word Count: [field:allWords]\n"
|
||||
"Character Count: [field:allChars]\n"
|
||||
"Chicken Count: [field:allChickens]\n"
|
||||
)
|
||||
doc.tokenizeText()
|
||||
doc.doConvert()
|
||||
doc.countStats()
|
||||
doc._documentXml(None, None)
|
||||
assert xmlToText(doc._files["document.xml"].xml) == (
|
||||
'<w:document><w:body><w:p><w:pPr><w:pStyle w:val="Normal" /></w:pPr>'
|
||||
'<w:r><w:rPr /><w:t xml:space="preserve">Word Count: </w:t></w:r>'
|
||||
'<w:r><w:rPr /><w:t>6</w:t></w:r>'
|
||||
'<w:r><w:rPr /><w:br /><w:t xml:space="preserve">Character Count: </w:t></w:r>'
|
||||
'<w:r><w:rPr /><w:t>46</w:t></w:r>'
|
||||
'<w:r><w:rPr /><w:br /><w:t xml:space="preserve">Chicken Count: </w:t></w:r>'
|
||||
'<w:r><w:rPr /><w:t>0</w:t></w:r>'
|
||||
'</w:p><w:sectPr>'
|
||||
'<w:footnotePr><w:numFmt w:val="decimal" /></w:footnotePr>'
|
||||
'<w:pgSz w:w="11905" w:h="16837" w:orient="portrait" />'
|
||||
'<w:pgMar w:top="1133" w:right="1133" w:bottom="1133" w:left="1133" '
|
||||
'w:header="566" w:footer="0" w:gutter="0" />'
|
||||
'<w:pgNumType w:start="1" w:fmt="decimal" /><w:titlePg />'
|
||||
'</w:sectPr></w:body></w:document>'
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testFmtToDocX_SaveDocument(mockGUI, prjLipsum, fncPath, tstPaths):
|
||||
"""Test document output."""
|
||||
|
||||
@@ -45,7 +45,7 @@ class BareTokenizer(Tokenizer):
|
||||
super().doConvert() # type: ignore (deliberate check)
|
||||
|
||||
def closeDocument(self):
|
||||
super().doConvert() # type: ignore (deliberate check)
|
||||
super().closeDocument() # type: ignore (deliberate check)
|
||||
|
||||
def saveDocument(self, path) -> None:
|
||||
super().saveDocument(path) # type: ignore (deliberate check)
|
||||
@@ -60,6 +60,9 @@ def testFmtToken_Abstracts(mockGUI, tstPaths):
|
||||
with pytest.raises(NotImplementedError):
|
||||
tokens.doConvert()
|
||||
|
||||
with pytest.raises(NotImplementedError):
|
||||
tokens.closeDocument()
|
||||
|
||||
with pytest.raises(NotImplementedError):
|
||||
tokens.saveDocument(tstPaths)
|
||||
|
||||
|
||||
@@ -35,26 +35,7 @@ from novelwriter.core.project import NWProject
|
||||
from novelwriter.formats.shared import BlockFmt, BlockTyp, TextFmt
|
||||
from novelwriter.formats.toodt import ODTParagraphStyle, ODTTextStyle, ToOdt, XMLParagraph, _mkTag
|
||||
|
||||
from tests.tools import ODT_IGNORE, cmpFiles
|
||||
|
||||
XML_NS = [
|
||||
' xmlns:dc="http://purl.org/dc/elements/1.1/"',
|
||||
' xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"',
|
||||
' xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"',
|
||||
' xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"',
|
||||
' xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"',
|
||||
' xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"',
|
||||
' xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"',
|
||||
' xmlns:xlink="http://www.w3.org/1999/xlink"',
|
||||
]
|
||||
|
||||
|
||||
def xmlToText(xElem):
|
||||
"""Get the text content of an XML element."""
|
||||
rTxt = ET.tostring(xElem, encoding="utf-8", xml_declaration=False).decode()
|
||||
for ns in XML_NS:
|
||||
rTxt = rTxt.replace(ns, "")
|
||||
return rTxt
|
||||
from tests.tools import ODT_IGNORE, cmpFiles, xmlToText
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
@@ -237,6 +218,46 @@ def testFmtToOdt_TextFormatting(mockGUI):
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testFmtToOdt_Fields(mockGUI):
|
||||
"""Test formatting of footnotes."""
|
||||
project = NWProject()
|
||||
odt = ToOdt(project, True)
|
||||
odt.initDocument()
|
||||
|
||||
# Field Builder
|
||||
xNode = odt._generateField("a:allWords", 0x00)
|
||||
assert isinstance(xNode, ET.Element)
|
||||
assert xmlToText(xNode) == (
|
||||
'<text:user-field-getstyle:data-style-name="N0" text:name="ManuscriptAllWords">'
|
||||
'0</text:user-field-get>'
|
||||
)
|
||||
# assert odt._usedFields == [(xNode.find(_wTag("t")), "b")]
|
||||
|
||||
assert odt._generateField("a", 0x00) is None
|
||||
|
||||
# Full Processing
|
||||
odt._text = (
|
||||
"Word Count: [field:allWords]\n"
|
||||
"Character Count: [field:allChars]\n"
|
||||
"Chicken Count: [field:allChickens]\n"
|
||||
)
|
||||
odt.tokenizeText()
|
||||
odt.doConvert()
|
||||
odt.countStats()
|
||||
assert xmlToText(odt._xBody) == (
|
||||
'<office:body><office:text>'
|
||||
'<text:p text:style-name="Text_20_body">'
|
||||
'Word Count: <text:user-field-get style:data-style-name="N0" '
|
||||
'text:name="ManuscriptAllWords">0</text:user-field-get><text:line-break />'
|
||||
'Character Count: <text:user-field-get style:data-style-name="N0" '
|
||||
'text:name="ManuscriptAllChars">0</text:user-field-get><text:line-break />'
|
||||
'Chicken Count: <text:user-field-get style:data-style-name="N0" '
|
||||
'text:name="ManuscriptAllChickens">0</text:user-field-get></text:p>'
|
||||
'</office:text></office:body>'
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testFmtToOdt_DialogueFormatting(mockGUI):
|
||||
"""Test formatting of dialogue."""
|
||||
@@ -770,7 +791,7 @@ def testFmtToOdt_ConvertDirect(mockGUI):
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testFmtToOdt_SaveFlat(mockGUI, fncPath, tstPaths):
|
||||
def testFmtToOdt_SaveFlat(mockGUI, fncPath, tstPaths, ipsumText):
|
||||
"""Test the document save functions."""
|
||||
project = NWProject()
|
||||
project.data.setAuthor("Jane Smith")
|
||||
@@ -796,14 +817,20 @@ def testFmtToOdt_SaveFlat(mockGUI, fncPath, tstPaths):
|
||||
assert odt._mDocRight == "1.500cm"
|
||||
|
||||
odt._text = (
|
||||
"#! My Novel\n\n"
|
||||
"**Word Count: [field:allWords]**\n"
|
||||
"[field:paragraphCount] paragrphs\n"
|
||||
"Web: http://example.com\n\n"
|
||||
"## Chapter One\n\n"
|
||||
"Text\n\n"
|
||||
f"{ipsumText[0]}\n\n"
|
||||
"## Chapter Two\n\n"
|
||||
"Text\n\n"
|
||||
f"{ipsumText[1]}[footnote:abc]\n\n"
|
||||
"%Footnote.abc: Lorem ipsum\n\n"
|
||||
)
|
||||
odt.tokenizeText()
|
||||
odt.initDocument()
|
||||
odt.doConvert()
|
||||
odt.countStats()
|
||||
odt.closeDocument()
|
||||
|
||||
flatFile = fncPath / "document.fodt"
|
||||
@@ -818,7 +845,7 @@ def testFmtToOdt_SaveFlat(mockGUI, fncPath, tstPaths):
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testFmtToOdt_SaveFull(mockGUI, fncPath, tstPaths):
|
||||
def testFmtToOdt_SaveFull(mockGUI, fncPath, tstPaths, ipsumText):
|
||||
"""Test the document save functions."""
|
||||
project = NWProject()
|
||||
project.data.setAuthor("Jane Smith")
|
||||
@@ -833,14 +860,20 @@ def testFmtToOdt_SaveFull(mockGUI, fncPath, tstPaths):
|
||||
odt.setHeaderFormat(f"{nwHeadFmt.DOC_PROJECT} - {nwHeadFmt.DOC_AUTHOR}", 0)
|
||||
|
||||
odt._text = (
|
||||
"#! My Novel\n\n"
|
||||
"**Word Count: [field:allWords]**\n"
|
||||
"[field:paragraphCount] paragrphs\n"
|
||||
"Web: http://example.com\n\n"
|
||||
"## Chapter One\n\n"
|
||||
"Text\n\n"
|
||||
f"{ipsumText[0]}\n\n"
|
||||
"## Chapter Two\n\n"
|
||||
"Text\n\n"
|
||||
f"{ipsumText[1]}[footnote:abc]\n\n"
|
||||
"%Footnote.abc: Lorem ipsum\n\n"
|
||||
)
|
||||
odt.tokenizeText()
|
||||
odt.initDocument()
|
||||
odt.doConvert()
|
||||
odt.countStats()
|
||||
odt.closeDocument()
|
||||
|
||||
fullFile = fncPath / "document.odt"
|
||||
|
||||
Reference in New Issue
Block a user