Update tests

This commit is contained in:
Veronica Berglyd Olsen
2022-04-20 21:50:07 +02:00
parent e32eb21fbf
commit 607f9409d2
30 changed files with 740 additions and 781 deletions
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 20:40:13"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:01:32">
<project> <project>
<name>Test Custom</name> <name>Test Custom</name>
<title>Test Novel</title> <title>Test Novel</title>
@@ -29,110 +29,110 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sbc8960" count="17" red="100" green="100" blue="100">New</entry> <entry key="s000008" count="17" red="100" green="100" blue="100">New</entry>
<entry key="s1a3d1f" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000009" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="sad3c2d" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s00000a" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbd9c66" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s00000b" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="ie465e1" count="6" red="100" green="100" blue="100">New</entry> <entry key="i00000c" count="6" red="100" green="100" blue="100">New</entry>
<entry key="i8b9d24" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i00000d" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i16419f" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i00000e" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i972a84" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i00000f" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="23"> <content count="23">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000010" parent="None" root="0000000000010" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Novel</name> <name status="s000008" import="i00000c">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="0" type="ROOT" class="PLOT"> <item handle="0000000000011" parent="None" root="0000000000011" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Plot</name> <name status="s000008" import="i00000c">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="0" type="ROOT" class="CHARACTER"> <item handle="0000000000012" parent="None" root="0000000000012" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Characters</name> <name status="s000008" import="i00000c">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="0" type="ROOT" class="WORLD"> <item handle="0000000000013" parent="None" root="0000000000013" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Locations</name> <name status="s000008" import="i00000c">Locations</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="None" root="25fc0e7096fc6" order="0" type="ROOT" class="TIMELINE"> <item handle="0000000000014" parent="None" root="0000000000014" order="0" type="ROOT" class="TIMELINE">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Timeline</name> <name status="s000008" import="i00000c">Timeline</name>
</item> </item>
<item handle="31489056e0916" parent="None" root="31489056e0916" order="0" type="ROOT" class="OBJECT"> <item handle="0000000000015" parent="None" root="0000000000015" order="0" type="ROOT" class="OBJECT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Objects</name> <name status="s000008" import="i00000c">Objects</name>
</item> </item>
<item handle="98010bd9270f9" parent="None" root="98010bd9270f9" order="0" type="ROOT" class="ENTITY"> <item handle="0000000000016" parent="None" root="0000000000016" order="0" type="ROOT" class="ENTITY">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Entities</name> <name status="s000008" import="i00000c">Entities</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000017" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Title Page</name> <name status="s000008" import="i00000c" exported="True">Title Page</name>
</item> </item>
<item handle="1a6562590ef19" parent="73475cb40a568" root="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="0000000000018" parent="0000000000010" root="0000000000010" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Chapter 1</name> <name status="s000008" import="i00000c">Chapter 1</name>
</item> </item>
<item handle="031b4af5197ec" parent="1a6562590ef19" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000019" parent="0000000000018" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Chapter 1</name> <name status="s000008" import="i00000c" exported="True">Chapter 1</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="1a6562590ef19" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001a" parent="0000000000018" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 1.1</name> <name status="s000008" import="i00000c" exported="True">Scene 1.1</name>
</item> </item>
<item handle="2858dcd1057d3" parent="1a6562590ef19" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001b" parent="0000000000018" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 1.2</name> <name status="s000008" import="i00000c" exported="True">Scene 1.2</name>
</item> </item>
<item handle="2fca346db6561" parent="1a6562590ef19" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001c" parent="0000000000018" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 1.3</name> <name status="s000008" import="i00000c" exported="True">Scene 1.3</name>
</item> </item>
<item handle="02d20bbd7e394" parent="73475cb40a568" root="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="000000000001d" parent="0000000000010" root="0000000000010" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Chapter 2</name> <name status="s000008" import="i00000c">Chapter 2</name>
</item> </item>
<item handle="7688b6ef52555" parent="02d20bbd7e394" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001e" parent="000000000001d" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Chapter 2</name> <name status="s000008" import="i00000c" exported="True">Chapter 2</name>
</item> </item>
<item handle="c837649cce43f" parent="02d20bbd7e394" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001f" parent="000000000001d" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 2.1</name> <name status="s000008" import="i00000c" exported="True">Scene 2.1</name>
</item> </item>
<item handle="6208ef0f7750c" parent="02d20bbd7e394" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000020" parent="000000000001d" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 2.2</name> <name status="s000008" import="i00000c" exported="True">Scene 2.2</name>
</item> </item>
<item handle="3e1e967e9b793" parent="02d20bbd7e394" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000021" parent="000000000001d" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 2.3</name> <name status="s000008" import="i00000c" exported="True">Scene 2.3</name>
</item> </item>
<item handle="39fa9ec190eee" parent="73475cb40a568" root="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="0000000000022" parent="0000000000010" root="0000000000010" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Chapter 3</name> <name status="s000008" import="i00000c">Chapter 3</name>
</item> </item>
<item handle="d029fa3a95e17" parent="39fa9ec190eee" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000023" parent="0000000000022" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Chapter 3</name> <name status="s000008" import="i00000c" exported="True">Chapter 3</name>
</item> </item>
<item handle="81b8a03f97e87" parent="39fa9ec190eee" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000024" parent="0000000000022" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 3.1</name> <name status="s000008" import="i00000c" exported="True">Scene 3.1</name>
</item> </item>
<item handle="da4ea2a5506f2" parent="39fa9ec190eee" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000025" parent="0000000000022" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 3.2</name> <name status="s000008" import="i00000c" exported="True">Scene 3.2</name>
</item> </item>
<item handle="a68b412c42825" parent="39fa9ec190eee" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000026" parent="0000000000022" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 3.3</name> <name status="s000008" import="i00000c" exported="True">Scene 3.3</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 20:39:10"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:03:03">
<project> <project>
<name>Test Custom</name> <name>Test Custom</name>
<title>Test Novel</title> <title>Test Novel</title>
@@ -29,74 +29,74 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sbc8960" count="8" red="100" green="100" blue="100">New</entry> <entry key="s000008" count="8" red="100" green="100" blue="100">New</entry>
<entry key="s1a3d1f" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000009" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="sad3c2d" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s00000a" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbd9c66" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s00000b" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="ie465e1" count="6" red="100" green="100" blue="100">New</entry> <entry key="i00000c" count="6" red="100" green="100" blue="100">New</entry>
<entry key="i8b9d24" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i00000d" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i16419f" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i00000e" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i972a84" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i00000f" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="14"> <content count="14">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000010" parent="None" root="0000000000010" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Novel</name> <name status="s000008" import="i00000c">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="0" type="ROOT" class="PLOT"> <item handle="0000000000011" parent="None" root="0000000000011" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Plot</name> <name status="s000008" import="i00000c">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="0" type="ROOT" class="CHARACTER"> <item handle="0000000000012" parent="None" root="0000000000012" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Characters</name> <name status="s000008" import="i00000c">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="0" type="ROOT" class="WORLD"> <item handle="0000000000013" parent="None" root="0000000000013" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Locations</name> <name status="s000008" import="i00000c">Locations</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="None" root="25fc0e7096fc6" order="0" type="ROOT" class="TIMELINE"> <item handle="0000000000014" parent="None" root="0000000000014" order="0" type="ROOT" class="TIMELINE">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Timeline</name> <name status="s000008" import="i00000c">Timeline</name>
</item> </item>
<item handle="31489056e0916" parent="None" root="31489056e0916" order="0" type="ROOT" class="OBJECT"> <item handle="0000000000015" parent="None" root="0000000000015" order="0" type="ROOT" class="OBJECT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Objects</name> <name status="s000008" import="i00000c">Objects</name>
</item> </item>
<item handle="98010bd9270f9" parent="None" root="98010bd9270f9" order="0" type="ROOT" class="ENTITY"> <item handle="0000000000016" parent="None" root="0000000000016" order="0" type="ROOT" class="ENTITY">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Entities</name> <name status="s000008" import="i00000c">Entities</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000017" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Title Page</name> <name status="s000008" import="i00000c" exported="True">Title Page</name>
</item> </item>
<item handle="1a6562590ef19" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000018" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 1</name> <name status="s000008" import="i00000c" exported="True">Scene 1</name>
</item> </item>
<item handle="031b4af5197ec" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000019" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 2</name> <name status="s000008" import="i00000c" exported="True">Scene 2</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001a" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 3</name> <name status="s000008" import="i00000c" exported="True">Scene 3</name>
</item> </item>
<item handle="2858dcd1057d3" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001b" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 4</name> <name status="s000008" import="i00000c" exported="True">Scene 4</name>
</item> </item>
<item handle="2fca346db6561" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001c" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 5</name> <name status="s000008" import="i00000c" exported="True">Scene 5</name>
</item> </item>
<item handle="02d20bbd7e394" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000001d" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Scene 6</name> <name status="s000008" import="i00000c" exported="True">Scene 6</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 20:37:42"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:09:19">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,58 +27,58 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sbc8960" count="6" red="100" green="100" blue="100">New</entry> <entry key="s000008" count="5" red="100" green="100" blue="100">New</entry>
<entry key="s1a3d1f" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000009" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="sad3c2d" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s00000a" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbd9c66" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s00000b" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="ie465e1" count="4" red="100" green="100" blue="100">New</entry> <entry key="i00000c" count="3" red="100" green="100" blue="100">New</entry>
<entry key="i8b9d24" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i00000d" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i16419f" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i00000e" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i972a84" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i00000f" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="10"> <content count="10">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000010" parent="None" root="0000000000010" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Novel</name> <name status="s000008" import="i00000c">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="0" type="ROOT" class="PLOT"> <item handle="0000000000011" parent="None" root="0000000000011" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Plot</name> <name status="s000008" import="i00000c">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="0" type="ROOT" class="CHARACTER"> <item handle="0000000000012" parent="None" root="0000000000012" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Characters</name> <name status="s000008" import="i00000c">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="0" type="ROOT" class="WORLD"> <item handle="0000000000013" parent="None" root="0000000000013" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">World</name> <name status="s000008" import="i00000c">World</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000014" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Title Page</name> <name status="s000008" import="i00000c" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" root="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="0000000000015" parent="0000000000010" root="0000000000010" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">New Chapter</name> <name status="s000008" import="i00000c">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000016" parent="0000000000015" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">New Chapter</name> <name status="s000008" import="i00000c" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000017" parent="0000000000015" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">New Scene</name> <name status="s000008" import="i00000c" exported="True">New Scene</name>
</item> </item>
<item handle="1a6562590ef19" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000028" parent="31489056e0916" root="None" order="0" type="FILE" class="NO_CLASS" layout="NO_LAYOUT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Hello</name> <name status="None" import="None" exported="True">Hello</name>
</item> </item>
<item handle="031b4af5197ec" parent="71ee45a3c0db9" root="71ee45a3c0db9" order="0" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="0000000000029" parent="71ee45a3c0db9" root="None" order="0" type="FILE" class="NO_CLASS" layout="NO_LAYOUT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Jane</name> <name status="None" import="None" exported="True">Jane</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,9 +1,9 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 14:13:27"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:00:23">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
<saveCount>1</saveCount> <saveCount>2</saveCount>
<autoCount>1</autoCount> <autoCount>1</autoCount>
<editTime>0</editTime> <editTime>0</editTime>
</project> </project>
@@ -27,50 +27,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sbc8960" count="5" red="100" green="100" blue="100">New</entry> <entry key="s000008" count="5" red="100" green="100" blue="100">New</entry>
<entry key="s1a3d1f" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000009" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="sad3c2d" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s00000a" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbd9c66" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s00000b" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="ie465e1" count="3" red="100" green="100" blue="100">New</entry> <entry key="i00000c" count="3" red="100" green="100" blue="100">New</entry>
<entry key="i8b9d24" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i00000d" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i16419f" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i00000e" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i972a84" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i00000f" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000010" parent="None" root="0000000000010" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Novel</name> <name status="s000008" import="i00000c">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="0" type="ROOT" class="PLOT"> <item handle="0000000000011" parent="None" root="0000000000011" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Plot</name> <name status="s000008" import="i00000c">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="0" type="ROOT" class="CHARACTER"> <item handle="0000000000012" parent="None" root="0000000000012" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Characters</name> <name status="s000008" import="i00000c">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="0" type="ROOT" class="WORLD"> <item handle="0000000000013" parent="None" root="0000000000013" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">World</name> <name status="s000008" import="i00000c">World</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000014" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Title Page</name> <name status="s000008" import="i00000c" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" root="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="0000000000015" parent="0000000000010" root="0000000000010" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">New Chapter</name> <name status="s000008" import="i00000c">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000016" parent="0000000000015" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">New Chapter</name> <name status="s000008" import="i00000c" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000017" parent="0000000000015" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">New Scene</name> <name status="s000008" import="i00000c" exported="True">New Scene</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 20:38:35"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:04:09">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,82 +27,82 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sbc8960" count="6" red="100" green="100" blue="100">New</entry> <entry key="s000008" count="6" red="100" green="100" blue="100">New</entry>
<entry key="s1a3d1f" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000009" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="sad3c2d" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s00000a" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbd9c66" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s00000b" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="ie465e1" count="10" red="100" green="100" blue="100">New</entry> <entry key="i00000c" count="10" red="100" green="100" blue="100">New</entry>
<entry key="i8b9d24" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i00000d" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i16419f" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i00000e" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i972a84" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i00000f" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="16"> <content count="16">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000010" parent="None" root="0000000000010" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Novel</name> <name status="s000008" import="i00000c">Novel</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="0" type="ROOT" class="PLOT"> <item handle="0000000000011" parent="None" root="0000000000011" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Plot</name> <name status="s000008" import="i00000c">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="0" type="ROOT" class="CHARACTER"> <item handle="0000000000012" parent="None" root="0000000000012" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Characters</name> <name status="s000008" import="i00000c">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="0" type="ROOT" class="WORLD"> <item handle="0000000000013" parent="None" root="0000000000013" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">World</name> <name status="s000008" import="i00000c">World</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000014" parent="0000000000010" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">Title Page</name> <name status="s000008" import="i00000c" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" root="73475cb40a568" order="0" type="FOLDER" class="NOVEL"> <item handle="0000000000015" parent="0000000000010" root="0000000000010" order="0" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">New Chapter</name> <name status="s000008" import="i00000c">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000016" parent="0000000000015" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">New Chapter</name> <name status="s000008" import="i00000c" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="0000000000017" parent="0000000000015" root="0000000000010" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/> <meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
<name status="sbc8960" import="ie465e1" exported="True">New Scene</name> <name status="s000008" import="i00000c" exported="True">New Scene</name>
</item> </item>
<item handle="1a6562590ef19" parent="None" root="1a6562590ef19" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000028" parent="None" root="0000000000028" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Novel</name> <name status="s000008" import="i00000c">Novel</name>
</item> </item>
<item handle="031b4af5197ec" parent="None" root="031b4af5197ec" order="0" type="ROOT" class="PLOT"> <item handle="0000000000029" parent="None" root="0000000000029" order="0" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Plot</name> <name status="s000008" import="i00000c">Plot</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="None" root="41cfc0d1f2d12" order="0" type="ROOT" class="CHARACTER"> <item handle="000000000002a" parent="None" root="000000000002a" order="0" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Character</name> <name status="s000008" import="i00000c">Character</name>
</item> </item>
<item handle="2858dcd1057d3" parent="None" root="2858dcd1057d3" order="0" type="ROOT" class="WORLD"> <item handle="000000000002b" parent="None" root="000000000002b" order="0" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">World</name> <name status="s000008" import="i00000c">World</name>
</item> </item>
<item handle="2fca346db6561" parent="None" root="2fca346db6561" order="0" type="ROOT" class="TIMELINE"> <item handle="000000000002c" parent="None" root="000000000002c" order="0" type="ROOT" class="TIMELINE">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Timeline</name> <name status="s000008" import="i00000c">Timeline</name>
</item> </item>
<item handle="02d20bbd7e394" parent="None" root="02d20bbd7e394" order="0" type="ROOT" class="OBJECT"> <item handle="000000000002d" parent="None" root="000000000002d" order="0" type="ROOT" class="OBJECT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Object</name> <name status="s000008" import="i00000c">Object</name>
</item> </item>
<item handle="7688b6ef52555" parent="None" root="7688b6ef52555" order="0" type="ROOT" class="CUSTOM"> <item handle="000000000002e" parent="None" root="000000000002e" order="0" type="ROOT" class="CUSTOM">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Custom1</name> <name status="s000008" import="i00000c">Custom1</name>
</item> </item>
<item handle="c837649cce43f" parent="None" root="c837649cce43f" order="0" type="ROOT" class="CUSTOM"> <item handle="000000000002f" parent="None" root="000000000002f" order="0" type="ROOT" class="CUSTOM">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sbc8960" import="ie465e1">Custom2</name> <name status="s000008" import="i00000c">Custom2</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
%%~name: New Scene %%~name: New Scene
%%~path: 31489056e0916/0e17daca5f3e1 %%~path: 000000000000d/000000000000f
%%~kind: NOVEL/DOCUMENT %%~kind: NOVEL/DOCUMENT
# Novel # Novel
@@ -1,5 +1,5 @@
%%~name: New Note %%~name: New Note
%%~path: 71ee45a3c0db9/1a6562590ef19 %%~path: 000000000000a/0000000000020
%%~kind: CHARACTER/NOTE %%~kind: CHARACTER/NOTE
# Jane Doe # Jane Doe
@@ -1,5 +1,5 @@
%%~name: New Note %%~name: New Note
%%~path: 44cb730c42048/031b4af5197ec %%~path: 0000000000009/0000000000021
%%~kind: PLOT/NOTE %%~kind: PLOT/NOTE
# Main Plot # Main Plot
@@ -1,5 +1,5 @@
%%~name: New Note %%~name: New Note
%%~path: 811786ad1ae74/41cfc0d1f2d12 %%~path: 000000000000b/0000000000022
%%~kind: WORLD/NOTE %%~kind: WORLD/NOTE
# Main Location # Main Location
@@ -1,11 +1,11 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-17 14:18:28"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 21:23:06">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
<saveCount>5</saveCount> <saveCount>5</saveCount>
<autoCount>2</autoCount> <autoCount>2</autoCount>
<editTime>3</editTime> <editTime>4</editTime>
</project> </project>
<settings> <settings>
<doBackup>True</doBackup> <doBackup>True</doBackup>
@@ -13,7 +13,7 @@
<spellCheck>True</spellCheck> <spellCheck>True</spellCheck>
<spellLang>None</spellLang> <spellLang>None</spellLang>
<autoOutline>True</autoOutline> <autoOutline>True</autoOutline>
<lastEdited>0e17daca5f3e1</lastEdited> <lastEdited>000000000000f</lastEdited>
<lastViewed>None</lastViewed> <lastViewed>None</lastViewed>
<lastWordCount>126</lastWordCount> <lastWordCount>126</lastWordCount>
<novelWordCount>99</novelWordCount> <novelWordCount>99</novelWordCount>
@@ -27,66 +27,66 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sa3b179" count="5" red="100" green="100" blue="100">New</entry> <entry key="s000000" count="5" red="100" green="100" blue="100">New</entry>
<entry key="s1c8031" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000001" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="s06671a" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s000002" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbdd640" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s000003" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="i466852" count="7" red="100" green="100" blue="100">New</entry> <entry key="i000004" count="7" red="100" green="100" blue="100">New</entry>
<entry key="i3eb13b" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i000005" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i392456" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i000006" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i23b8c1" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i000007" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="12"> <content count="12">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000008" parent="None" root="0000000000008" order="0" type="ROOT" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="sa3b179" import="i466852">Novel</name> <name status="s000000" import="i000004">Novel</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">Title Page</name> <name status="s000000" import="i000004" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" root="73475cb40a568" order="1" type="FOLDER" class="NOVEL"> <item handle="000000000000d" parent="0000000000008" root="0000000000008" order="1" type="FOLDER" class="NOVEL">
<meta expanded="True"/> <meta expanded="True"/>
<name status="sa3b179" import="i466852">New Chapter</name> <name status="s000000" import="i000004">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">New Chapter</name> <name status="s000000" import="i000004" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" root="73475cb40a568" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000f" parent="000000000000d" root="0000000000008" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="612" wordCount="95" paraCount="10" cursorPos="768"/> <meta charCount="612" wordCount="95" paraCount="10" cursorPos="768"/>
<name status="sa3b179" import="i466852" exported="True">New Scene</name> <name status="s000000" import="i000004" exported="True">New Scene</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="1" type="ROOT" class="PLOT"> <item handle="0000000000009" parent="None" root="0000000000009" order="1" type="ROOT" class="PLOT">
<meta expanded="True"/> <meta expanded="True"/>
<name status="sa3b179" import="i466852">Plot</name> <name status="s000000" import="i000004">Plot</name>
</item> </item>
<item handle="031b4af5197ec" parent="44cb730c42048" root="44cb730c42048" order="0" type="FILE" class="PLOT" layout="NOTE"> <item handle="0000000000021" parent="0000000000009" root="0000000000009" order="0" type="FILE" class="PLOT" layout="NOTE">
<meta charCount="48" wordCount="10" paraCount="1" cursorPos="69"/> <meta charCount="48" wordCount="10" paraCount="1" cursorPos="69"/>
<name status="sa3b179" import="i466852" exported="True">New Note</name> <name status="s000000" import="i000004" exported="True">New Note</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="2" type="ROOT" class="CHARACTER"> <item handle="000000000000a" parent="None" root="000000000000a" order="2" type="ROOT" class="CHARACTER">
<meta expanded="True"/> <meta expanded="True"/>
<name status="sa3b179" import="i466852">Characters</name> <name status="s000000" import="i000004">Characters</name>
</item> </item>
<item handle="1a6562590ef19" parent="71ee45a3c0db9" root="71ee45a3c0db9" order="0" type="FILE" class="CHARACTER" layout="NOTE"> <item handle="0000000000020" parent="000000000000a" root="000000000000a" order="0" type="FILE" class="CHARACTER" layout="NOTE">
<meta charCount="34" wordCount="8" paraCount="1" cursorPos="51"/> <meta charCount="34" wordCount="8" paraCount="1" cursorPos="51"/>
<name status="sa3b179" import="i466852" exported="True">New Note</name> <name status="s000000" import="i000004" exported="True">New Note</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="3" type="ROOT" class="WORLD"> <item handle="000000000000b" parent="None" root="000000000000b" order="3" type="ROOT" class="WORLD">
<meta expanded="True"/> <meta expanded="True"/>
<name status="sa3b179" import="i466852">World</name> <name status="s000000" import="i000004">World</name>
</item> </item>
<item handle="41cfc0d1f2d12" parent="811786ad1ae74" root="811786ad1ae74" order="0" type="FILE" class="WORLD" layout="NOTE"> <item handle="0000000000022" parent="000000000000b" root="000000000000b" order="0" type="FILE" class="WORLD" layout="NOTE">
<meta charCount="51" wordCount="9" paraCount="1" cursorPos="68"/> <meta charCount="51" wordCount="9" paraCount="1" cursorPos="68"/>
<name status="sa3b179" import="i466852" exported="True">New Note</name> <name status="s000000" import="i000004" exported="True">New Note</name>
</item> </item>
<item handle="2fca346db6561" parent="None" root="2fca346db6561" order="4" type="TRASH" class="TRASH"> <item handle="0000000000024" parent="None" root="0000000000024" order="4" type="TRASH" class="TRASH">
<meta expanded="True"/> <meta expanded="True"/>
<name status="sa3b179" import="i466852">Trash</name> <name status="s000000" import="i000004">Trash</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 12:48:08"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:57:43">
<project> <project>
<name>New Project</name> <name>New Project</name>
<title></title> <title></title>
@@ -27,50 +27,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sa3b179" count="5" red="100" green="100" blue="100">New</entry> <entry key="s000000" count="5" red="100" green="100" blue="100">New</entry>
<entry key="s1c8031" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000001" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="s06671a" count="0" red="200" green="150" blue="0">Draft</entry> <entry key="s000002" count="0" red="200" green="150" blue="0">Draft</entry>
<entry key="sbdd640" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s000003" count="0" red="50" green="200" blue="0">Finished</entry>
</status> </status>
<importance> <importance>
<entry key="i466852" count="3" red="100" green="100" blue="100">New</entry> <entry key="i000004" count="3" red="100" green="100" blue="100">New</entry>
<entry key="i3eb13b" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i000005" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i392456" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i000006" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i23b8c1" count="0" red="50" green="200" blue="0">Main</entry> <entry key="i000007" count="0" red="50" green="200" blue="0">Main</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000008" parent="None" root="0000000000008" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">Novel</name> <name status="s000000" import="i000004">Novel</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">Title Page</name> <name status="s000000" import="i000004" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" root="73475cb40a568" order="1" type="FOLDER" class="NOVEL"> <item handle="000000000000d" parent="0000000000008" root="0000000000008" order="1" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">New Chapter</name> <name status="s000000" import="i000004">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">New Chapter</name> <name status="s000000" import="i000004" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" root="73475cb40a568" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000f" parent="000000000000d" root="0000000000008" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">New Scene</name> <name status="s000000" import="i000004" exported="True">New Scene</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="1" type="ROOT" class="PLOT"> <item handle="0000000000009" parent="None" root="0000000000009" order="1" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">Plot</name> <name status="s000000" import="i000004">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="2" type="ROOT" class="CHARACTER"> <item handle="000000000000a" parent="None" root="000000000000a" order="2" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">Characters</name> <name status="s000000" import="i000004">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="3" type="ROOT" class="WORLD"> <item handle="000000000000b" parent="None" root="000000000000b" order="3" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">World</name> <name status="s000000" import="i000004">World</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-16 20:52:19"> <novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-20 20:50:55">
<project> <project>
<name>Project Name</name> <name>Project Name</name>
<title>Project Title</title> <title>Project Title</title>
@@ -33,50 +33,50 @@
<section></section> <section></section>
</titleFormat> </titleFormat>
<status> <status>
<entry key="sa3b179" count="5" red="100" green="100" blue="100">New</entry> <entry key="s000000" count="5" red="100" green="100" blue="100">New</entry>
<entry key="s1c8031" count="0" red="200" green="50" blue="0">Note</entry> <entry key="s000001" count="0" red="200" green="50" blue="0">Note</entry>
<entry key="sbdd640" count="0" red="50" green="200" blue="0">Finished</entry> <entry key="s000003" count="0" red="50" green="200" blue="0">Finished</entry>
<entry key="sbc8960" count="0" red="20" green="30" blue="40">Final</entry> <entry key="s000010" count="0" red="20" green="30" blue="40">Final</entry>
</status> </status>
<importance> <importance>
<entry key="i466852" count="3" red="100" green="100" blue="100">New</entry> <entry key="i000004" count="3" red="100" green="100" blue="100">New</entry>
<entry key="i3eb13b" count="0" red="200" green="50" blue="0">Minor</entry> <entry key="i000005" count="0" red="200" green="50" blue="0">Minor</entry>
<entry key="i392456" count="0" red="200" green="150" blue="0">Major</entry> <entry key="i000006" count="0" red="200" green="150" blue="0">Major</entry>
<entry key="i1a3d1f" count="0" red="100" green="100" blue="100">Final</entry> <entry key="i000011" count="0" red="100" green="100" blue="100">Final</entry>
</importance> </importance>
</settings> </settings>
<content count="8"> <content count="8">
<item handle="73475cb40a568" parent="None" root="73475cb40a568" order="0" type="ROOT" class="NOVEL"> <item handle="0000000000008" parent="None" root="0000000000008" order="0" type="ROOT" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">Novel</name> <name status="s000000" import="i000004">Novel</name>
</item> </item>
<item handle="25fc0e7096fc6" parent="73475cb40a568" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000c" parent="0000000000008" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">Title Page</name> <name status="s000000" import="i000004" exported="True">Title Page</name>
</item> </item>
<item handle="31489056e0916" parent="73475cb40a568" root="73475cb40a568" order="1" type="FOLDER" class="NOVEL"> <item handle="000000000000d" parent="0000000000008" root="0000000000008" order="1" type="FOLDER" class="NOVEL">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">New Chapter</name> <name status="s000000" import="i000004">New Chapter</name>
</item> </item>
<item handle="98010bd9270f9" parent="31489056e0916" root="73475cb40a568" order="0" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000e" parent="000000000000d" root="0000000000008" order="0" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="11" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">New Chapter</name> <name status="s000000" import="i000004" exported="True">New Chapter</name>
</item> </item>
<item handle="0e17daca5f3e1" parent="31489056e0916" root="73475cb40a568" order="1" type="FILE" class="NOVEL" layout="DOCUMENT"> <item handle="000000000000f" parent="000000000000d" root="0000000000008" order="1" type="FILE" class="NOVEL" layout="DOCUMENT">
<meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/> <meta charCount="9" wordCount="2" paraCount="0" cursorPos="0"/>
<name status="sa3b179" import="i466852" exported="True">New Scene</name> <name status="s000000" import="i000004" exported="True">New Scene</name>
</item> </item>
<item handle="44cb730c42048" parent="None" root="44cb730c42048" order="1" type="ROOT" class="PLOT"> <item handle="0000000000009" parent="None" root="0000000000009" order="1" type="ROOT" class="PLOT">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">Plot</name> <name status="s000000" import="i000004">Plot</name>
</item> </item>
<item handle="71ee45a3c0db9" parent="None" root="71ee45a3c0db9" order="2" type="ROOT" class="CHARACTER"> <item handle="000000000000a" parent="None" root="000000000000a" order="2" type="ROOT" class="CHARACTER">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">Characters</name> <name status="s000000" import="i000004">Characters</name>
</item> </item>
<item handle="811786ad1ae74" parent="None" root="811786ad1ae74" order="3" type="ROOT" class="WORLD"> <item handle="000000000000b" parent="None" root="000000000000b" order="3" type="ROOT" class="WORLD">
<meta expanded="False"/> <meta expanded="False"/>
<name status="sa3b179" import="i466852">World</name> <name status="s000000" import="i000004">World</name>
</item> </item>
</content> </content>
</novelWriterXML> </novelWriterXML>
-5
View File
@@ -43,7 +43,6 @@ def testCoreIndex_LoadSave(monkeypatch, nwLipsum, mockGUI, outDir, refDir):
compFile = os.path.join(refDir, "coreIndex_LoadSave_tagsIndex.json") compFile = os.path.join(refDir, "coreIndex_LoadSave_tagsIndex.json")
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.openProject(nwLipsum) assert theProject.openProject(nwLipsum)
theIndex = NWIndex(theProject) theIndex = NWIndex(theProject)
@@ -125,7 +124,6 @@ def testCoreIndex_ScanThis(nwMinimal, mockGUI):
"""Test the tag scanner function scanThis. """Test the tag scanner function scanThis.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.openProject(nwMinimal) is True assert theProject.openProject(nwMinimal) is True
theIndex = NWIndex(theProject) theIndex = NWIndex(theProject)
@@ -177,7 +175,6 @@ def testCoreIndex_CheckThese(nwMinimal, mockGUI):
"""Test the tag checker function checkThese. """Test the tag checker function checkThese.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.openProject(nwMinimal) is True assert theProject.openProject(nwMinimal) is True
theIndex = NWIndex(theProject) theIndex = NWIndex(theProject)
@@ -254,7 +251,6 @@ def testCoreIndex_ScanText(nwMinimal, mockGUI):
"""Check the index text scanner. """Check the index text scanner.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.openProject(nwMinimal) is True assert theProject.openProject(nwMinimal) is True
theIndex = NWIndex(theProject) theIndex = NWIndex(theProject)
@@ -473,7 +469,6 @@ def testCoreIndex_ExtractData(nwMinimal, mockGUI):
"""Check the index data extraction functions. """Check the index data extraction functions.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.openProject(nwMinimal) is True assert theProject.openProject(nwMinimal) is True
theIndex = NWIndex(theProject) theIndex = NWIndex(theProject)
+24 -21
View File
@@ -20,7 +20,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import pytest import pytest
import random
from lxml import etree from lxml import etree
@@ -32,13 +31,15 @@ from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
@pytest.mark.core @pytest.mark.core
def testCoreItem_Setters(mockGUI, constData): def testCoreItem_Setters(mockGUI, mockRnd):
"""Test all the simple setters for the NWItem class. """Test all the simple setters for the NWItem class.
""" """
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theItem = NWItem(theProject) theItem = NWItem(theProject)
statusKeys = ["s000000", "s000001", "s000002", "s000003"]
importKeys = ["i000004", "i000005", "i000006", "i000007"]
# Name # Name
theItem.setName("A Name") theItem.setName("A Name")
assert theItem.itemName == "A Name" assert theItem.itemName == "A Name"
@@ -94,30 +95,30 @@ def testCoreItem_Setters(mockGUI, constData):
# Importance # Importance
theItem._class = nwItemClass.CHARACTER theItem._class = nwItemClass.CHARACTER
theItem.setImport("Word") theItem.setImport("Word")
assert theItem.itemImport == constData.importKeys[0] # Default assert theItem.itemImport == importKeys[0] # Default
for key in constData.importKeys: for key in importKeys:
theItem.setImport(key) theItem.setImport(key)
assert theItem.itemImport == key assert theItem.itemImport == key
# Status # Status
theItem._class = nwItemClass.NOVEL theItem._class = nwItemClass.NOVEL
theItem.setStatus("Word") theItem.setStatus("Word")
assert theItem.itemStatus == constData.statusKeys[0] # Default assert theItem.itemStatus == statusKeys[0] # Default
for key in constData.statusKeys: for key in statusKeys:
theItem.setStatus(key) theItem.setStatus(key)
assert theItem.itemStatus == key assert theItem.itemStatus == key
# Status/Importance Wrapper # Status/Importance Wrapper
theItem._class = nwItemClass.CHARACTER theItem._class = nwItemClass.CHARACTER
for key in constData.importKeys: for key in importKeys:
theItem.setImport(key) theItem.setImport(key)
assert theItem.itemImport == key assert theItem.itemImport == key
assert theItem.itemStatus == constData.statusKeys[3] # Should not change assert theItem.itemStatus == statusKeys[3] # Should not change
theItem._class = nwItemClass.NOVEL theItem._class = nwItemClass.NOVEL
for key in constData.statusKeys: for key in statusKeys:
theItem.setStatus(key) theItem.setStatus(key)
assert theItem.itemImport == constData.importKeys[3] # Should not change assert theItem.itemImport == importKeys[3] # Should not change
assert theItem.itemStatus == key assert theItem.itemStatus == key
# Expanded # Expanded
@@ -465,13 +466,15 @@ def testCoreItem_ClassDefaults(mockGUI):
@pytest.mark.core @pytest.mark.core
def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData): def testCoreItem_XMLPackUnpack(mockGUI, caplog, mockRnd):
"""Test packing and unpacking XML objects for the NWItem class. """Test packing and unpacking XML objects for the NWItem class.
""" """
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
nwXML = etree.Element("novelWriterXML") nwXML = etree.Element("novelWriterXML")
statusKeys = ["s000000", "s000001", "s000002", "s000003"]
importKeys = ["i000004", "i000005", "i000006", "i000007"]
# File # File
# ==== # ====
@@ -483,7 +486,7 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData):
theItem.setName("A Name") theItem.setName("A Name")
theItem.setClass("NOVEL") theItem.setClass("NOVEL")
theItem.setType("FILE") theItem.setType("FILE")
theItem.setImport(constData.importKeys[3]) theItem.setImport(importKeys[3])
theItem.setLayout("NOTE") theItem.setLayout("NOTE")
theItem.setExported(False) theItem.setExported(False)
theItem.setParaCount(3) theItem.setParaCount(3)
@@ -500,7 +503,7 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData):
b'type="FILE" class="NOVEL" layout="NOTE"><meta charCount="7" wordCount="5" paraCount="3" ' b'type="FILE" class="NOVEL" layout="NOTE"><meta charCount="7" wordCount="5" paraCount="3" '
b'cursorPos="11"/><name status="None" import="%s" exported="False">A Name</name></item>' b'cursorPos="11"/><name status="None" import="%s" exported="False">A Name</name></item>'
b'</content>' b'</content>'
) % bytes(constData.importKeys[3], encoding="utf8") ) % bytes(importKeys[3], encoding="utf8")
# Unpack # Unpack
theItem = NWItem(theProject) theItem = NWItem(theProject)
@@ -517,8 +520,8 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData):
assert theItem.itemClass == nwItemClass.NOVEL assert theItem.itemClass == nwItemClass.NOVEL
assert theItem.itemType == nwItemType.FILE assert theItem.itemType == nwItemType.FILE
assert theItem.itemLayout == nwItemLayout.NOTE assert theItem.itemLayout == nwItemLayout.NOTE
assert theItem.itemStatus == constData.statusKeys[0] # Was None, should now be default assert theItem.itemStatus == statusKeys[0] # Was None, should now be default
assert theItem.itemImport == constData.importKeys[3] assert theItem.itemImport == importKeys[3]
# Folder # Folder
# ====== # ======
@@ -531,7 +534,7 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData):
theItem.setName("A Name") theItem.setName("A Name")
theItem.setClass("NOVEL") theItem.setClass("NOVEL")
theItem.setType("FOLDER") theItem.setType("FOLDER")
theItem.setStatus(constData.statusKeys[1]) theItem.setStatus(statusKeys[1])
theItem.setLayout("NOTE") theItem.setLayout("NOTE")
theItem.setExpanded(True) theItem.setExpanded(True)
theItem.setExported(False) theItem.setExported(False)
@@ -549,7 +552,7 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData):
b'type="FOLDER" class="NOVEL"><meta expanded="True"/><name status="%s" ' b'type="FOLDER" class="NOVEL"><meta expanded="True"/><name status="%s" '
b'import="None">A Name</name></item>' b'import="None">A Name</name></item>'
b'</content>' b'</content>'
) % bytes(constData.statusKeys[1], encoding="utf8") ) % bytes(statusKeys[1], encoding="utf8")
# Unpack # Unpack
theItem = NWItem(theProject) theItem = NWItem(theProject)
@@ -567,8 +570,8 @@ def testCoreItem_XMLPackUnpack(mockGUI, caplog, constData):
assert theItem.itemClass == nwItemClass.NOVEL assert theItem.itemClass == nwItemClass.NOVEL
assert theItem.itemType == nwItemType.FOLDER assert theItem.itemType == nwItemType.FOLDER
assert theItem.itemLayout == nwItemLayout.NO_LAYOUT assert theItem.itemLayout == nwItemLayout.NO_LAYOUT
assert theItem.itemStatus == constData.statusKeys[1] assert theItem.itemStatus == statusKeys[1]
assert theItem.itemImport == constData.importKeys[0] # Was None, should now be default assert theItem.itemImport == importKeys[0] # Was None, should now be default
# Errors # Errors
# ====== # ======
+62 -70
View File
@@ -21,7 +21,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
import os import os
import pytest import pytest
import random
from shutil import copyfile from shutil import copyfile
from zipfile import ZipFile from zipfile import ZipFile
@@ -37,7 +36,7 @@ from novelwriter.constants import nwFiles
@pytest.mark.core @pytest.mark.core
def testCoreProject_NewMinimal(fncDir, outDir, refDir, mockGUI): def testCoreProject_NewMinimal(fncDir, outDir, refDir, mockGUI, mockRnd):
"""Create a new project from a project wizard dictionary. With """Create a new project from a project wizard dictionary. With
default setting, creating a Minimal project. default setting, creating a Minimal project.
""" """
@@ -45,9 +44,7 @@ def testCoreProject_NewMinimal(fncDir, outDir, refDir, mockGUI):
testFile = os.path.join(outDir, "coreProject_NewMinimal_nwProject.nwx") testFile = os.path.join(outDir, "coreProject_NewMinimal_nwProject.nwx")
compFile = os.path.join(refDir, "coreProject_NewMinimal_nwProject.nwx") compFile = os.path.join(refDir, "coreProject_NewMinimal_nwProject.nwx")
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
# Setting no data should fail # Setting no data should fail
assert theProject.newProject({}) is False assert theProject.newProject({}) is False
@@ -86,7 +83,7 @@ def testCoreProject_NewMinimal(fncDir, outDir, refDir, mockGUI):
@pytest.mark.core @pytest.mark.core
def testCoreProject_NewCustomA(fncDir, outDir, refDir, mockGUI): def testCoreProject_NewCustomA(fncDir, outDir, refDir, mockGUI, mockRnd):
"""Create a new project from a project wizard dictionary. """Create a new project from a project wizard dictionary.
Custom type with chapters and scenes. Custom type with chapters and scenes.
""" """
@@ -114,9 +111,7 @@ def testCoreProject_NewCustomA(fncDir, outDir, refDir, mockGUI):
"numScenes": 3, "numScenes": 3,
"chFolders": True, "chFolders": True,
} }
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.newProject(projData) is True assert theProject.newProject(projData) is True
assert theProject.saveProject() is True assert theProject.saveProject() is True
@@ -129,7 +124,7 @@ def testCoreProject_NewCustomA(fncDir, outDir, refDir, mockGUI):
@pytest.mark.core @pytest.mark.core
def testCoreProject_NewCustomB(fncDir, outDir, refDir, mockGUI): def testCoreProject_NewCustomB(fncDir, outDir, refDir, mockGUI, mockRnd):
"""Create a new project from a project wizard dictionary. """Create a new project from a project wizard dictionary.
Custom type without chapters, but with scenes. Custom type without chapters, but with scenes.
""" """
@@ -157,9 +152,7 @@ def testCoreProject_NewCustomB(fncDir, outDir, refDir, mockGUI):
"numScenes": 6, "numScenes": 6,
"chFolders": True, "chFolders": True,
} }
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.newProject(projData) is True assert theProject.newProject(projData) is True
assert theProject.saveProject() is True assert theProject.saveProject() is True
@@ -186,7 +179,6 @@ def testCoreProject_NewSampleA(fncDir, tmpConf, mockGUI, tmpDir):
"popCustom": False, "popCustom": False,
} }
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
# Sample set, but no path # Sample set, but no path
assert not theProject.newProject({"popSample": True}) assert not theProject.newProject({"popSample": True})
@@ -235,7 +227,6 @@ def testCoreProject_NewSampleB(monkeypatch, fncDir, tmpConf, mockGUI, tmpDir):
"popCustom": False, "popCustom": False,
} }
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
# Make sure we do not pick up the novelwriter/assets/sample.zip file # Make sure we do not pick up the novelwriter/assets/sample.zip file
tmpConf.assetPath = tmpDir tmpConf.assetPath = tmpDir
@@ -259,16 +250,14 @@ def testCoreProject_NewSampleB(monkeypatch, fncDir, tmpConf, mockGUI, tmpDir):
@pytest.mark.core @pytest.mark.core
def testCoreProject_NewRoot(fncDir, outDir, refDir, mockGUI): def testCoreProject_NewRoot(fncDir, outDir, refDir, mockGUI, mockRnd):
"""Check that new root folders can be added to the project. """Check that new root folders can be added to the project.
""" """
projFile = os.path.join(fncDir, "nwProject.nwx") projFile = os.path.join(fncDir, "nwProject.nwx")
testFile = os.path.join(outDir, "coreProject_NewRoot_nwProject.nwx") testFile = os.path.join(outDir, "coreProject_NewRoot_nwProject.nwx")
compFile = os.path.join(refDir, "coreProject_NewRoot_nwProject.nwx") compFile = os.path.join(refDir, "coreProject_NewRoot_nwProject.nwx")
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.newProject({"projPath": fncDir}) is True assert theProject.newProject({"projPath": fncDir}) is True
assert theProject.setProjectPath(fncDir) is True assert theProject.setProjectPath(fncDir) is True
@@ -297,16 +286,14 @@ def testCoreProject_NewRoot(fncDir, outDir, refDir, mockGUI):
@pytest.mark.core @pytest.mark.core
def testCoreProject_NewFile(fncDir, outDir, refDir, mockGUI): def testCoreProject_NewFile(fncDir, outDir, refDir, mockGUI, mockRnd):
"""Check that new files can be added to the project. """Check that new files can be added to the project.
""" """
projFile = os.path.join(fncDir, "nwProject.nwx") projFile = os.path.join(fncDir, "nwProject.nwx")
testFile = os.path.join(outDir, "coreProject_NewFile_nwProject.nwx") testFile = os.path.join(outDir, "coreProject_NewFile_nwProject.nwx")
compFile = os.path.join(refDir, "coreProject_NewFile_nwProject.nwx") compFile = os.path.join(refDir, "coreProject_NewFile_nwProject.nwx")
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.newProject({"projPath": fncDir}) is True assert theProject.newProject({"projPath": fncDir}) is True
assert theProject.setProjectPath(fncDir) is True assert theProject.setProjectPath(fncDir) is True
@@ -686,50 +673,51 @@ def testCoreProject_AccessItems(nwMinimal, mockGUI):
@pytest.mark.core @pytest.mark.core
def testCoreProject_StatusImport(mockGUI, fncDir, constData): def testCoreProject_StatusImport(mockGUI, fncDir, mockRnd):
"""Test the status and importance flag handling. """Test the status and importance flag handling.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
random.seed(42)
theProject.projTree.setSeed(42)
assert theProject.newProject({"projPath": fncDir}) is True assert theProject.newProject({"projPath": fncDir}) is True
statusKeys = ["s000008", "s000009", "s00000a", "s00000b"]
importKeys = ["i00000c", "i00000d", "i00000e", "i00000f"]
# Change Status # Change Status
# ============= # =============
theProject.projTree["44cb730c42048"].setStatus("Finished") theProject.projTree["0000000000014"].setStatus("Finished")
theProject.projTree["71ee45a3c0db9"].setStatus("Draft") theProject.projTree["0000000000015"].setStatus("Draft")
theProject.projTree["811786ad1ae74"].setStatus("Note") theProject.projTree["0000000000016"].setStatus("Note")
theProject.projTree["25fc0e7096fc6"].setStatus("Finished") theProject.projTree["0000000000017"].setStatus("Finished")
assert theProject.projTree["44cb730c42048"].itemStatus == constData.statusKeys[3] assert theProject.projTree["0000000000014"].itemStatus == statusKeys[3]
assert theProject.projTree["71ee45a3c0db9"].itemStatus == constData.statusKeys[2] assert theProject.projTree["0000000000015"].itemStatus == statusKeys[2]
assert theProject.projTree["811786ad1ae74"].itemStatus == constData.statusKeys[1] assert theProject.projTree["0000000000016"].itemStatus == statusKeys[1]
assert theProject.projTree["25fc0e7096fc6"].itemStatus == constData.statusKeys[3] assert theProject.projTree["0000000000017"].itemStatus == statusKeys[3]
newList = [ newList = [
{"key": constData.statusKeys[0], "name": "New", "cols": (1, 1, 1)}, {"key": statusKeys[0], "name": "New", "cols": (1, 1, 1)},
{"key": constData.statusKeys[1], "name": "Draft", "cols": (2, 2, 2)}, # These are swapped {"key": statusKeys[1], "name": "Draft", "cols": (2, 2, 2)}, # These are swapped
{"key": constData.statusKeys[2], "name": "Note", "cols": (3, 3, 3)}, # These are swapped {"key": statusKeys[2], "name": "Note", "cols": (3, 3, 3)}, # These are swapped
{"key": constData.statusKeys[3], "name": "Edited", "cols": (4, 4, 4)}, # Renamed {"key": statusKeys[3], "name": "Edited", "cols": (4, 4, 4)}, # Renamed
{"key": None, "name": "Finished", "cols": (5, 5, 5)}, # New, reused name {"key": None, "name": "Finished", "cols": (5, 5, 5)}, # New, reused name
] ]
assert theProject.setStatusColours(None, None) is False assert theProject.setStatusColours(None, None) is False
assert theProject.setStatusColours([], []) is False assert theProject.setStatusColours([], []) is False
assert theProject.setStatusColours(newList, []) is True assert theProject.setStatusColours(newList, []) is True
assert theProject.statusItems.name(constData.statusKeys[0]) == "New" assert theProject.statusItems.name(statusKeys[0]) == "New"
assert theProject.statusItems.name(constData.statusKeys[1]) == "Draft" assert theProject.statusItems.name(statusKeys[1]) == "Draft"
assert theProject.statusItems.name(constData.statusKeys[2]) == "Note" assert theProject.statusItems.name(statusKeys[2]) == "Note"
assert theProject.statusItems.name(constData.statusKeys[3]) == "Edited" assert theProject.statusItems.name(statusKeys[3]) == "Edited"
assert theProject.statusItems.cols(constData.statusKeys[0]) == (1, 1, 1) assert theProject.statusItems.cols(statusKeys[0]) == (1, 1, 1)
assert theProject.statusItems.cols(constData.statusKeys[1]) == (2, 2, 2) assert theProject.statusItems.cols(statusKeys[1]) == (2, 2, 2)
assert theProject.statusItems.cols(constData.statusKeys[2]) == (3, 3, 3) assert theProject.statusItems.cols(statusKeys[2]) == (3, 3, 3)
assert theProject.statusItems.cols(constData.statusKeys[3]) == (4, 4, 4) assert theProject.statusItems.cols(statusKeys[3]) == (4, 4, 4)
# Check the new entry # Check the new entry
lastKey = theProject.statusItems.check("Finished") lastKey = theProject.statusItems.check("Finished")
assert lastKey == "sbc8960" assert lastKey == "s000018"
assert theProject.statusItems.name(lastKey) == "Finished" assert theProject.statusItems.name(lastKey) == "Finished"
assert theProject.statusItems.cols(lastKey) == (5, 5, 5) assert theProject.statusItems.cols(lastKey) == (5, 5, 5)
@@ -740,33 +728,33 @@ def testCoreProject_StatusImport(mockGUI, fncDir, constData):
# Change Importance # Change Importance
# ================= # =================
fHandle = theProject.newFile("Jane Doe", "73475cb40a568") fHandle = theProject.newFile("Jane Doe", "8b9d2e465e150")
theProject.projTree[fHandle].setImport("Main") theProject.projTree[fHandle].setImport("Main")
assert theProject.projTree[fHandle].itemImport == constData.importKeys[3] assert theProject.projTree[fHandle].itemImport == importKeys[3]
newList = [ newList = [
{"key": constData.importKeys[0], "name": "New", "cols": (1, 1, 1)}, {"key": importKeys[0], "name": "New", "cols": (1, 1, 1)},
{"key": constData.importKeys[1], "name": "Minor", "cols": (2, 2, 2)}, {"key": importKeys[1], "name": "Minor", "cols": (2, 2, 2)},
{"key": constData.importKeys[2], "name": "Major", "cols": (3, 3, 3)}, {"key": importKeys[2], "name": "Major", "cols": (3, 3, 3)},
{"key": constData.importKeys[3], "name": "Min", "cols": (4, 4, 4)}, {"key": importKeys[3], "name": "Min", "cols": (4, 4, 4)},
{"key": None, "name": "Max", "cols": (5, 5, 5)}, {"key": None, "name": "Max", "cols": (5, 5, 5)},
] ]
assert theProject.setImportColours(None, None) is False assert theProject.setImportColours(None, None) is False
assert theProject.setImportColours([], []) is False assert theProject.setImportColours([], []) is False
assert theProject.setImportColours(newList, []) is True assert theProject.setImportColours(newList, []) is True
assert theProject.importItems.name(constData.importKeys[0]) == "New" assert theProject.importItems.name(importKeys[0]) == "New"
assert theProject.importItems.name(constData.importKeys[1]) == "Minor" assert theProject.importItems.name(importKeys[1]) == "Minor"
assert theProject.importItems.name(constData.importKeys[2]) == "Major" assert theProject.importItems.name(importKeys[2]) == "Major"
assert theProject.importItems.name(constData.importKeys[3]) == "Min" assert theProject.importItems.name(importKeys[3]) == "Min"
assert theProject.importItems.cols(constData.importKeys[0]) == (1, 1, 1) assert theProject.importItems.cols(importKeys[0]) == (1, 1, 1)
assert theProject.importItems.cols(constData.importKeys[1]) == (2, 2, 2) assert theProject.importItems.cols(importKeys[1]) == (2, 2, 2)
assert theProject.importItems.cols(constData.importKeys[2]) == (3, 3, 3) assert theProject.importItems.cols(importKeys[2]) == (3, 3, 3)
assert theProject.importItems.cols(constData.importKeys[3]) == (4, 4, 4) assert theProject.importItems.cols(importKeys[3]) == (4, 4, 4)
# Check the new entry # Check the new entry
lastKey = theProject.importItems.check("Max") lastKey = theProject.importItems.check("Max")
assert lastKey == "i1a3d1f" assert lastKey == "i00001a"
assert theProject.importItems.name(lastKey) == "Max" assert theProject.importItems.name(lastKey) == "Max"
assert theProject.importItems.cols(lastKey) == (5, 5, 5) assert theProject.importItems.cols(lastKey) == (5, 5, 5)
@@ -791,21 +779,25 @@ def testCoreProject_StatusImport(mockGUI, fncDir, constData):
assert theProject.closeProject() is True assert theProject.closeProject() is True
# This should restore the default status/import labels # This should restore the default status/import labels
random.seed(42)
assert theProject.openProject(fncDir) is True assert theProject.openProject(fncDir) is True
assert theProject.saveProject() is True assert theProject.saveProject() is True
assert list(theProject.statusItems.keys()) == constData.statusKeys assert theProject.statusItems.name("s000023") == "New"
assert list(theProject.importItems.keys()) == constData.importKeys assert theProject.statusItems.name("s000024") == "Note"
assert theProject.statusItems.name("s000025") == "Draft"
assert theProject.statusItems.name("s000026") == "Finished"
assert theProject.importItems.name("i000027") == "New"
assert theProject.importItems.name("i000028") == "Minor"
assert theProject.importItems.name("i000029") == "Major"
assert theProject.importItems.name("i00002a") == "Main"
# END Test testCoreProject_StatusImport # END Test testCoreProject_StatusImport
@pytest.mark.core @pytest.mark.core
def testCoreProject_Methods(monkeypatch, mockGUI, tmpDir, fncDir): def testCoreProject_Methods(monkeypatch, mockGUI, tmpDir, fncDir, mockRnd):
"""Test other project class methods and functions. """Test other project class methods and functions.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
assert theProject.newProject({"projPath": fncDir}) is True assert theProject.newProject({"projPath": fncDir}) is True
# Setting project path # Setting project path
@@ -864,7 +856,7 @@ def testCoreProject_Methods(monkeypatch, mockGUI, tmpDir, fncDir):
# Trash folder # Trash folder
# Should create on first call, and just returned on later calls # Should create on first call, and just returned on later calls
hTrash = "1a6562590ef19" hTrash = "0000000000018"
assert theProject.projTree[hTrash] is None assert theProject.projTree[hTrash] is None
assert theProject.trashFolder() == hTrash assert theProject.trashFolder() == hTrash
assert theProject.trashFolder() == hTrash assert theProject.trashFolder() == hTrash
@@ -934,14 +926,14 @@ def testCoreProject_Methods(monkeypatch, mockGUI, tmpDir, fncDir):
# Change project tree order # Change project tree order
oldOrder = [ oldOrder = [
"73475cb40a568", "44cb730c42048", "71ee45a3c0db9", "0000000000010", "0000000000011", "0000000000012",
"811786ad1ae74", "25fc0e7096fc6", "31489056e0916", "0000000000013", "0000000000014", "0000000000015",
"98010bd9270f9", "0e17daca5f3e1", "1a6562590ef19", "0000000000016", "0000000000017", "0000000000018",
] ]
newOrder = [ newOrder = [
"811786ad1ae74", "25fc0e7096fc6", "31489056e0916", "0000000000013", "0000000000014", "0000000000015",
"73475cb40a568", "44cb730c42048", "71ee45a3c0db9", "0000000000010", "0000000000011", "0000000000012",
"98010bd9270f9", "0e17daca5f3e1", "0000000000016", "0000000000017",
] ]
assert theProject.projTree.handles() == oldOrder assert theProject.projTree.handles() == oldOrder
assert theProject.setTreeOrder(newOrder) assert theProject.setTreeOrder(newOrder)
+85 -81
View File
@@ -28,9 +28,12 @@ from PyQt5.QtGui import QIcon
from novelwriter.core.status import NWStatus from novelwriter.core.status import NWStatus
statusKeys = ["sa3b179", "s1c8031", "s06671a", "sbdd640"]
importKeys = ["i466852", "i3eb13b", "i392456", "i23b8c1"]
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Internal(constData): def testCoreStatus_Internal():
"""Test all the internal functions of the NWStatus class. """Test all the internal functions of the NWStatus class.
""" """
random.seed(42) random.seed(42)
@@ -43,19 +46,19 @@ def testCoreStatus_Internal(constData):
# Generate Key # Generate Key
# ============ # ============
assert theStatus._newKey() == constData.statusKeys[0] assert theStatus._newKey() == statusKeys[0]
assert theStatus._newKey() == constData.statusKeys[1] assert theStatus._newKey() == statusKeys[1]
# Key collision, should move to key 3 # Key collision, should move to key 3
theStatus.write(constData.statusKeys[2], "Crash", (0, 0, 0)) theStatus.write(statusKeys[2], "Crash", (0, 0, 0))
assert theStatus._newKey() == constData.statusKeys[3] assert theStatus._newKey() == statusKeys[3]
assert theImport._newKey() == constData.importKeys[0] assert theImport._newKey() == importKeys[0]
assert theImport._newKey() == constData.importKeys[1] assert theImport._newKey() == importKeys[1]
# Key collision, should move to key 3 # Key collision, should move to key 3
theImport.write(constData.importKeys[2], "Crash", (0, 0, 0)) theImport.write(importKeys[2], "Crash", (0, 0, 0))
assert theImport._newKey() == constData.importKeys[3] assert theImport._newKey() == importKeys[3]
# Check Key # Check Key
# ========= # =========
@@ -84,18 +87,19 @@ def testCoreStatus_Internal(constData):
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Iterator(constData): def testCoreStatus_Iterator():
"""Test the iterator functions of the NWStatus class. """Test the iterator functions of the NWStatus class.
""" """
random.seed(42) random.seed(42)
theStatus = NWStatus(NWStatus.STATUS) theStatus = NWStatus(NWStatus.STATUS)
theStatus.write(None, "New", (100, 100, 100)) theStatus.write(None, "New", (100, 100, 100))
theStatus.write(None, "Note", (200, 50, 0)) theStatus.write(None, "Note", (200, 50, 0))
theStatus.write(None, "Draft", (200, 150, 0)) theStatus.write(None, "Draft", (200, 150, 0))
theStatus.write(None, "Finished", (50, 200, 0)) theStatus.write(None, "Finished", (50, 200, 0))
# Direct access # Direct access
entry = theStatus[constData.statusKeys[0]] entry = theStatus[statusKeys[0]]
assert entry["cols"] == (100, 100, 100) assert entry["cols"] == (100, 100, 100)
assert entry["name"] == "New" assert entry["name"] == "New"
assert entry["count"] == 0 assert entry["count"] == 0
@@ -107,11 +111,11 @@ def testCoreStatus_Iterator(constData):
assert len(theStatus) == 4 assert len(theStatus) == 4
# Keys # Keys
assert list(theStatus.keys()) == constData.statusKeys assert list(theStatus.keys()) == statusKeys
# Items # Items
for index, (key, entry) in enumerate(theStatus.items()): for index, (key, entry) in enumerate(theStatus.items()):
assert key == constData.statusKeys[index] assert key == statusKeys[index]
assert "cols" in entry assert "cols" in entry
assert "name" in entry assert "name" in entry
assert "count" in entry assert "count" in entry
@@ -128,7 +132,7 @@ def testCoreStatus_Iterator(constData):
@pytest.mark.core @pytest.mark.core
def testCoreStatus_Entries(constData): def testCoreStatus_Entries():
"""Test all the simple setters for the NWStatus class. """Test all the simple setters for the NWStatus class.
""" """
random.seed(42) random.seed(42)
@@ -138,74 +142,74 @@ def testCoreStatus_Entries(constData):
# ===== # =====
# Have a key # Have a key
theStatus.write(constData.statusKeys[0], "Entry 1", (200, 100, 50)) theStatus.write(statusKeys[0], "Entry 1", (200, 100, 50))
assert theStatus[constData.statusKeys[0]]["name"] == "Entry 1" assert theStatus[statusKeys[0]]["name"] == "Entry 1"
assert theStatus[constData.statusKeys[0]]["cols"] == (200, 100, 50) assert theStatus[statusKeys[0]]["cols"] == (200, 100, 50)
# Don't have a key # Don't have a key
theStatus.write(None, "Entry 2", (210, 110, 60)) theStatus.write(None, "Entry 2", (210, 110, 60))
assert theStatus[constData.statusKeys[1]]["name"] == "Entry 2" assert theStatus[statusKeys[1]]["name"] == "Entry 2"
assert theStatus[constData.statusKeys[1]]["cols"] == (210, 110, 60) assert theStatus[statusKeys[1]]["cols"] == (210, 110, 60)
# Wrong colour spec # Wrong colour spec
theStatus.write(None, "Entry 3", "what?") theStatus.write(None, "Entry 3", "what?")
assert theStatus[constData.statusKeys[2]]["name"] == "Entry 3" assert theStatus[statusKeys[2]]["name"] == "Entry 3"
assert theStatus[constData.statusKeys[2]]["cols"] == (100, 100, 100) assert theStatus[statusKeys[2]]["cols"] == (100, 100, 100)
# Wrong colour count # Wrong colour count
theStatus.write(None, "Entry 4", (10, 20)) theStatus.write(None, "Entry 4", (10, 20))
assert theStatus[constData.statusKeys[3]]["name"] == "Entry 4" assert theStatus[statusKeys[3]]["name"] == "Entry 4"
assert theStatus[constData.statusKeys[3]]["cols"] == (100, 100, 100) assert theStatus[statusKeys[3]]["cols"] == (100, 100, 100)
# Check reverse map # Check reverse map
assert theStatus._reverse == { assert theStatus._reverse == {
"Entry 1": constData.statusKeys[0], "Entry 1": statusKeys[0],
"Entry 2": constData.statusKeys[1], "Entry 2": statusKeys[1],
"Entry 3": constData.statusKeys[2], "Entry 3": statusKeys[2],
"Entry 4": constData.statusKeys[3], "Entry 4": statusKeys[3],
} }
# Check # Check
# ===== # =====
# Normal lookup # Normal lookup
for key in constData.statusKeys: for key in statusKeys:
assert theStatus.check(key) == key assert theStatus.check(key) == key
# Reverse map lookup # Reverse map lookup
assert theStatus.check("Entry 1") == constData.statusKeys[0] assert theStatus.check("Entry 1") == statusKeys[0]
assert theStatus.check("Entry 2") == constData.statusKeys[1] assert theStatus.check("Entry 2") == statusKeys[1]
assert theStatus.check("Entry 3") == constData.statusKeys[2] assert theStatus.check("Entry 3") == statusKeys[2]
assert theStatus.check("Entry 4") == constData.statusKeys[3] assert theStatus.check("Entry 4") == statusKeys[3]
# Non-existing name # Non-existing name
assert theStatus.check("Entry 5") == constData.statusKeys[0] assert theStatus.check("Entry 5") == statusKeys[0]
# Name Access # Name Access
# =========== # ===========
assert theStatus.name(constData.statusKeys[0]) == "Entry 1" assert theStatus.name(statusKeys[0]) == "Entry 1"
assert theStatus.name(constData.statusKeys[1]) == "Entry 2" assert theStatus.name(statusKeys[1]) == "Entry 2"
assert theStatus.name(constData.statusKeys[2]) == "Entry 3" assert theStatus.name(statusKeys[2]) == "Entry 3"
assert theStatus.name(constData.statusKeys[3]) == "Entry 4" assert theStatus.name(statusKeys[3]) == "Entry 4"
assert theStatus.name("blablabla") == "Entry 1" assert theStatus.name("blablabla") == "Entry 1"
# Colour Access # Colour Access
# ============= # =============
assert theStatus.cols(constData.statusKeys[0]) == (200, 100, 50) assert theStatus.cols(statusKeys[0]) == (200, 100, 50)
assert theStatus.cols(constData.statusKeys[1]) == (210, 110, 60) assert theStatus.cols(statusKeys[1]) == (210, 110, 60)
assert theStatus.cols(constData.statusKeys[2]) == (100, 100, 100) assert theStatus.cols(statusKeys[2]) == (100, 100, 100)
assert theStatus.cols(constData.statusKeys[3]) == (100, 100, 100) assert theStatus.cols(statusKeys[3]) == (100, 100, 100)
assert theStatus.cols("blablabla") == (200, 100, 50) assert theStatus.cols("blablabla") == (200, 100, 50)
# Icon Access # Icon Access
# =========== # ===========
assert isinstance(theStatus.icon(constData.statusKeys[0]), QIcon) assert isinstance(theStatus.icon(statusKeys[0]), QIcon)
assert isinstance(theStatus.icon(constData.statusKeys[1]), QIcon) assert isinstance(theStatus.icon(statusKeys[1]), QIcon)
assert isinstance(theStatus.icon(constData.statusKeys[2]), QIcon) assert isinstance(theStatus.icon(statusKeys[2]), QIcon)
assert isinstance(theStatus.icon(constData.statusKeys[3]), QIcon) assert isinstance(theStatus.icon(statusKeys[3]), QIcon)
assert isinstance(theStatus.icon("blablabla"), QIcon) assert isinstance(theStatus.icon("blablabla"), QIcon)
# Increment and Count Access # Increment and Count Access
@@ -214,26 +218,26 @@ def testCoreStatus_Entries(constData):
countTo = [3, 5, 7, 9] countTo = [3, 5, 7, 9]
for i, n in enumerate(countTo): for i, n in enumerate(countTo):
for _ in range(n): for _ in range(n):
theStatus.increment(constData.statusKeys[i]) theStatus.increment(statusKeys[i])
assert theStatus.count(constData.statusKeys[0]) == countTo[0] assert theStatus.count(statusKeys[0]) == countTo[0]
assert theStatus.count(constData.statusKeys[1]) == countTo[1] assert theStatus.count(statusKeys[1]) == countTo[1]
assert theStatus.count(constData.statusKeys[2]) == countTo[2] assert theStatus.count(statusKeys[2]) == countTo[2]
assert theStatus.count(constData.statusKeys[3]) == countTo[3] assert theStatus.count(statusKeys[3]) == countTo[3]
assert theStatus.count("blablabla") == countTo[0] assert theStatus.count("blablabla") == countTo[0]
theStatus.resetCounts() theStatus.resetCounts()
assert theStatus.count(constData.statusKeys[0]) == 0 assert theStatus.count(statusKeys[0]) == 0
assert theStatus.count(constData.statusKeys[1]) == 0 assert theStatus.count(statusKeys[1]) == 0
assert theStatus.count(constData.statusKeys[2]) == 0 assert theStatus.count(statusKeys[2]) == 0
assert theStatus.count(constData.statusKeys[3]) == 0 assert theStatus.count(statusKeys[3]) == 0
# Reorder # Reorder
# ======= # =======
cOrder = list(theStatus.keys()) cOrder = list(theStatus.keys())
assert cOrder == constData.statusKeys assert cOrder == statusKeys
# Wrong length # Wrong length
assert theStatus.reorder([]) is False assert theStatus.reorder([]) is False
@@ -243,10 +247,10 @@ def testCoreStatus_Entries(constData):
# Actual reaorder # Actual reaorder
nOrder = [ nOrder = [
constData.statusKeys[0], statusKeys[0],
constData.statusKeys[2], statusKeys[2],
constData.statusKeys[1], statusKeys[1],
constData.statusKeys[3], statusKeys[3],
] ]
assert theStatus.reorder(nOrder) is True assert theStatus.reorder(nOrder) is True
assert list(theStatus.keys()) == nOrder assert list(theStatus.keys()) == nOrder
@@ -282,15 +286,15 @@ def testCoreStatus_Entries(constData):
assert theStatus.remove("blablabla") is False assert theStatus.remove("blablabla") is False
# Non-zero entry # Non-zero entry
theStatus.increment(constData.statusKeys[3]) theStatus.increment(statusKeys[3])
assert theStatus.remove(constData.statusKeys[3]) is False assert theStatus.remove(statusKeys[3]) is False
# Delete last entry # Delete last entry
theStatus.resetCounts() theStatus.resetCounts()
lastName = theStatus.name(constData.statusKeys[3]) lastName = theStatus.name(statusKeys[3])
assert lastName == "Entry 4" assert lastName == "Entry 4"
assert theStatus.remove(constData.statusKeys[3]) is True assert theStatus.remove(statusKeys[3]) is True
assert theStatus.check(constData.statusKeys[3]) == theStatus._default assert theStatus.check(statusKeys[3]) == theStatus._default
assert theStatus.check(lastName) == theStatus._default assert theStatus.check(lastName) == theStatus._default
# Delete default entry, Entry 2 is new default # Delete default entry, Entry 2 is new default
@@ -300,8 +304,8 @@ def testCoreStatus_Entries(constData):
assert theStatus.name(firstName) == "Entry 2" assert theStatus.name(firstName) == "Entry 2"
# Remove remaining entries # Remove remaining entries
assert theStatus.remove(constData.statusKeys[1]) is True assert theStatus.remove(statusKeys[1]) is True
assert theStatus.remove(constData.statusKeys[2]) is True assert theStatus.remove(statusKeys[2]) is True
assert len(theStatus) == 0 assert len(theStatus) == 0
assert theStatus._default is None assert theStatus._default is None
@@ -310,7 +314,7 @@ def testCoreStatus_Entries(constData):
@pytest.mark.core @pytest.mark.core
def testCoreStatus_XMLPackUnpack(constData): def testCoreStatus_XMLPackUnpack():
"""Test all the XML pack/unpack of the NWStatus class. """Test all the XML pack/unpack of the NWStatus class.
""" """
random.seed(42) random.seed(42)
@@ -323,7 +327,7 @@ def testCoreStatus_XMLPackUnpack(constData):
countTo = [3, 5, 7, 9] countTo = [3, 5, 7, 9]
for i, n in enumerate(countTo): for i, n in enumerate(countTo):
for _ in range(n): for _ in range(n):
theStatus.increment(constData.statusKeys[i]) theStatus.increment(statusKeys[i])
nwXML = etree.Element("novelWriterXML") nwXML = etree.Element("novelWriterXML")
@@ -343,18 +347,18 @@ def testCoreStatus_XMLPackUnpack(constData):
theStatus = NWStatus(NWStatus.STATUS) theStatus = NWStatus(NWStatus.STATUS)
assert theStatus.unpackXML(xStatus) assert theStatus.unpackXML(xStatus)
assert len(theStatus._store) == 4 assert len(theStatus._store) == 4
assert list(theStatus._store.keys()) == constData.statusKeys assert list(theStatus._store.keys()) == statusKeys
assert theStatus._store[constData.statusKeys[0]]["name"] == "New" assert theStatus._store[statusKeys[0]]["name"] == "New"
assert theStatus._store[constData.statusKeys[1]]["name"] == "Note" assert theStatus._store[statusKeys[1]]["name"] == "Note"
assert theStatus._store[constData.statusKeys[2]]["name"] == "Draft" assert theStatus._store[statusKeys[2]]["name"] == "Draft"
assert theStatus._store[constData.statusKeys[3]]["name"] == "Finished" assert theStatus._store[statusKeys[3]]["name"] == "Finished"
assert theStatus._store[constData.statusKeys[0]]["cols"] == (100, 100, 100) assert theStatus._store[statusKeys[0]]["cols"] == (100, 100, 100)
assert theStatus._store[constData.statusKeys[1]]["cols"] == (200, 50, 0) assert theStatus._store[statusKeys[1]]["cols"] == (200, 50, 0)
assert theStatus._store[constData.statusKeys[2]]["cols"] == (200, 150, 0) assert theStatus._store[statusKeys[2]]["cols"] == (200, 150, 0)
assert theStatus._store[constData.statusKeys[3]]["cols"] == (50, 200, 0) assert theStatus._store[statusKeys[3]]["cols"] == (50, 200, 0)
assert theStatus._store[constData.statusKeys[0]]["count"] == countTo[0] assert theStatus._store[statusKeys[0]]["count"] == countTo[0]
assert theStatus._store[constData.statusKeys[1]]["count"] == countTo[1] assert theStatus._store[statusKeys[1]]["count"] == countTo[1]
assert theStatus._store[constData.statusKeys[2]]["count"] == countTo[2] assert theStatus._store[statusKeys[2]]["count"] == countTo[2]
assert theStatus._store[constData.statusKeys[3]]["count"] == countTo[3] assert theStatus._store[statusKeys[3]]["count"] == countTo[3]
# END Test testCoreStatus_XMLPackUnpack # END Test testCoreStatus_XMLPackUnpack
-1
View File
@@ -136,7 +136,6 @@ def testCoreToken_TextOps(monkeypatch, nwMinimal, mockGUI):
"""Test handling files and text in the Tokenizer class. """Test handling files and text in the Tokenizer class.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theProject.projTree.setSeed(42)
theProject.projLang = "en" theProject.projLang = "en"
theProject._loadProjectLocalisation() theProject._loadProjectLocalisation()
+53 -72
View File
@@ -24,7 +24,6 @@ import pytest
import random import random
from lxml import etree from lxml import etree
from hashlib import sha256
from tools import readFile from tools import readFile
@@ -34,10 +33,9 @@ from novelwriter.constants import nwFiles
@pytest.fixture(scope="function") @pytest.fixture(scope="function")
def mockItems(mockGUI): def mockItems(mockGUI, mockRnd):
"""Create a list of mock items. """Create a list of mock items.
""" """
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
itemA = NWItem(theProject) itemA = NWItem(theProject)
@@ -118,9 +116,6 @@ def testCoreTree_BuildTree(mockGUI, mockItems):
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theTree = NWTree(theProject) theTree = NWTree(theProject)
theTree.setSeed(42)
assert theTree._handleSeed == 42
# Check that tree is empty (calls NWTree.__bool__) # Check that tree is empty (calls NWTree.__bool__)
assert bool(theTree) is False assert bool(theTree) is False
@@ -196,10 +191,11 @@ def testCoreTree_BuildTree(mockGUI, mockItems):
assert len(theTree) == len(mockItems) + 1 assert len(theTree) == len(mockItems) + 1
theList = theTree.handles() theList = theTree.handles()
assert theList[-1] == "73475cb40a568" nHandle = "0000000000010"
assert theList[-1] == nHandle
# Try to add existing handle # Try to add existing handle
assert theTree.append("73475cb40a568", None, itemT) is False assert theTree.append(nHandle, None, itemT) is False
assert len(theTree) == len(mockItems) + 1 assert len(theTree) == len(mockItems) + 1
# Delete a non-existing item # Delete a non-existing item
@@ -207,9 +203,9 @@ def testCoreTree_BuildTree(mockGUI, mockItems):
assert len(theTree) == len(mockItems) + 1 assert len(theTree) == len(mockItems) + 1
# Delete the last item # Delete the last item
del theTree["73475cb40a568"] del theTree[nHandle]
assert len(theTree) == len(mockItems) assert len(theTree) == len(mockItems)
assert "73475cb40a568" not in theTree assert nHandle not in theTree
# Delete the Novel, Archive and Trash folders # Delete the Novel, Archive and Trash folders
del theTree["a000000000001"] del theTree["a000000000001"]
@@ -310,44 +306,31 @@ def testCoreTree_Methods(mockGUI, mockItems):
@pytest.mark.core @pytest.mark.core
def testCoreTree_MakeHandles(monkeypatch, mockGUI): def testCoreTree_MakeHandles(mockGUI):
"""Test generating item handles. """Test generating item handles.
""" """
random.seed(42)
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
theTree = NWTree(theProject) theTree = NWTree(theProject)
theTree.setSeed(42) handles = ["1c803a3b1799d", "bdd6406671ad1", "3eb1346685257", "23b8c392456de"]
random.seed(42)
tHandle = theTree._makeHandle() tHandle = theTree._makeHandle()
assert tHandle == "73475cb40a568" assert tHandle == handles[0]
theTree._projTree[handles[0]] = None
# Add the next in line to the project to force duplicate # Add the next in line to the project to force duplicate
theTree._projTree["44cb730c42048"] = None theTree._projTree[handles[1]] = None
tHandle = theTree._makeHandle() tHandle = theTree._makeHandle()
assert tHandle == "71ee45a3c0db9" assert tHandle == handles[2]
theTree._projTree[handles[2]] = None
# Fix the time() function and force a handle collission
theTree.setSeed(None)
theTree._handleCount = 0
monkeypatch.setattr("novelwriter.core.tree.time", lambda: 123.4)
# Reset the seed to force collissions, which should still end up
# returning the next handle in the sequence
random.seed(42)
tHandle = theTree._makeHandle() tHandle = theTree._makeHandle()
theTree._projTree[tHandle] = None assert tHandle == handles[3]
newSeed = "123.4_0_"
assert tHandle == sha256(newSeed.encode()).hexdigest()[0:13]
tHandle = theTree._makeHandle()
theTree._projTree[tHandle] = None
newSeed = "123.4_1_"
assert tHandle == sha256(newSeed.encode()).hexdigest()[0:13]
# Reset the count and the handle for 0 and 1 should be duplicates
# which forces the function to add the '!'
theTree._handleCount = 0
tHandle = theTree._makeHandle()
theTree._projTree[tHandle] = None
newSeed = "123.4_1_!"
assert tHandle == sha256(newSeed.encode()).hexdigest()[0:13]
# END Test testCoreTree_MakeHandles # END Test testCoreTree_MakeHandles
@@ -412,7 +395,7 @@ def testCoreTree_Reorder(mockGUI, mockItems):
@pytest.mark.core @pytest.mark.core
def testCoreTree_XMLPackUnpack(mockGUI, mockItems, constData): def testCoreTree_XMLPackUnpack(mockGUI, mockItems):
"""Test packing and unpacking the tree to and from XML. """Test packing and unpacking the tree to and from XML.
""" """
theProject = NWProject(mockGUI) theProject = NWProject(mockGUI)
@@ -426,41 +409,39 @@ def testCoreTree_XMLPackUnpack(mockGUI, mockItems, constData):
nwXML = etree.Element("novelWriterXML") nwXML = etree.Element("novelWriterXML")
theTree.packXML(nwXML) theTree.packXML(nwXML)
assert etree.tostring(nwXML, pretty_print=False, encoding="utf-8") == bytes(( assert etree.tostring(nwXML, pretty_print=False, encoding="utf-8") == (
'<novelWriterXML>' b'<novelWriterXML>'
'<content count="8">' b'<content count="8">'
'<item handle="a000000000001" parent="None" root="a000000000001" order="0" type="ROOT" ' b'<item handle="a000000000001" parent="None" root="a000000000001" order="0" type="ROOT" '
'class="NOVEL"><meta expanded="True"/><name status="{s0}" ' b'class="NOVEL"><meta expanded="True"/><name status="s000000" '
'import="{i0}">Novel</name></item>' b'import="i000004">Novel</name></item>'
'<item handle="b000000000001" parent="a000000000001" root="a000000000001" order="0" ' b'<item handle="b000000000001" parent="a000000000001" root="a000000000001" order="0" '
'type="FOLDER" class="NOVEL"><meta expanded="True"/><name status="{s0}" ' b'type="FOLDER" class="NOVEL"><meta expanded="True"/><name status="s000000" '
'import="{i0}">Act One</name></item>' b'import="i000004">Act One</name></item>'
'<item handle="c000000000001" parent="b000000000001" root="a000000000001" order="0" ' b'<item handle="c000000000001" parent="b000000000001" root="a000000000001" order="0" '
'type="FILE" class="NOVEL" layout="DOCUMENT"><meta charCount="300" wordCount="50" ' b'type="FILE" class="NOVEL" layout="DOCUMENT"><meta charCount="300" wordCount="50" '
'paraCount="2" cursorPos="0"/><name status="{s0}" import="{i0}" ' b'paraCount="2" cursorPos="0"/><name status="s000000" import="i000004" '
'exported="True">Chapter One</name></item>' b'exported="True">Chapter One</name></item>'
'<item handle="c000000000002" parent="b000000000001" root="a000000000001" order="0" ' b'<item handle="c000000000002" parent="b000000000001" root="a000000000001" order="0" '
'type="FILE" class="NOVEL" layout="DOCUMENT"><meta charCount="3000" wordCount="500" ' b'type="FILE" class="NOVEL" layout="DOCUMENT"><meta charCount="3000" wordCount="500" '
'paraCount="20" cursorPos="0"/><name status="{s0}" import="{i0}" ' b'paraCount="20" cursorPos="0"/><name status="s000000" import="i000004" '
'exported="True">Scene One</name></item>' b'exported="True">Scene One</name></item>'
'<item handle="a000000000002" parent="None" root="a000000000002" order="0" type="ROOT" ' b'<item handle="a000000000002" parent="None" root="a000000000002" order="0" type="ROOT" '
'class="ARCHIVE"><meta expanded="False"/><name status="{s0}" ' b'class="ARCHIVE"><meta expanded="False"/><name status="s000000" '
'import="{i0}">Outtakes</name></item>' b'import="i000004">Outtakes</name></item>'
'<item handle="a000000000003" parent="None" root="a000000000003" order="0" type="TRASH" ' b'<item handle="a000000000003" parent="None" root="a000000000003" order="0" type="TRASH" '
'class="TRASH"><meta expanded="False"/><name status="{s0}" ' b'class="TRASH"><meta expanded="False"/><name status="s000000" '
'import="{i0}">Trash</name></item>' b'import="i000004">Trash</name></item>'
'<item handle="a000000000004" parent="None" root="a000000000004" order="0" type="ROOT" ' b'<item handle="a000000000004" parent="None" root="a000000000004" order="0" type="ROOT" '
'class="CHARACTER"><meta expanded="True"/><name status="{s0}" ' b'class="CHARACTER"><meta expanded="True"/><name status="s000000" '
'import="{i0}">Characters</name></item>' b'import="i000004">Characters</name></item>'
'<item handle="b000000000002" parent="a000000000004" root="a000000000004" order="0" ' b'<item handle="b000000000002" parent="a000000000004" root="a000000000004" order="0" '
'type="FILE" class="CHARACTER" layout="NOTE"><meta charCount="2000" wordCount="400" ' b'type="FILE" class="CHARACTER" layout="NOTE"><meta charCount="2000" wordCount="400" '
'paraCount="16" cursorPos="0"/><name status="{s0}" import="{i0}" ' b'paraCount="16" cursorPos="0"/><name status="s000000" import="i000004" '
'exported="True">Jane Doe</name></item>' b'exported="True">Jane Doe</name></item>'
'</content>' b'</content>'
'</novelWriterXML>' b'</novelWriterXML>'
).format( )
s0=constData.statusKeys[0], i0=constData.importKeys[0]
), encoding="utf8")
theTree.clear() theTree.clear()
assert len(theTree) == 0 assert len(theTree) == 0
+15 -13
View File
@@ -19,21 +19,21 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import pytest
import os import os
import pytest
from tools import getGuiItem, readFile, writeFile
from mock import causeOSError from mock import causeOSError
from tools import getGuiItem, readFile, writeFile
from PyQt5.QtWidgets import QAction, QMessageBox, QDialog from PyQt5.QtWidgets import QAction, QMessageBox, QDialog
from novelwriter.dialogs import GuiDocMerge, GuiItemEditor
from novelwriter.enum import nwItemType, nwWidget from novelwriter.enum import nwItemType, nwWidget
from novelwriter.dialogs import GuiDocMerge, GuiItemEditor
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
@pytest.mark.gui @pytest.mark.gui
def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj): def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the merge documents tool. """Test the merge documents tool.
""" """
# Block message box # Block message box
@@ -41,17 +41,17 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj):
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Ok) monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Ok)
# Create a new project # Create a new project
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
# Handles for new objects # Handles for new objects
hChapterDir = "31489056e0916" hNovelRoot = "0000000000008"
hChapterOne = "98010bd9270f9" hChapterDir = "000000000000d"
hSceneOne = "0e17daca5f3e1" hChapterOne = "000000000000e"
hSceneTwo = "1a6562590ef19" hSceneOne = "000000000000f"
hSceneThree = "031b4af5197ec" hSceneTwo = "0000000000010"
hSceneFour = "41cfc0d1f2d12" hSceneThree = "0000000000011"
hMergedDoc = "2858dcd1057d3" hSceneFour = "0000000000012"
hMergedDoc = "0000000000023"
# Add Project Content # Add Project Content
monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted) monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted)
@@ -137,7 +137,7 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj):
assert os.path.isfile(mergedFile) assert os.path.isfile(mergedFile)
assert readFile(mergedFile) == ( assert readFile(mergedFile) == (
"%%%%~name: New Chapter\n" "%%%%~name: New Chapter\n"
"%%%%~path: 73475cb40a568/2858dcd1057d3\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
"%s\n\n" "%s\n\n"
@@ -145,6 +145,8 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj):
"%s\n\n" "%s\n\n"
"%s\n\n" "%s\n\n"
) % ( ) % (
hNovelRoot,
hMergedDoc,
tChapterOne.strip(), tChapterOne.strip(),
tSceneOne.strip(), tSceneOne.strip(),
tSceneTwo.strip(), tSceneTwo.strip(),
+30 -30
View File
@@ -19,22 +19,22 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import pytest
import os import os
import pytest
from tools import getGuiItem, readFile, writeFile
from mock import causeOSError from mock import causeOSError
from tools import getGuiItem, readFile, writeFile
from PyQt5.QtWidgets import QAction, QMessageBox, QDialog from PyQt5.QtWidgets import QAction, QMessageBox, QDialog
from novelwriter.dialogs import GuiDocSplit, GuiItemEditor
from novelwriter.enum import nwItemType, nwWidget from novelwriter.enum import nwItemType, nwWidget
from novelwriter.core.document import NWDoc from novelwriter.dialogs import GuiDocSplit, GuiItemEditor
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
from novelwriter.core.document import NWDoc
@pytest.mark.gui @pytest.mark.gui
def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj): def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the split document tool. """Test the split document tool.
""" """
# Block message box # Block message box
@@ -42,20 +42,20 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj):
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Ok) monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Ok)
# Create a new project # Create a new project
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) is True assert nwGUI.newProject({"projPath": fncProj}) is True
# Handles for new objects # Handles for new objects
hNovelRoot = "73475cb40a568" hNovelRoot = "0000000000008"
hChapterDir = "31489056e0916" hChapterDir = "000000000000d"
hToSplit = "1a6562590ef19" hToSplit = "0000000000010"
hPartition = "41cfc0d1f2d12" hNewFolder = "0000000000021"
hChapterOne = "2858dcd1057d3" hPartition = "0000000000022"
hSceneOne = "2fca346db6561" hChapterOne = "0000000000023"
hSceneTwo = "02d20bbd7e394" hSceneOne = "0000000000024"
hSceneThree = "7688b6ef52555" hSceneTwo = "0000000000025"
hSceneFour = "c837649cce43f" hSceneThree = "0000000000026"
hSceneFive = "6208ef0f7750c" hSceneFour = "0000000000027"
hSceneFive = "0000000000028"
# Add Project Content # Add Project Content
monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted) monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted)
@@ -173,52 +173,52 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj):
assert readFile(os.path.join(contentDir, hPartition+".nwd")) == ( assert readFile(os.path.join(contentDir, hPartition+".nwd")) == (
"%%%%~name: Nantucket\n" "%%%%~name: Nantucket\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hPartition, tPartition) ) % (hNewFolder, hPartition, tPartition)
assert readFile(os.path.join(contentDir, hChapterOne+".nwd")) == ( assert readFile(os.path.join(contentDir, hChapterOne+".nwd")) == (
"%%%%~name: Chapter One\n" "%%%%~name: Chapter One\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hChapterOne, tChapterOne) ) % (hNewFolder, hChapterOne, tChapterOne)
assert readFile(os.path.join(contentDir, hSceneOne+".nwd")) == ( assert readFile(os.path.join(contentDir, hSceneOne+".nwd")) == (
"%%%%~name: Scene One\n" "%%%%~name: Scene One\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hSceneOne, tSceneOne) ) % (hNewFolder, hSceneOne, tSceneOne)
assert readFile(os.path.join(contentDir, hSceneTwo+".nwd")) == ( assert readFile(os.path.join(contentDir, hSceneTwo+".nwd")) == (
"%%%%~name: Scene Two\n" "%%%%~name: Scene Two\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hSceneTwo, tSceneTwo) ) % (hNewFolder, hSceneTwo, tSceneTwo)
assert readFile(os.path.join(contentDir, hSceneThree+".nwd")) == ( assert readFile(os.path.join(contentDir, hSceneThree+".nwd")) == (
"%%%%~name: Scene Three\n" "%%%%~name: Scene Three\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hSceneThree, tSceneThree) ) % (hNewFolder, hSceneThree, tSceneThree)
assert readFile(os.path.join(contentDir, hSceneFour+".nwd")) == ( assert readFile(os.path.join(contentDir, hSceneFour+".nwd")) == (
"%%%%~name: Scene Four\n" "%%%%~name: Scene Four\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hSceneFour, tSceneFour) ) % (hNewFolder, hSceneFour, tSceneFour)
assert readFile(os.path.join(contentDir, hSceneFive+".nwd")) == ( assert readFile(os.path.join(contentDir, hSceneFive+".nwd")) == (
"%%%%~name: The End\n" "%%%%~name: The End\n"
"%%%%~path: 031b4af5197ec/%s\n" "%%%%~path: %s/%s\n"
"%%%%~kind: NOVEL/DOCUMENT\n" "%%%%~kind: NOVEL/DOCUMENT\n"
"%s\n\n" "%s\n\n"
) % (hSceneFive, tSceneFive) ) % (hNewFolder, hSceneFive, tSceneFive)
# OS error # OS error
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
+35 -37
View File
@@ -20,7 +20,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import pytest import pytest
import random
from tools import getGuiItem from tools import getGuiItem
@@ -31,9 +30,12 @@ from novelwriter.enum import nwItemLayout, nwItemType
from novelwriter.dialogs import GuiItemEditor from novelwriter.dialogs import GuiItemEditor
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
statusKeys = ["s000000", "s000001", "s000002", "s000003"]
importKeys = ["i000004", "i000005", "i000006", "i000007"]
@pytest.mark.gui @pytest.mark.gui
def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj): def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test launching the item editor dialog from GuiMain. """Test launching the item editor dialog from GuiMain.
""" """
# Block message box # Block message box
@@ -46,15 +48,15 @@ def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj):
assert nwGUI.editItem() is False assert nwGUI.editItem() is False
# Create and Open Project # Create and Open Project
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
tHandle = "000000000000f"
# No Selection # No Selection
nwGUI.treeView.clearSelection() nwGUI.treeView.clearSelection()
assert nwGUI.editItem() is False assert nwGUI.editItem() is False
# Force opening from editor # Force opening from editor
assert nwGUI.openDocument("0e17daca5f3e1") assert nwGUI.openDocument(tHandle)
nwGUI.isFocusMode = True nwGUI.isFocusMode = True
# Block Tree Lookup # Block Tree Lookup
@@ -63,9 +65,9 @@ def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj):
assert nwGUI.editItem() is False assert nwGUI.editItem() is False
# Invalid Type # Invalid Type
nwGUI.theProject.projTree["0e17daca5f3e1"]._type = nwItemType.NO_TYPE nwGUI.theProject.projTree[tHandle]._type = nwItemType.NO_TYPE
assert nwGUI.editItem() is False assert nwGUI.editItem() is False
nwGUI.theProject.projTree["0e17daca5f3e1"]._type = nwItemType.FILE nwGUI.theProject.projTree[tHandle]._type = nwItemType.FILE
# Open Properly # Open Properly
assert nwGUI.editItem() is True assert nwGUI.editItem() is True
@@ -89,7 +91,7 @@ def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj):
@pytest.mark.gui @pytest.mark.gui
def testDlgItemEditor_Novel(qtbot, monkeypatch, nwGUI, fncProj, constData): def testDlgItemEditor_Novel(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the item editor dialog for a novel document. """Test the item editor dialog for a novel document.
""" """
# Block message box # Block message box
@@ -97,13 +99,13 @@ def testDlgItemEditor_Novel(qtbot, monkeypatch, nwGUI, fncProj, constData):
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
# Create Project and Open Document # Create Project and Open Document
random.seed(42)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
assert nwGUI.theProject.statusItems.name(constData.statusKeys[0]) == "New" tHandle = "000000000000f"
assert nwGUI.theProject.statusItems.name(constData.statusKeys[1]) == "Note"
assert nwGUI.openDocument("0e17daca5f3e1") is True assert nwGUI.theProject.statusItems.name(statusKeys[0]) == "New"
assert nwGUI.theProject.statusItems.name(statusKeys[1]) == "Note"
assert nwGUI.openDocument(tHandle) is True
# Check that an invalid handle is managed # Check that an invalid handle is managed
itemEdit = GuiItemEditor(nwGUI, "whatever") itemEdit = GuiItemEditor(nwGUI, "whatever")
@@ -111,12 +113,12 @@ def testDlgItemEditor_Novel(qtbot, monkeypatch, nwGUI, fncProj, constData):
itemEdit._doClose() itemEdit._doClose()
# Edit a Document # Edit a Document
itemEdit = GuiItemEditor(nwGUI, "0e17daca5f3e1") itemEdit = GuiItemEditor(nwGUI, tHandle)
itemEdit.show() itemEdit.show()
# Check Existing Settings # Check Existing Settings
assert itemEdit.editName.text() == "New Scene" assert itemEdit.editName.text() == "New Scene"
assert itemEdit.editStatus.currentData() == constData.statusKeys[0] assert itemEdit.editStatus.currentData() == statusKeys[0]
assert itemEdit.editLayout.currentData() == nwItemLayout.DOCUMENT assert itemEdit.editLayout.currentData() == nwItemLayout.DOCUMENT
assert itemEdit.editExport.isChecked() is True assert itemEdit.editExport.isChecked() is True
@@ -130,12 +132,12 @@ def testDlgItemEditor_Novel(qtbot, monkeypatch, nwGUI, fncProj, constData):
# Check New Settings # Check New Settings
itemEdit._doSave() itemEdit._doSave()
assert itemEdit.theItem.itemName == "Great Scene" assert itemEdit.theItem.itemName == "Great Scene"
assert itemEdit.theItem.itemStatus == constData.statusKeys[1] assert itemEdit.theItem.itemStatus == statusKeys[1]
assert itemEdit.theItem.itemLayout == nwItemLayout.NOTE assert itemEdit.theItem.itemLayout == nwItemLayout.NOTE
assert itemEdit.theItem.isExported is False assert itemEdit.theItem.isExported is False
# Check that the editor header is updated # Check that the editor header is updated
nwGUI.docEditor.updateDocInfo("0e17daca5f3e1") nwGUI.docEditor.updateDocInfo(tHandle)
assert nwGUI.docEditor.docHeader.theTitle.text() == "Novel New Chapter Great Scene" assert nwGUI.docEditor.docHeader.theTitle.text() == "Novel New Chapter Great Scene"
itemEdit.close() itemEdit.close()
@@ -146,7 +148,7 @@ def testDlgItemEditor_Novel(qtbot, monkeypatch, nwGUI, fncProj, constData):
@pytest.mark.gui @pytest.mark.gui
def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, constData): def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the item editor dialog for a project note. """Test the item editor dialog for a project note.
""" """
# Block message box # Block message box
@@ -154,29 +156,27 @@ def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, constData):
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
# Create Project and Open Document # Create Project and Open Document
random.seed(42)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
assert nwGUI.theProject.statusItems.name(constData.statusKeys[0]) == "New" assert nwGUI.theProject.statusItems.name(statusKeys[0]) == "New"
assert nwGUI.theProject.statusItems.name(constData.statusKeys[1]) == "Note" assert nwGUI.theProject.statusItems.name(statusKeys[1]) == "Note"
assert nwGUI.theProject.importItems.name(constData.importKeys[0]) == "New" assert nwGUI.theProject.importItems.name(importKeys[0]) == "New"
assert nwGUI.theProject.importItems.name(constData.importKeys[1]) == "Minor" assert nwGUI.theProject.importItems.name(importKeys[1]) == "Minor"
# Create Note # Create Note
nwGUI.treeView.clearSelection() nwGUI.treeView.clearSelection()
nwGUI.treeView._getTreeItem("71ee45a3c0db9").setSelected(True) nwGUI.treeView._getTreeItem("000000000000a").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.newTreeItem(nwItemType.FILE, None)
# Open Note # Open Note
assert nwGUI.openDocument("1a6562590ef19") assert nwGUI.openDocument("0000000000010")
# Edit a Document # Edit a Document
itemEdit = GuiItemEditor(nwGUI, "1a6562590ef19") itemEdit = GuiItemEditor(nwGUI, "0000000000010")
itemEdit.show() itemEdit.show()
# Check Existing Settings # Check Existing Settings
assert itemEdit.editName.text() == "New Note" assert itemEdit.editName.text() == "New Note"
assert itemEdit.editStatus.currentData() == constData.importKeys[0] assert itemEdit.editStatus.currentData() == importKeys[0]
assert itemEdit.editLayout.currentData() == nwItemLayout.NOTE assert itemEdit.editLayout.currentData() == nwItemLayout.NOTE
assert itemEdit.editExport.isChecked() is True assert itemEdit.editExport.isChecked() is True
@@ -188,8 +188,8 @@ def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, constData):
# Check New Settings # Check New Settings
assert itemEdit.theItem.itemName == "New Character" assert itemEdit.theItem.itemName == "New Character"
assert itemEdit.theItem.itemStatus == constData.statusKeys[0] assert itemEdit.theItem.itemStatus == statusKeys[0]
assert itemEdit.theItem.itemImport == constData.importKeys[1] assert itemEdit.theItem.itemImport == importKeys[1]
assert itemEdit.theItem.itemLayout == nwItemLayout.NOTE assert itemEdit.theItem.itemLayout == nwItemLayout.NOTE
assert itemEdit.theItem.isExported is False assert itemEdit.theItem.isExported is False
@@ -201,7 +201,7 @@ def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, constData):
@pytest.mark.gui @pytest.mark.gui
def testDlgItemEditor_Folder(qtbot, monkeypatch, nwGUI, fncProj, constData): def testDlgItemEditor_Folder(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the item editor dialog for a folder. """Test the item editor dialog for a folder.
""" """
# Block message box # Block message box
@@ -209,20 +209,18 @@ def testDlgItemEditor_Folder(qtbot, monkeypatch, nwGUI, fncProj, constData):
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
# Create Project and Open Document # Create Project and Open Document
random.seed(42)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
# Edit a Folder # Edit a Folder
itemEdit = GuiItemEditor(nwGUI, "31489056e0916") itemEdit = GuiItemEditor(nwGUI, "000000000000d")
itemEdit.show() itemEdit.show()
assert nwGUI.theProject.statusItems.name(constData.statusKeys[0]) == "New" assert nwGUI.theProject.statusItems.name(statusKeys[0]) == "New"
assert nwGUI.theProject.statusItems.name(constData.statusKeys[1]) == "Note" assert nwGUI.theProject.statusItems.name(statusKeys[1]) == "Note"
# Check Existing Settings # Check Existing Settings
assert itemEdit.editName.text() == "New Chapter" assert itemEdit.editName.text() == "New Chapter"
assert itemEdit.editStatus.currentData() == constData.statusKeys[0] assert itemEdit.editStatus.currentData() == statusKeys[0]
assert itemEdit.editLayout.currentData() == nwItemLayout.NO_LAYOUT assert itemEdit.editLayout.currentData() == nwItemLayout.NO_LAYOUT
assert itemEdit.editExport.isChecked() is False assert itemEdit.editExport.isChecked() is False
@@ -236,7 +234,7 @@ def testDlgItemEditor_Folder(qtbot, monkeypatch, nwGUI, fncProj, constData):
# Check New Settings # Check New Settings
itemEdit._doSave() itemEdit._doSave()
assert itemEdit.theItem.itemName == "Chapter One" assert itemEdit.theItem.itemName == "Chapter One"
assert itemEdit.theItem.itemStatus == constData.statusKeys[1] assert itemEdit.theItem.itemStatus == statusKeys[1]
assert itemEdit.theItem.itemLayout == nwItemLayout.NO_LAYOUT assert itemEdit.theItem.itemLayout == nwItemLayout.NO_LAYOUT
assert itemEdit.theItem.isExported is False assert itemEdit.theItem.isExported is False
+11 -12
View File
@@ -21,7 +21,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
import os import os
import pytest import pytest
import random
from shutil import copyfile from shutil import copyfile
from tools import cmpFiles, getGuiItem from tools import cmpFiles, getGuiItem
@@ -35,11 +34,13 @@ from novelwriter.dialogs import GuiProjectSettings
keyDelay = 2 keyDelay = 2
typeDelay = 1 typeDelay = 1
stepDelay = 20 stepDelay = 20
statusKeys = ["s000000", "s000001", "s000002", "s000003"]
importKeys = ["i000004", "i000005", "i000006", "i000007"]
@pytest.mark.gui @pytest.mark.gui
def testDlgProjSettings_Dialog( def testDlgProjSettings_Dialog(
qtbot, monkeypatch, nwGUI, fncDir, fncProj, outDir, refDir, constData qtbot, monkeypatch, nwGUI, fncDir, fncProj, outDir, refDir, mockRnd
): ):
"""Test the full project settings dialog. """Test the full project settings dialog.
""" """
@@ -56,8 +57,6 @@ def testDlgProjSettings_Dialog(
assert getGuiItem("GuiProjectSettings") is None assert getGuiItem("GuiProjectSettings") is None
# Create new project # Create new project
random.seed(42)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
nwGUI.mainConf.backupPath = fncDir nwGUI.mainConf.backupPath = fncDir
@@ -145,15 +144,15 @@ def testDlgProjSettings_Dialog(
assert projEdit.tabStatus.getNewList() == ( assert projEdit.tabStatus.getNewList() == (
[ [
{ {
"key": constData.statusKeys[0], "key": statusKeys[0],
"name": "New", "name": "New",
"cols": (100, 100, 100) "cols": (100, 100, 100)
}, { }, {
"key": constData.statusKeys[1], "key": statusKeys[1],
"name": "Note", "name": "Note",
"cols": (200, 50, 0) "cols": (200, 50, 0)
}, { }, {
"key": constData.statusKeys[3], "key": statusKeys[3],
"name": "Finished", "name": "Finished",
"cols": (50, 200, 0) "cols": (50, 200, 0)
}, { }, {
@@ -162,7 +161,7 @@ def testDlgProjSettings_Dialog(
"cols": (20, 30, 40) "cols": (20, 30, 40)
} }
], [ ], [
constData.statusKeys[2] # Deleted item statusKeys[2] # Deleted item
] ]
) )
@@ -170,25 +169,25 @@ def testDlgProjSettings_Dialog(
projEdit.tabStatus.listBox.clearSelection() projEdit.tabStatus.listBox.clearSelection()
projEdit.tabStatus._moveItem(1) projEdit.tabStatus._moveItem(1)
assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [
constData.statusKeys[0], constData.statusKeys[1], constData.statusKeys[3], None statusKeys[0], statusKeys[1], statusKeys[3], None
] ]
projEdit.tabStatus.listBox.clearSelection() projEdit.tabStatus.listBox.clearSelection()
projEdit.tabStatus.listBox.topLevelItem(0).setSelected(True) projEdit.tabStatus.listBox.topLevelItem(0).setSelected(True)
projEdit.tabStatus._moveItem(-1) projEdit.tabStatus._moveItem(-1)
assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [
constData.statusKeys[0], constData.statusKeys[1], constData.statusKeys[3], None statusKeys[0], statusKeys[1], statusKeys[3], None
] ]
projEdit.tabStatus.listBox.clearSelection() projEdit.tabStatus.listBox.clearSelection()
projEdit.tabStatus.listBox.topLevelItem(3).setSelected(True) projEdit.tabStatus.listBox.topLevelItem(3).setSelected(True)
projEdit.tabStatus._moveItem(-1) projEdit.tabStatus._moveItem(-1)
assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [
constData.statusKeys[0], constData.statusKeys[1], None, constData.statusKeys[3] statusKeys[0], statusKeys[1], None, statusKeys[3]
] ]
projEdit.tabStatus._moveItem(1) projEdit.tabStatus._moveItem(1)
assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [ assert [x["key"] for x in projEdit.tabStatus.getNewList()[0]] == [
constData.statusKeys[0], constData.statusKeys[1], constData.statusKeys[3], None statusKeys[0], statusKeys[1], statusKeys[3], None
] ]
# Importance Tab # Importance Tab
-1
View File
@@ -1286,7 +1286,6 @@ def testGuiEditor_Search(qtbot, monkeypatch, nwGUI, nwLipsum):
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(GuiDocEditor, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiDocEditor, "hasFocus", lambda *a: True)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.openProject(nwLipsum) is True assert nwGUI.openProject(nwLipsum) is True
assert nwGUI.openDocument("4c4f28287af27") is True assert nwGUI.openDocument("4c4f28287af27") is True
origText = nwGUI.docEditor.getText() origText = nwGUI.docEditor.getText()
-1
View File
@@ -43,7 +43,6 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, nwLipsum):
monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes)
# Open project # Open project
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.openProject(nwLipsum) assert nwGUI.openProject(nwLipsum)
# Rebuild the index # Rebuild the index
+34 -37
View File
@@ -20,7 +20,6 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import os import os
import random
import pytest import pytest
from shutil import copyfile from shutil import copyfile
@@ -72,16 +71,16 @@ def testGuiMain_ProjectBlocker(monkeypatch, nwGUI):
@pytest.mark.gui @pytest.mark.gui
def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, fncProj): def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test handling of project tree items based on GUI focus states. """Test handling of project tree items based on GUI focus states.
""" """
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) is True assert nwGUI.newProject({"projPath": fncProj}) is True
assert nwGUI.saveProject() is True assert nwGUI.saveProject() is True
# assert False
sHandle = "0e17daca5f3e1" sHandle = "000000000000f"
assert nwGUI.openSelectedItem() is False assert nwGUI.openSelectedItem() is False
# Project Tree has focus # Project Tree has focus
@@ -128,7 +127,7 @@ def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, fncProj):
@pytest.mark.gui @pytest.mark.gui
def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir): def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mockRnd):
"""Test the document editor. """Test the document editor.
""" """
# Block message box # Block message box
@@ -140,8 +139,6 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
monkeypatch.setattr(GuiDocEditor, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiDocEditor, "hasFocus", lambda *a: True)
# Create new, save, close project # Create new, save, close project
random.seed(42)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
assert nwGUI.saveProject() assert nwGUI.saveProject()
assert nwGUI.closeProject() assert nwGUI.closeProject()
@@ -186,14 +183,14 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
assert not nwGUI.theProject.spellCheck assert not nwGUI.theProject.spellCheck
# Check that tree items have been created # Check that tree items have been created
assert nwGUI.treeView._getTreeItem("73475cb40a568") is not None assert nwGUI.treeView._getTreeItem("0000000000008") is not None
assert nwGUI.treeView._getTreeItem("25fc0e7096fc6") is not None assert nwGUI.treeView._getTreeItem("0000000000009") is not None
assert nwGUI.treeView._getTreeItem("31489056e0916") is not None assert nwGUI.treeView._getTreeItem("000000000000a") is not None
assert nwGUI.treeView._getTreeItem("98010bd9270f9") is not None assert nwGUI.treeView._getTreeItem("000000000000b") is not None
assert nwGUI.treeView._getTreeItem("0e17daca5f3e1") is not None assert nwGUI.treeView._getTreeItem("000000000000c") is not None
assert nwGUI.treeView._getTreeItem("44cb730c42048") is not None assert nwGUI.treeView._getTreeItem("000000000000d") is not None
assert nwGUI.treeView._getTreeItem("71ee45a3c0db9") is not None assert nwGUI.treeView._getTreeItem("000000000000e") is not None
assert nwGUI.treeView._getTreeItem("811786ad1ae74") is not None assert nwGUI.treeView._getTreeItem("000000000000f") is not None
nwGUI.mainMenu.aSpellCheck.setChecked(True) nwGUI.mainMenu.aSpellCheck.setChecked(True)
assert nwGUI.mainMenu._toggleSpellCheck() assert nwGUI.mainMenu._toggleSpellCheck()
@@ -207,7 +204,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
# Add a Character File # Add a Character File
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.clearSelection()
nwGUI.treeView._getTreeItem("71ee45a3c0db9").setSelected(True) nwGUI.treeView._getTreeItem("000000000000a").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.newTreeItem(nwItemType.FILE, None)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
@@ -229,7 +226,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
# Add a Plot File # Add a Plot File
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.clearSelection()
nwGUI.treeView._getTreeItem("44cb730c42048").setSelected(True) nwGUI.treeView._getTreeItem("0000000000009").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.newTreeItem(nwItemType.FILE, None)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
@@ -251,7 +248,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
# Add a World File # Add a World File
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.clearSelection()
nwGUI.treeView._getTreeItem("811786ad1ae74").setSelected(True) nwGUI.treeView._getTreeItem("000000000000b").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.newTreeItem(nwItemType.FILE, None)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
@@ -282,9 +279,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
# Select the 'New Scene' file # Select the 'New Scene' file
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.clearSelection()
nwGUI.treeView._getTreeItem("73475cb40a568").setExpanded(True) nwGUI.treeView._getTreeItem("0000000000008").setExpanded(True)
nwGUI.treeView._getTreeItem("31489056e0916").setExpanded(True) nwGUI.treeView._getTreeItem("000000000000d").setExpanded(True)
nwGUI.treeView._getTreeItem("0e17daca5f3e1").setSelected(True) nwGUI.treeView._getTreeItem("000000000000f").setSelected(True)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
# Type something into the document # Type something into the document
@@ -419,8 +416,8 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
# Open and view the edited document # Open and view the edited document
nwGUI.switchFocus(nwWidget.VIEWER) nwGUI.switchFocus(nwWidget.VIEWER)
assert nwGUI.openDocument("0e17daca5f3e1") assert nwGUI.openDocument("000000000000f")
assert nwGUI.viewDocument("0e17daca5f3e1") assert nwGUI.viewDocument("000000000000f")
qtbot.wait(stepDelay) qtbot.wait(stepDelay)
assert nwGUI.saveProject() assert nwGUI.saveProject()
assert nwGUI.closeDocViewer() assert nwGUI.closeDocViewer()
@@ -429,11 +426,11 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
# Check a Quick Create and Delete # Check a Quick Create and Delete
assert nwGUI.treeView.newTreeItem(nwItemType.FILE, None) assert nwGUI.treeView.newTreeItem(nwItemType.FILE, None)
newHandle = nwGUI.treeView.getSelectedHandle() newHandle = nwGUI.treeView.getSelectedHandle()
assert nwGUI.theProject.projTree["2858dcd1057d3"] is not None assert nwGUI.theProject.projTree["0000000000020"] is not None
assert nwGUI.treeView.deleteItem() assert nwGUI.treeView.deleteItem()
assert nwGUI.treeView.setSelectedHandle(newHandle) assert nwGUI.treeView.setSelectedHandle(newHandle)
assert nwGUI.treeView.deleteItem() assert nwGUI.treeView.deleteItem()
assert nwGUI.theProject.projTree["2fca346db6561"] is not None # Trash assert nwGUI.theProject.projTree["0000000000024"] is not None # Trash
assert nwGUI.saveProject() assert nwGUI.saveProject()
# Check the files # Check the files
@@ -443,27 +440,27 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir):
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile, [2, 6, 7, 8]) assert cmpFiles(testFile, compFile, [2, 6, 7, 8])
projFile = os.path.join(fncProj, "content", "031b4af5197ec.nwd") projFile = os.path.join(fncProj, "content", "000000000000f.nwd")
testFile = os.path.join(outDir, "guiEditor_Main_Final_031b4af5197ec.nwd") testFile = os.path.join(outDir, "guiEditor_Main_Final_000000000000f.nwd")
compFile = os.path.join(refDir, "guiEditor_Main_Final_031b4af5197ec.nwd") compFile = os.path.join(refDir, "guiEditor_Main_Final_000000000000f.nwd")
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
projFile = os.path.join(fncProj, "content", "1a6562590ef19.nwd") projFile = os.path.join(fncProj, "content", "0000000000020.nwd")
testFile = os.path.join(outDir, "guiEditor_Main_Final_1a6562590ef19.nwd") testFile = os.path.join(outDir, "guiEditor_Main_Final_0000000000020.nwd")
compFile = os.path.join(refDir, "guiEditor_Main_Final_1a6562590ef19.nwd") compFile = os.path.join(refDir, "guiEditor_Main_Final_0000000000020.nwd")
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
projFile = os.path.join(fncProj, "content", "0e17daca5f3e1.nwd") projFile = os.path.join(fncProj, "content", "0000000000021.nwd")
testFile = os.path.join(outDir, "guiEditor_Main_Final_0e17daca5f3e1.nwd") testFile = os.path.join(outDir, "guiEditor_Main_Final_0000000000021.nwd")
compFile = os.path.join(refDir, "guiEditor_Main_Final_0e17daca5f3e1.nwd") compFile = os.path.join(refDir, "guiEditor_Main_Final_0000000000021.nwd")
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
projFile = os.path.join(fncProj, "content", "41cfc0d1f2d12.nwd") projFile = os.path.join(fncProj, "content", "0000000000022.nwd")
testFile = os.path.join(outDir, "guiEditor_Main_Final_41cfc0d1f2d12.nwd") testFile = os.path.join(outDir, "guiEditor_Main_Final_0000000000022.nwd")
compFile = os.path.join(refDir, "guiEditor_Main_Final_41cfc0d1f2d12.nwd") compFile = os.path.join(refDir, "guiEditor_Main_Final_0000000000022.nwd")
copyfile(projFile, testFile) copyfile(projFile, testFile)
assert cmpFiles(testFile, compFile) assert cmpFiles(testFile, compFile)
+5 -8
View File
@@ -48,7 +48,6 @@ def testGuiMenu_EditFormat(qtbot, monkeypatch, nwGUI, nwLipsum):
# Test Document Action with No Project # Test Document Action with No Project
assert nwGUI.docEditor.docAction(nwDocAction.COPY) is False assert nwGUI.docEditor.docAction(nwDocAction.COPY) is False
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.openProject(nwLipsum) is True assert nwGUI.openProject(nwLipsum) is True
qtbot.wait(stepDelay) qtbot.wait(stepDelay)
@@ -381,7 +380,6 @@ def testGuiMenu_ContextMenus(qtbot, monkeypatch, nwGUI, nwLipsum):
# Block message box # Block message box
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.openProject(nwLipsum) assert nwGUI.openProject(nwLipsum)
assert nwGUI.openDocument("4c4f28287af27") assert nwGUI.openDocument("4c4f28287af27")
qtbot.wait(stepDelay) qtbot.wait(stepDelay)
@@ -460,18 +458,17 @@ def testGuiMenu_ContextMenus(qtbot, monkeypatch, nwGUI, nwLipsum):
@pytest.mark.gui @pytest.mark.gui
def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj): def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd):
"""Test the Insert menu. """Test the Insert menu.
""" """
# Block message box # Block message box
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "critical", lambda *a: QMessageBox.Yes)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) assert nwGUI.newProject({"projPath": fncProj})
assert nwGUI.treeView._getTreeItem("0e17daca5f3e1") is not None assert nwGUI.treeView._getTreeItem("000000000000f") is not None
assert nwGUI.openDocument("0e17daca5f3e1") is True assert nwGUI.openDocument("000000000000f") is True
nwGUI.docEditor.clear() nwGUI.docEditor.clear()
# Test Faulty Inserts # Test Faulty Inserts
@@ -680,7 +677,7 @@ def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj):
assert not nwGUI.importDocument() assert not nwGUI.importDocument()
# Open the document from before, and add some text to it # Open the document from before, and add some text to it
nwGUI.openDocument("0e17daca5f3e1") nwGUI.openDocument("000000000000f")
nwGUI.docEditor.setText("Bar") nwGUI.docEditor.setText("Bar")
assert nwGUI.docEditor.getText() == "Bar" assert nwGUI.docEditor.getText() == "Bar"
@@ -712,7 +709,7 @@ def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj):
theBits = theMessage.split("<br>") theBits = theMessage.split("<br>")
assert len(theBits) == 2 assert len(theBits) == 2
assert theBits[0] == "The currently open file is saved in:" assert theBits[0] == "The currently open file is saved in:"
assert theBits[1] == os.path.join(fncProj, "content", "0e17daca5f3e1.nwd") assert theBits[1] == os.path.join(fncProj, "content", "000000000000f.nwd")
# qtbot.stopForInteraction() # qtbot.stopForInteraction()
-1
View File
@@ -37,7 +37,6 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, nwMinimal):
monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes)
nwGUI.openProject(nwMinimal) nwGUI.openProject(nwMinimal)
nwGUI.theProject.projTree.setSeed(42)
nwTree = nwGUI.novelView nwTree = nwGUI.novelView
## ##
+105 -108
View File
@@ -30,7 +30,7 @@ from novelwriter.enum import nwItemType, nwItemClass
@pytest.mark.gui @pytest.mark.gui
def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir): def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd):
"""Test adding and removing items from the project tree. """Test adding and removing items from the project tree.
""" """
# Block message box # Block message box
@@ -46,7 +46,6 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
assert nwTree.newTreeItem(nwItemType.FILE) is False assert nwTree.newTreeItem(nwItemType.FILE) is False
# Create a project # Create a project
nwGUI.theProject.projTree.setSeed(42)
prjDir = os.path.join(fncDir, "project") prjDir = os.path.join(fncDir, "project")
assert nwGUI.newProject({"projPath": prjDir}) is True assert nwGUI.newProject({"projPath": prjDir}) is True
@@ -62,7 +61,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
# Create root item # Create root item
assert nwTree.newTreeItem(nwItemType.ROOT, nwItemClass.WORLD) is True assert nwTree.newTreeItem(nwItemType.ROOT, nwItemClass.WORLD) is True
assert "1a6562590ef19" in nwGUI.theProject.projTree assert "0000000000010" in nwGUI.theProject.projTree
# File/Folder Items # File/Folder Items
# ================= # =================
@@ -75,44 +74,44 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
assert "Did not find anywhere" in caplog.text assert "Did not find anywhere" in caplog.text
# Create new folder as child of Novel folder # Create new folder as child of Novel folder
nwTree.setSelectedHandle("73475cb40a568") nwTree.setSelectedHandle("0000000000008")
assert nwTree.newTreeItem(nwItemType.FOLDER) is True assert nwTree.newTreeItem(nwItemType.FOLDER) is True
assert nwGUI.theProject.projTree["031b4af5197ec"].itemParent == "73475cb40a568" assert nwGUI.theProject.projTree["0000000000011"].itemParent == "0000000000008"
assert nwGUI.theProject.projTree["031b4af5197ec"].itemRoot == "73475cb40a568" assert nwGUI.theProject.projTree["0000000000011"].itemRoot == "0000000000008"
assert nwGUI.theProject.projTree["031b4af5197ec"].itemClass == nwItemClass.NOVEL assert nwGUI.theProject.projTree["0000000000011"].itemClass == nwItemClass.NOVEL
# Add a new file in the new folder # Add a new file in the new folder
nwTree.setSelectedHandle("031b4af5197ec") nwTree.setSelectedHandle("0000000000011")
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwGUI.theProject.projTree["41cfc0d1f2d12"].itemParent == "031b4af5197ec" assert nwGUI.theProject.projTree["0000000000012"].itemParent == "0000000000011"
assert nwGUI.theProject.projTree["41cfc0d1f2d12"].itemRoot == "73475cb40a568" assert nwGUI.theProject.projTree["0000000000012"].itemRoot == "0000000000008"
assert nwGUI.theProject.projTree["41cfc0d1f2d12"].itemClass == nwItemClass.NOVEL assert nwGUI.theProject.projTree["0000000000012"].itemClass == nwItemClass.NOVEL
# Add a new file next to the other new file # Add a new file next to the other new file
nwTree.setSelectedHandle("41cfc0d1f2d12") nwTree.setSelectedHandle("0000000000012")
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwGUI.theProject.projTree["2858dcd1057d3"].itemParent == "031b4af5197ec" assert nwGUI.theProject.projTree["0000000000013"].itemParent == "0000000000011"
assert nwGUI.theProject.projTree["2858dcd1057d3"].itemRoot == "73475cb40a568" assert nwGUI.theProject.projTree["0000000000013"].itemRoot == "0000000000008"
assert nwGUI.theProject.projTree["2858dcd1057d3"].itemClass == nwItemClass.NOVEL assert nwGUI.theProject.projTree["0000000000013"].itemClass == nwItemClass.NOVEL
assert nwGUI.openDocument("2858dcd1057d3") assert nwGUI.openDocument("0000000000013")
assert nwGUI.docEditor.getText() == "### New Document\n\n" assert nwGUI.docEditor.getText() == "### New Document\n\n"
# Add a new file to the characters folder # Add a new file to the characters folder
nwTree.setSelectedHandle("71ee45a3c0db9") nwTree.setSelectedHandle("000000000000a")
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwGUI.theProject.projTree["2fca346db6561"].itemParent == "71ee45a3c0db9" assert nwGUI.theProject.projTree["0000000000014"].itemParent == "000000000000a"
assert nwGUI.theProject.projTree["2fca346db6561"].itemRoot == "71ee45a3c0db9" assert nwGUI.theProject.projTree["0000000000014"].itemRoot == "000000000000a"
assert nwGUI.theProject.projTree["2fca346db6561"].itemClass == nwItemClass.CHARACTER assert nwGUI.theProject.projTree["0000000000014"].itemClass == nwItemClass.CHARACTER
assert nwGUI.openDocument("2fca346db6561") assert nwGUI.openDocument("0000000000014")
assert nwGUI.docEditor.getText() == "# New Note\n\n" assert nwGUI.docEditor.getText() == "# New Note\n\n"
# Make sure the sibling folder bug trap works # Make sure the sibling folder bug trap works
nwTree.setSelectedHandle("2858dcd1057d3") nwTree.setSelectedHandle("0000000000013")
nwGUI.theProject.projTree["2858dcd1057d3"].setParent(None) # This should not happen nwGUI.theProject.projTree["0000000000013"].setParent(None) # This should not happen
caplog.clear() caplog.clear()
assert nwTree.newTreeItem(nwItemType.FILE) is False assert nwTree.newTreeItem(nwItemType.FILE) is False
assert "Internal error" in caplog.text assert "Internal error" in caplog.text
nwGUI.theProject.projTree["2858dcd1057d3"].setParent("031b4af5197ec") nwGUI.theProject.projTree["0000000000013"].setParent("0000000000011")
# Get the trash folder # Get the trash folder
nwTree._addTrashRoot() nwTree._addTrashRoot()
@@ -139,7 +138,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
@pytest.mark.gui @pytest.mark.gui
def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir): def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
"""Test adding and removing items from the project tree. """Test adding and removing items from the project tree.
""" """
# Block message box # Block message box
@@ -155,7 +154,6 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir):
assert nwTree.moveTreeItem(1) is False assert nwTree.moveTreeItem(1) is False
# Create a project # Create a project
nwGUI.theProject.projTree.setSeed(42)
prjDir = os.path.join(fncDir, "project") prjDir = os.path.join(fncDir, "project")
assert nwGUI.newProject({"projPath": prjDir}) is True assert nwGUI.newProject({"projPath": prjDir}) is True
@@ -163,21 +161,21 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir):
# ============== # ==============
# Add some files # Add some files
nwTree.setSelectedHandle("31489056e0916") nwTree.setSelectedHandle("000000000000d")
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
# Move item without focus # Move item without focus
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False)
assert nwTree.moveTreeItem(1) is False assert nwTree.moveTreeItem(1) is False
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
@@ -186,78 +184,78 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir):
assert nwTree.moveTreeItem(1) is False assert nwTree.moveTreeItem(1) is False
# Move second item up twice (should give same result) # Move second item up twice (should give same result)
nwTree.setSelectedHandle("0e17daca5f3e1") nwTree.setSelectedHandle("000000000000f")
assert nwTree.moveTreeItem(-1) is True assert nwTree.moveTreeItem(-1) is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "0e17daca5f3e1", "98010bd9270f9", "000000000000d", "000000000000f", "000000000000e",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
assert nwTree.moveTreeItem(-1) is False assert nwTree.moveTreeItem(-1) is False
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "0e17daca5f3e1", "98010bd9270f9", "000000000000d", "000000000000f", "000000000000e",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
# Restore via menu entry # Restore via menu entry
nwGUI.mainMenu.aMoveDown.activate(QAction.Trigger) nwGUI.mainMenu.aMoveDown.activate(QAction.Trigger)
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
# Move fifth item down twice (should give same result) # Move fifth item down twice (should give same result)
nwTree.setSelectedHandle("031b4af5197ec") nwTree.setSelectedHandle("0000000000011")
assert nwTree.moveTreeItem(1) is True assert nwTree.moveTreeItem(1) is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "41cfc0d1f2d12", "031b4af5197ec", "0000000000010", "0000000000012", "0000000000011",
] ]
assert nwTree.moveTreeItem(1) is False assert nwTree.moveTreeItem(1) is False
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "41cfc0d1f2d12", "031b4af5197ec", "0000000000010", "0000000000012", "0000000000011",
] ]
# Restore via menu entry # Restore via menu entry
nwGUI.mainMenu.aMoveUp.activate(QAction.Trigger) nwGUI.mainMenu.aMoveUp.activate(QAction.Trigger)
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
# Move down again, and restore via undo # Move down again, and restore via undo
nwTree.setSelectedHandle("031b4af5197ec") nwTree.setSelectedHandle("0000000000011")
assert nwTree.moveTreeItem(1) is True assert nwTree.moveTreeItem(1) is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "41cfc0d1f2d12", "031b4af5197ec", "0000000000010", "0000000000012", "0000000000011",
] ]
nwGUI.mainMenu.aMoveUndo.activate(QAction.Trigger) nwGUI.mainMenu.aMoveUndo.activate(QAction.Trigger)
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
# Root Folder # Root Folder
# =========== # ===========
nwTree.setSelectedHandle("73475cb40a568") nwTree.setSelectedHandle("0000000000008")
assert nwGUI.theProject.projTree._treeOrder.index("73475cb40a568") == 0 assert nwGUI.theProject.projTree._treeOrder.index("0000000000008") == 0
# Move novel folder up # Move novel folder up
assert nwTree.moveTreeItem(-1) is False assert nwTree.moveTreeItem(-1) is False
nwTree.flushTreeOrder() nwTree.flushTreeOrder()
assert nwGUI.theProject.projTree._treeOrder.index("73475cb40a568") == 0 assert nwGUI.theProject.projTree._treeOrder.index("0000000000008") == 0
# Move novel folder down # Move novel folder down
assert nwTree.moveTreeItem(1) is True assert nwTree.moveTreeItem(1) is True
nwTree.flushTreeOrder() nwTree.flushTreeOrder()
assert nwGUI.theProject.projTree._treeOrder.index("73475cb40a568") == 1 assert nwGUI.theProject.projTree._treeOrder.index("0000000000008") == 1
# Move novel folder up again # Move novel folder up again
assert nwTree.moveTreeItem(-1) is True assert nwTree.moveTreeItem(-1) is True
nwTree.flushTreeOrder() nwTree.flushTreeOrder()
assert nwGUI.theProject.projTree._treeOrder.index("73475cb40a568") == 0 assert nwGUI.theProject.projTree._treeOrder.index("0000000000008") == 0
# Clean up # Clean up
# qtbot.stopForInteraction() # qtbot.stopForInteraction()
@@ -267,7 +265,7 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir):
@pytest.mark.gui @pytest.mark.gui
def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir): def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd):
"""Test adding and removing items from the project tree. """Test adding and removing items from the project tree.
""" """
# Block message box # Block message box
@@ -284,7 +282,6 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
assert nwTree.deleteItem() is False assert nwTree.deleteItem() is False
# Create a project # Create a project
nwGUI.theProject.projTree.setSeed(42)
prjDir = os.path.join(fncDir, "project") prjDir = os.path.join(fncDir, "project")
assert nwGUI.newProject({"projPath": prjDir}) is True assert nwGUI.newProject({"projPath": prjDir}) is True
@@ -292,13 +289,13 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
assert nwTree.emptyTrash() is False assert nwTree.emptyTrash() is False
# Add some files # Add some files
nwTree.setSelectedHandle("31489056e0916") nwTree.setSelectedHandle("000000000000d")
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.newTreeItem(nwItemType.FILE) is True assert nwTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19", "031b4af5197ec", "41cfc0d1f2d12", "0000000000010", "0000000000011", "0000000000012",
] ]
# Delete File # Delete File
@@ -306,7 +303,7 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
# Delete item without focus -> blocked # Delete item without focus -> blocked
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False)
nwTree.setSelectedHandle("41cfc0d1f2d12") nwTree.setSelectedHandle("0000000000012")
caplog.clear() caplog.clear()
assert nwTree.deleteItem() is False assert nwTree.deleteItem() is False
assert "blocked" in caplog.text assert "blocked" in caplog.text
@@ -327,76 +324,76 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
# Block adding trash folder # Block adding trash folder
funcPointer = nwTree._addTrashRoot funcPointer = nwTree._addTrashRoot
nwTree._addTrashRoot = lambda *a: None nwTree._addTrashRoot = lambda *a: None
assert nwTree.deleteItem("41cfc0d1f2d12") is False assert nwTree.deleteItem("0000000000012") is False
nwTree._addTrashRoot = funcPointer nwTree._addTrashRoot = funcPointer
# Delete last two documents, which also adds the trash folder # Delete last two documents, which also adds the trash folder
assert nwTree.deleteItem("41cfc0d1f2d12") is True assert nwTree.deleteItem("0000000000012") is True
assert nwTree.deleteItem("031b4af5197ec") is True assert nwTree.deleteItem("0000000000011") is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9", "0e17daca5f3e1", "000000000000d", "000000000000e", "000000000000f",
"1a6562590ef19" "0000000000010"
] ]
trashHandle = nwGUI.theProject.projTree.trashRoot() trashHandle = nwGUI.theProject.projTree.trashRoot()
assert nwTree.getTreeFromHandle(trashHandle) == [ assert nwTree.getTreeFromHandle(trashHandle) == [
trashHandle, "41cfc0d1f2d12", "031b4af5197ec" trashHandle, "0000000000012", "0000000000011"
] ]
# Delete the first file again (permanent), and ask for permission # Delete the first file again (permanent), and ask for permission
# Also open the document in the editor, which should trigger a close # Also open the document in the editor, which should trigger a close
assert os.path.isfile(os.path.join(prjDir, "content", "41cfc0d1f2d12.nwd")) assert os.path.isfile(os.path.join(prjDir, "content", "0000000000012.nwd"))
assert "41cfc0d1f2d12" in nwGUI.theProject.projTree assert "0000000000012" in nwGUI.theProject.projTree
assert nwGUI.docEditor.docHandle() is None assert nwGUI.docEditor.docHandle() is None
assert nwGUI.openDocument("41cfc0d1f2d12") is True assert nwGUI.openDocument("0000000000012") is True
assert nwGUI.docEditor.docHandle() == "41cfc0d1f2d12" assert nwGUI.docEditor.docHandle() == "0000000000012"
assert nwTree.deleteItem("41cfc0d1f2d12") is True assert nwTree.deleteItem("0000000000012") is True
assert nwGUI.docEditor.docHandle() is None assert nwGUI.docEditor.docHandle() is None
assert not os.path.isfile(os.path.join(prjDir, "content", "41cfc0d1f2d12.nwd")) assert not os.path.isfile(os.path.join(prjDir, "content", "0000000000012.nwd"))
assert "41cfc0d1f2d12" not in nwGUI.theProject.projTree assert "0000000000012" not in nwGUI.theProject.projTree
assert nwTree.getTreeFromHandle(trashHandle) == [ assert nwTree.getTreeFromHandle(trashHandle) == [
trashHandle, "031b4af5197ec" trashHandle, "0000000000011"
] ]
# Try to delete the second document, but block the deletion # Try to delete the second document, but block the deletion
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr("novelwriter.core.document.NWDoc.deleteDocument", lambda *a: False) mp.setattr("novelwriter.core.document.NWDoc.deleteDocument", lambda *a: False)
assert nwTree.deleteItem("031b4af5197ec") is False assert nwTree.deleteItem("0000000000011") is False
# Delete proper, and skip asking for permission # Delete proper, and skip asking for permission
assert os.path.isfile(os.path.join(prjDir, "content", "031b4af5197ec.nwd")) assert os.path.isfile(os.path.join(prjDir, "content", "0000000000011.nwd"))
assert "031b4af5197ec" in nwGUI.theProject.projTree assert "0000000000011" in nwGUI.theProject.projTree
assert nwTree.deleteItem("031b4af5197ec", alreadyAsked=True) is True assert nwTree.deleteItem("0000000000011", alreadyAsked=True) is True
assert not os.path.isfile(os.path.join(prjDir, "content", "031b4af5197ec.nwd")) assert not os.path.isfile(os.path.join(prjDir, "content", "0000000000011.nwd"))
assert "031b4af5197ec" not in nwGUI.theProject.projTree assert "0000000000011" not in nwGUI.theProject.projTree
assert nwTree.getTreeFromHandle(trashHandle) == [trashHandle] assert nwTree.getTreeFromHandle(trashHandle) == [trashHandle]
# Delete Folder/Root # Delete Folder/Root
# ================== # ==================
# Deleting non-empty folders is blocked # Deleting non-empty folders is blocked
assert nwTree.deleteItem("31489056e0916") is False # Folder assert nwTree.deleteItem("000000000000d") is False # Folder
assert nwTree.deleteItem("73475cb40a568") is False # Root assert nwTree.deleteItem("0000000000008") is False # Root
# Add a folder we can delete # Add a folder we can delete
nwTree.setSelectedHandle("71ee45a3c0db9") # Character Root nwTree.setSelectedHandle("000000000000a") # Character Root
assert nwTree.newTreeItem(nwItemType.FOLDER) is True assert nwTree.newTreeItem(nwItemType.FOLDER) is True
assert "2fca346db6561" in nwGUI.theProject.projTree assert "0000000000014" in nwGUI.theProject.projTree
# Try to delete, but block parent item lookup # Try to delete, but block parent item lookup
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr("PyQt5.QtWidgets.QTreeWidgetItem.parent", lambda *a: None) mp.setattr("PyQt5.QtWidgets.QTreeWidgetItem.parent", lambda *a: None)
caplog.clear() caplog.clear()
assert nwTree.deleteItem("2fca346db6561") is False assert nwTree.deleteItem("0000000000014") is False
assert "Could not delete folder" in caplog.text assert "Could not delete folder" in caplog.text
assert "2fca346db6561" in nwGUI.theProject.projTree assert "0000000000014" in nwGUI.theProject.projTree
# Delete folder properly # Delete folder properly
assert nwTree.deleteItem("2fca346db6561") is True assert nwTree.deleteItem("0000000000014") is True
assert "2fca346db6561" not in nwGUI.theProject.projTree assert "0000000000014" not in nwGUI.theProject.projTree
# Delete the Character root # Delete the Character root
assert nwTree.deleteItem("71ee45a3c0db9") is True assert nwTree.deleteItem("000000000000a") is True
assert "71ee45a3c0db9" not in nwGUI.theProject.projTree assert "000000000000a" not in nwGUI.theProject.projTree
# Empty Trash # Empty Trash
# =========== # ===========
@@ -408,13 +405,13 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir):
assert "already empty" in caplog.text assert "already empty" in caplog.text
# Move the two remaining scene documents to trash # Move the two remaining scene documents to trash
assert nwTree.deleteItem("0e17daca5f3e1") is True assert nwTree.deleteItem("000000000000f") is True
assert nwTree.deleteItem("1a6562590ef19") is True assert nwTree.deleteItem("0000000000010") is True
assert nwTree.getTreeFromHandle("31489056e0916") == [ assert nwTree.getTreeFromHandle("000000000000d") == [
"31489056e0916", "98010bd9270f9" "000000000000d", "000000000000e"
] ]
assert nwTree.getTreeFromHandle(trashHandle) == [ assert nwTree.getTreeFromHandle(trashHandle) == [
trashHandle, "0e17daca5f3e1", "1a6562590ef19" trashHandle, "000000000000f", "0000000000010"
] ]
# Empty trash, but select no on question # Empty trash, but select no on question
+2 -3
View File
@@ -29,14 +29,13 @@ from novelwriter.enum import nwState
@pytest.mark.gui @pytest.mark.gui
def testGuiStatusBar_Main(qtbot, monkeypatch, nwGUI, fncProj): def testGuiStatusBar_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the the various features of the status bar. """Test the the various features of the status bar.
""" """
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) is True assert nwGUI.newProject({"projPath": fncProj}) is True
cHandle = nwGUI.theProject.newFile("A Note", "71ee45a3c0db9") cHandle = nwGUI.theProject.newFile("A Note", "000000000000a")
newDoc = NWDoc(nwGUI.theProject, cHandle) newDoc = NWDoc(nwGUI.theProject, cHandle)
newDoc.writeDocument("# A Note\n\n") newDoc.writeDocument("# A Note\n\n")
nwGUI.treeView.revealNewTreeItem(cHandle) nwGUI.treeView.revealNewTreeItem(cHandle)
+2 -3
View File
@@ -29,7 +29,7 @@ from novelwriter.tools import GuiLipsum
@pytest.mark.gui @pytest.mark.gui
def testToolLipsum_Main(qtbot, monkeypatch, nwGUI, fncProj): def testToolLipsum_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
"""Test the Lorem Ipsum tool. """Test the Lorem Ipsum tool.
""" """
# Block message box # Block message box
@@ -40,9 +40,8 @@ def testToolLipsum_Main(qtbot, monkeypatch, nwGUI, fncProj):
assert getGuiItem("GuiLipsum") is None assert getGuiItem("GuiLipsum") is None
# Create a new project # Create a new project
nwGUI.theProject.projTree.setSeed(42)
assert nwGUI.newProject({"projPath": fncProj}) is True assert nwGUI.newProject({"projPath": fncProj}) is True
assert nwGUI.openDocument("0e17daca5f3e1") is True assert nwGUI.openDocument("000000000000f") is True
assert len(nwGUI.docEditor.getText()) == 15 assert len(nwGUI.docEditor.getText()) == 15
# Open the tool # Open the tool