Merge branch 'main' into multi_root
This commit is contained in:
@@ -306,22 +306,6 @@ def testCoreItem_LayoutSetter(mockGUI):
|
||||
theItem.setLayout("NOTE")
|
||||
assert theItem.itemLayout == nwItemLayout.NOTE
|
||||
|
||||
# Deprecated Layouts
|
||||
theItem.setLayout("TITLE")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("PAGE")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("BOOK")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("PARTITION")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("UNNUMBERED")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("CHAPTER")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("SCENE")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
|
||||
# Alternatives
|
||||
theItem.setLayout(nwItemLayout.NOTE)
|
||||
assert theItem.itemLayout == nwItemLayout.NOTE
|
||||
@@ -358,12 +342,9 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog):
|
||||
xContent = etree.SubElement(nwXML, "content")
|
||||
theItem.packXML(xContent)
|
||||
assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == (
|
||||
b"<content>"
|
||||
b"<item handle=\"0123456789abc\" order=\"1\" parent=\"0123456789abc\">"
|
||||
b"<name>A Name</name><type>FILE</type><class>NOVEL</class><status>New</status>"
|
||||
b"<exported>False</exported><layout>NOTE</layout><charCount>7</charCount>"
|
||||
b"<wordCount>5</wordCount><paraCount>3</paraCount><cursorPos>11</cursorPos></item>"
|
||||
b"</content>"
|
||||
b'<content><item handle="0123456789abc" parent="0123456789abc" order="1" type="FILE" '
|
||||
b'class="NOVEL" layout="NOTE"><meta charCount="7" wordCount="5" paraCount="3" '
|
||||
b'cursorPos="11"/><name status="New" exported="False">A Name</name></item></content>'
|
||||
)
|
||||
|
||||
# Unpack
|
||||
@@ -404,11 +385,8 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog):
|
||||
xContent = etree.SubElement(nwXML, "content")
|
||||
theItem.packXML(xContent)
|
||||
assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == (
|
||||
b"<content>"
|
||||
b"<item handle=\"0123456789abc\" order=\"1\" parent=\"0123456789abc\">"
|
||||
b"<name>A Name</name><type>FOLDER</type><class>NOVEL</class><status>New</status>"
|
||||
b"<expanded>True</expanded></item>"
|
||||
b"</content>"
|
||||
b'<content><item handle="0123456789abc" parent="0123456789abc" order="1" type="FOLDER" '
|
||||
b'class="NOVEL"><meta expanded="True"/><name status="New">A Name</name></item></content>'
|
||||
)
|
||||
|
||||
# Unpack
|
||||
@@ -462,3 +440,107 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog):
|
||||
)
|
||||
|
||||
# END Test testCoreItem_XMLPackUnpack
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testCoreItem_ConvertFromFmt12(mockGUI):
|
||||
"""Test the setter for all the nwItemLayout values for the NWItem
|
||||
class using the class names that were present in file format 1.2.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theItem = NWItem(theProject)
|
||||
|
||||
# Deprecated Layouts
|
||||
theItem.setLayout("TITLE")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("PAGE")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("BOOK")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("PARTITION")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("UNNUMBERED")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("CHAPTER")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("SCENE")
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
theItem.setLayout("MUMBOJUMBO")
|
||||
assert theItem.itemLayout == nwItemLayout.NO_LAYOUT
|
||||
|
||||
# END Test testCoreItem_ConvertFromFmt12
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testCoreItem_ConvertFromFmt13(mockGUI):
|
||||
"""Test packing and unpacking XML objects for the NWItem class from
|
||||
format version 1.3
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
|
||||
# Make Version 1.3 XML
|
||||
nwXML = etree.Element("novelWriterXML")
|
||||
xContent = etree.SubElement(nwXML, "content")
|
||||
|
||||
# Folder
|
||||
xPack = etree.SubElement(xContent, "item", attrib={
|
||||
"handle": "a000000000001",
|
||||
"order": "1",
|
||||
"parent": "b000000000001",
|
||||
})
|
||||
NWItem._subPack(xPack, "name", text="Folder")
|
||||
NWItem._subPack(xPack, "type", text="FOLDER")
|
||||
NWItem._subPack(xPack, "class", text="NOVEL")
|
||||
NWItem._subPack(xPack, "status", text="New")
|
||||
NWItem._subPack(xPack, "expanded", text="True")
|
||||
|
||||
# Unpack Folder
|
||||
theItem = NWItem(theProject)
|
||||
theItem.unpackXML(xContent[0])
|
||||
assert theItem.itemHandle == "a000000000001"
|
||||
assert theItem.itemParent == "b000000000001"
|
||||
assert theItem.itemOrder == 1
|
||||
assert theItem.isExpanded is True
|
||||
assert theItem.isExported is True
|
||||
assert theItem.charCount == 0
|
||||
assert theItem.wordCount == 0
|
||||
assert theItem.paraCount == 0
|
||||
assert theItem.cursorPos == 0
|
||||
assert theItem.itemClass == nwItemClass.NOVEL
|
||||
assert theItem.itemType == nwItemType.FOLDER
|
||||
assert theItem.itemLayout == nwItemLayout.NO_LAYOUT
|
||||
|
||||
# File
|
||||
xPack = etree.SubElement(xContent, "item", attrib={
|
||||
"handle": "c000000000001",
|
||||
"order": "2",
|
||||
"parent": "a000000000001",
|
||||
})
|
||||
NWItem._subPack(xPack, "name", text="Scene")
|
||||
NWItem._subPack(xPack, "type", text="FILE")
|
||||
NWItem._subPack(xPack, "class", text="NOVEL")
|
||||
NWItem._subPack(xPack, "status", text="New")
|
||||
NWItem._subPack(xPack, "exported", text="True")
|
||||
NWItem._subPack(xPack, "layout", text="DOCUMENT")
|
||||
NWItem._subPack(xPack, "charCount", text="600")
|
||||
NWItem._subPack(xPack, "wordCount", text="100")
|
||||
NWItem._subPack(xPack, "paraCount", text="6")
|
||||
NWItem._subPack(xPack, "cursorPos", text="50")
|
||||
|
||||
# Unpack File
|
||||
theItem = NWItem(theProject)
|
||||
theItem.unpackXML(xContent[1])
|
||||
assert theItem.itemHandle == "c000000000001"
|
||||
assert theItem.itemParent == "a000000000001"
|
||||
assert theItem.itemOrder == 2
|
||||
assert theItem.isExpanded is False
|
||||
assert theItem.isExported is True
|
||||
assert theItem.charCount == 600
|
||||
assert theItem.wordCount == 100
|
||||
assert theItem.paraCount == 6
|
||||
assert theItem.cursorPos == 50
|
||||
assert theItem.itemClass == nwItemClass.NOVEL
|
||||
assert theItem.itemType == nwItemType.FILE
|
||||
assert theItem.itemLayout == nwItemLayout.DOCUMENT
|
||||
|
||||
# END Test testCoreItem_ConvertFromFmt13
|
||||
|
||||
@@ -28,12 +28,17 @@ from novelwriter.core import NWProject, NWDoc
|
||||
from novelwriter.core.tokenizer import Tokenizer
|
||||
|
||||
|
||||
class BareTokenizer(Tokenizer):
|
||||
def doConvert(self):
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.core
|
||||
def testCoreToken_Setters(mockGUI):
|
||||
"""Test all the setters for the Tokenizer class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
|
||||
# Verify defaults
|
||||
assert theToken._fmtTitle == "%title%"
|
||||
@@ -135,7 +140,7 @@ def testCoreToken_TextOps(monkeypatch, nwMinimal, mockGUI):
|
||||
theProject.projLang = "en"
|
||||
theProject._loadProjectLocalisation()
|
||||
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
theToken.setKeepMarkdown(True)
|
||||
|
||||
assert theProject.openProject(nwMinimal)
|
||||
@@ -222,7 +227,7 @@ def testCoreToken_HeaderFormat(mockGUI):
|
||||
"""Test the tokenization of header formats in the Tokenizer class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
theToken.setKeepMarkdown(True)
|
||||
|
||||
# Title
|
||||
@@ -426,7 +431,7 @@ def testCoreToken_MetaFormat(mockGUI):
|
||||
"""Test the tokenization of meta formats in the Tokenizer class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
theToken.setKeepMarkdown(True)
|
||||
|
||||
# Comment
|
||||
@@ -495,7 +500,7 @@ def testCoreToken_MarginFormat(mockGUI):
|
||||
"""Test the tokenization of margin formats in the Tokenizer class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
theToken.setKeepMarkdown(True)
|
||||
|
||||
# Alignment and Indentation
|
||||
@@ -550,7 +555,7 @@ def testCoreToken_TextFormat(mockGUI):
|
||||
"""Test the tokenization of text formats in the Tokenizer class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
theToken.setKeepMarkdown(True)
|
||||
|
||||
# Text
|
||||
@@ -672,7 +677,7 @@ def testCoreToken_SpecialFormat(mockGUI):
|
||||
"""Test the tokenization of special formats in the Tokenizer class.
|
||||
"""
|
||||
theProject = NWProject(mockGUI)
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
|
||||
theToken._isNovel = True
|
||||
|
||||
@@ -877,7 +882,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
|
||||
theProject = NWProject(mockGUI)
|
||||
theProject.projLang = "en"
|
||||
theProject._loadProjectLocalisation()
|
||||
theToken = Tokenizer(theProject)
|
||||
theToken = BareTokenizer(theProject)
|
||||
|
||||
# Nothing
|
||||
theToken._theText = "Some text ...\n"
|
||||
|
||||
@@ -379,36 +379,29 @@ def testCoreTree_XMLPackUnpack(mockGUI, mockItems):
|
||||
nwXML = etree.Element("novelWriterXML")
|
||||
theTree.packXML(nwXML)
|
||||
assert etree.tostring(nwXML, pretty_print=False, encoding="utf-8") == (
|
||||
b"<novelWriterXML>"
|
||||
b"<content count=\"8\">"
|
||||
b"<item handle=\"a000000000001\" order=\"0\" parent=\"None\">"
|
||||
b"<name>Novel</name><type>ROOT</type><class>NOVEL</class><status>None</status>"
|
||||
b"<expanded>True</expanded></item>"
|
||||
b"<item handle=\"b000000000001\" order=\"0\" parent=\"a000000000001\">"
|
||||
b"<name>Act One</name><type>FOLDER</type><class>NOVEL</class><status>None</status>"
|
||||
b"<expanded>True</expanded></item>"
|
||||
b"<item handle=\"c000000000001\" order=\"0\" parent=\"b000000000001\">"
|
||||
b"<name>Chapter One</name><type>FILE</type><class>NOVEL</class><status>None</status>"
|
||||
b"<exported>True</exported><layout>DOCUMENT</layout><charCount>300</charCount>"
|
||||
b"<wordCount>50</wordCount><paraCount>2</paraCount><cursorPos>0</cursorPos></item>"
|
||||
b"<item handle=\"c000000000002\" order=\"0\" parent=\"b000000000001\">"
|
||||
b"<name>Scene One</name><type>FILE</type><class>NOVEL</class><status>None</status>"
|
||||
b"<exported>True</exported><layout>DOCUMENT</layout><charCount>3000</charCount>"
|
||||
b"<wordCount>500</wordCount><paraCount>20</paraCount><cursorPos>0</cursorPos></item>"
|
||||
b"<item handle=\"a000000000002\" order=\"0\" parent=\"None\">"
|
||||
b"<name>Outtakes</name><type>ROOT</type><class>ARCHIVE</class><status>None</status>"
|
||||
b"<expanded>False</expanded></item>"
|
||||
b"<item handle=\"a000000000003\" order=\"0\" parent=\"None\">"
|
||||
b"<name>Trash</name><type>TRASH</type><class>TRASH</class><status>None</status>"
|
||||
b"<expanded>False</expanded></item>"
|
||||
b"<item handle=\"a000000000004\" order=\"0\" parent=\"None\">"
|
||||
b"<name>Characters</name><type>ROOT</type><class>CHARACTER</class><status>None</status>"
|
||||
b"<expanded>True</expanded></item>"
|
||||
b"<item handle=\"b000000000002\" order=\"0\" parent=\"a000000000002\">"
|
||||
b"<name>Jane Doe</name><type>FILE</type><class>CHARACTER</class><status>None</status>"
|
||||
b"<exported>True</exported><layout>NOTE</layout><charCount>2000</charCount>"
|
||||
b"<wordCount>400</wordCount><paraCount>16</paraCount><cursorPos>0</cursorPos></item>"
|
||||
b"</content></novelWriterXML>"
|
||||
b'<novelWriterXML>'
|
||||
b'<content count="8">'
|
||||
b'<item handle="a000000000001" parent="None" order="0" type="ROOT" class="NOVEL">'
|
||||
b'<meta expanded="True"/><name status="None">Novel</name></item>'
|
||||
b'<item handle="b000000000001" parent="a000000000001" order="0" type="FOLDER" '
|
||||
b'class="NOVEL"><meta expanded="True"/><name status="None">Act One</name></item>'
|
||||
b'<item handle="c000000000001" parent="b000000000001" order="0" type="FILE" class="NOVEL" '
|
||||
b'layout="DOCUMENT"><meta charCount="300" wordCount="50" paraCount="2" cursorPos="0"/>'
|
||||
b'<name status="None" exported="True">Chapter One</name></item>'
|
||||
b'<item handle="c000000000002" parent="b000000000001" order="0" type="FILE" class="NOVEL" '
|
||||
b'layout="DOCUMENT"><meta charCount="3000" wordCount="500" paraCount="20" cursorPos="0"/>'
|
||||
b'<name status="None" exported="True">Scene One</name></item>'
|
||||
b'<item handle="a000000000002" parent="None" order="0" type="ROOT" class="ARCHIVE">'
|
||||
b'<meta expanded="False"/><name status="None">Outtakes</name></item>'
|
||||
b'<item handle="a000000000003" parent="None" order="0" type="TRASH" class="TRASH">'
|
||||
b'<meta expanded="False"/><name status="None">Trash</name></item>'
|
||||
b'<item handle="a000000000004" parent="None" order="0" type="ROOT" class="CHARACTER">'
|
||||
b'<meta expanded="True"/><name status="None">Characters</name></item>'
|
||||
b'<item handle="b000000000002" parent="a000000000002" order="0" type="FILE" '
|
||||
b'class="CHARACTER" layout="NOTE"><meta charCount="2000" wordCount="400" paraCount="16" '
|
||||
b'cursorPos="0"/><name status="None" exported="True">Jane Doe</name></item>'
|
||||
b'</content>'
|
||||
b'</novelWriterXML>'
|
||||
)
|
||||
|
||||
theTree.clear()
|
||||
|
||||
Reference in New Issue
Block a user