diff --git a/tests/conftest.py b/tests/conftest.py index 7423d849..021c888b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,10 +5,14 @@ import sys import pytest import shutil + from os import path, mkdir +from nwdummy import DummyMain sys.path.insert(1, path.abspath(path.join(path.dirname(__file__), path.pardir))) +from nw.config import Config # noqa: E402 + @pytest.fixture(scope="session") def nwTemp(): testDir = path.dirname(__file__) @@ -19,6 +23,31 @@ def nwTemp(): mkdir(tempDir) return tempDir +@pytest.fixture(scope="session") +def nwRef(): + testDir = path.dirname(__file__) + refDir = path.join(testDir, "reference") + return refDir + +@pytest.fixture(scope="session") +def nwConf(nwRef, nwTemp): + theConf = Config() + theConf.initConfig(nwRef, nwTemp) + return theConf + +@pytest.fixture(scope="session") +def tmpConf(nwRef, nwTemp): + theConf = Config() + theConf.initConfig(nwTemp, nwTemp) + theConf.setLastPath("") + return theConf + +@pytest.fixture(scope="session") +def nwDummy(nwRef, nwTemp, nwConf): + theDummy = DummyMain() + theDummy.mainConf = nwConf + return theDummy + @pytest.fixture(scope="session") def nwTempProj(nwTemp): projDir = path.join(nwTemp, "proj") @@ -40,20 +69,6 @@ def nwTempBuild(nwTemp): mkdir(buildDir) return buildDir -@pytest.fixture(scope="session") -def nwTempCustom(nwTemp): - customDir = path.join(nwTemp, "custom") - if not path.isdir(customDir): - mkdir(customDir) - return customDir - -@pytest.fixture(scope="session") -def nwTempSample(nwTemp): - sampleDir = path.join(nwTemp, "sample") - if not path.isdir(sampleDir): - mkdir(sampleDir) - return sampleDir - @pytest.fixture(scope="function") def nwFuncTemp(nwTemp): funcDir = path.join(nwTemp, "ftemp") @@ -66,18 +81,30 @@ def nwFuncTemp(nwTemp): shutil.rmtree(funcDir) return -@pytest.fixture(scope="session") -def nwRef(): +@pytest.fixture(scope="function") +def nwMinimal(nwTemp): testDir = path.dirname(__file__) - refDir = path.join(testDir, "reference") - return refDir + minimalStore = path.join(testDir, "minimal") + minimalDir = path.join(nwTemp, "minimal") + if path.isdir(minimalDir): + shutil.rmtree(minimalDir) + shutil.copytree(minimalStore, minimalDir) + cacheDir = path.join(minimalDir, "cache") + if path.isdir(cacheDir): + shutil.rmtree(cacheDir) + metaDir = path.join(minimalDir, "meta") + if path.isdir(metaDir): + shutil.rmtree(metaDir) + yield minimalDir + if path.isdir(minimalDir): + shutil.rmtree(minimalDir) + return -@pytest.fixture(scope="session") -def nwLipsum(): +@pytest.fixture(scope="function") +def nwLipsum(nwTemp): testDir = path.dirname(__file__) - tempDir = path.join(testDir, "temp") lipsumStore = path.join(testDir, "lipsum") - lipsumDir = path.join(tempDir, "lipsum") + lipsumDir = path.join(nwTemp, "lipsum") if path.isdir(lipsumDir): shutil.rmtree(lipsumDir) shutil.copytree(lipsumStore, lipsumDir) @@ -87,4 +114,7 @@ def nwLipsum(): metaDir = path.join(lipsumDir, "meta") if path.isdir(metaDir): shutil.rmtree(metaDir) - return lipsumDir + yield lipsumDir + if path.isdir(lipsumDir): + shutil.rmtree(lipsumDir) + return diff --git a/tests/lipsum/ToC.json b/tests/lipsum/ToC.json index 7540d6c9..4d22a21c 100644 --- a/tests/lipsum/ToC.json +++ b/tests/lipsum/ToC.json @@ -27,7 +27,7 @@ [ "content/7a992350f3eb6.nwd", "NOVEL", - "Lorem Ipusm" + "Lorem Ipsum" ], [ "content/846352075de7d.nwd", diff --git a/tests/lipsum/ToC.txt b/tests/lipsum/ToC.txt index 86098bcd..a499c6f8 100644 --- a/tests/lipsum/ToC.txt +++ b/tests/lipsum/ToC.txt @@ -9,7 +9,7 @@ content/441420a886d82.nwd NOVEL Chapter Two content/47666c91c7ccf.nwd NOVEL Scene Five content/4c4f28287af27.nwd CHARACTER Mr. Nobody - content/7a992350f3eb6.nwd NOVEL Lorem Ipusm + content/7a992350f3eb6.nwd NOVEL Lorem Ipsum content/846352075de7d.nwd NOVEL Interlude content/88243afbe5ed8.nwd NOVEL Scene One content/88d59a277361b.nwd NOVEL Prologue diff --git a/tests/lipsum/nwProject.nwx b/tests/lipsum/nwProject.nwx index d6a58a7a..be2463a4 100644 --- a/tests/lipsum/nwProject.nwx +++ b/tests/lipsum/nwProject.nwx @@ -1,23 +1,25 @@ - + Lorem Ipsum Lorem Ipsum lipsum.com - 7 + 8 21 - 1459 + 1472 False False True - 04468803b92e1 + fb609cd8319dc None 3847 + 3109 + 738 - Replace Text 1 - Replace Text 2 + Replace Text 1 + Replace Text 2 %title% diff --git a/tests/minimal/ToC.json b/tests/minimal/ToC.json new file mode 100644 index 00000000..5881c392 --- /dev/null +++ b/tests/minimal/ToC.json @@ -0,0 +1,17 @@ +[ + [ + "content/8c659a11cd429.nwd", + "NOVEL", + "New Scene" + ], + [ + "content/a35baf2e93843.nwd", + "NOVEL", + "Title Page" + ], + [ + "content/f5ab3e30151e1.nwd", + "NOVEL", + "New Chapter" + ] +] \ No newline at end of file diff --git a/tests/minimal/ToC.txt b/tests/minimal/ToC.txt new file mode 100644 index 00000000..f5b94b72 --- /dev/null +++ b/tests/minimal/ToC.txt @@ -0,0 +1,10 @@ + + Table of Contents +=================== + + File Name Class Document Label +-------------------------------------------------------------------------------- + content/8c659a11cd429.nwd NOVEL New Scene + content/a35baf2e93843.nwd NOVEL Title Page + content/f5ab3e30151e1.nwd NOVEL New Chapter + diff --git a/tests/minimal/content/8c659a11cd429.nwd b/tests/minimal/content/8c659a11cd429.nwd new file mode 100644 index 00000000..5ecf5c59 --- /dev/null +++ b/tests/minimal/content/8c659a11cd429.nwd @@ -0,0 +1,3 @@ +%%~ 8c659a11cd429:a6d311a93600a:a508bb932959c:NOVEL:SCENE:New Scene +### New Scene + diff --git a/tests/minimal/content/a35baf2e93843.nwd b/tests/minimal/content/a35baf2e93843.nwd new file mode 100644 index 00000000..a7745e3b --- /dev/null +++ b/tests/minimal/content/a35baf2e93843.nwd @@ -0,0 +1,4 @@ +%%~ a35baf2e93843:a508bb932959c:NOVEL:TITLE:Title Page +# Minimal + +By Jane Doe, John Doh diff --git a/tests/minimal/content/f5ab3e30151e1.nwd b/tests/minimal/content/f5ab3e30151e1.nwd new file mode 100644 index 00000000..ba1c9faa --- /dev/null +++ b/tests/minimal/content/f5ab3e30151e1.nwd @@ -0,0 +1,3 @@ +%%~ f5ab3e30151e1:a6d311a93600a:a508bb932959c:NOVEL:CHAPTER:New Chapter +## New Chapter + diff --git a/tests/minimal/meta/guiOptions.json b/tests/minimal/meta/guiOptions.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/tests/minimal/meta/guiOptions.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tests/minimal/meta/sessionStats.log b/tests/minimal/meta/sessionStats.log new file mode 100644 index 00000000..38cbde3d --- /dev/null +++ b/tests/minimal/meta/sessionStats.log @@ -0,0 +1,2 @@ +# Start Time End Time Novel Notes +2020-08-28 11:36:36 2020-08-28 11:36:48 10 0 diff --git a/tests/minimal/meta/tagsIndex.json b/tests/minimal/meta/tagsIndex.json new file mode 100644 index 00000000..ec600a1c --- /dev/null +++ b/tests/minimal/meta/tagsIndex.json @@ -0,0 +1,91 @@ +{ + "tagIndex": {}, + "refIndex": { + "a35baf2e93843": { + "T000000": { + "tags": [], + "updated": 1598607396 + }, + "T000001": { + "tags": [], + "updated": 1598607396 + } + }, + "f5ab3e30151e1": { + "T000000": { + "tags": [], + "updated": 1598607396 + }, + "T000001": { + "tags": [], + "updated": 1598607396 + } + }, + "8c659a11cd429": { + "T000000": { + "tags": [], + "updated": 1598607396 + }, + "T000001": { + "tags": [], + "updated": 1598607396 + } + } + }, + "novelIndex": { + "a35baf2e93843": { + "T000001": { + "level": "H1", + "title": "Minimal", + "layout": "TITLE", + "synopsis": "", + "cCount": 7, + "wCount": 1, + "pCount": 0, + "updated": 1598607396 + } + }, + "f5ab3e30151e1": { + "T000001": { + "level": "H2", + "title": "New Chapter", + "layout": "CHAPTER", + "synopsis": "", + "cCount": 11, + "wCount": 2, + "pCount": 0, + "updated": 1598607396 + } + }, + "8c659a11cd429": { + "T000001": { + "level": "H3", + "title": "New Scene", + "layout": "SCENE", + "synopsis": "", + "cCount": 9, + "wCount": 2, + "pCount": 0, + "updated": 1598607396 + } + } + }, + "noteIndex": {}, + "textCounts": { + "a35baf2e93843": [ + 28, + 6, + 1 + ], + "f5ab3e30151e1": [ + 11, + 2, + 0 + ], + "8c659a11cd429": [ + 9, + 2, + 0 + ] + } +} \ No newline at end of file diff --git a/tests/minimal/nwProject.nwx b/tests/minimal/nwProject.nwx new file mode 100644 index 00000000..af99a8ce --- /dev/null +++ b/tests/minimal/nwProject.nwx @@ -0,0 +1,115 @@ + + + + Test Minimal + Minimal + Jane Doe + John Doh + 1 + 1 + 8 + + + True + False + True + None + None + 10 + 10 + 0 + + + %title% + Chapter %ch%: %title% + %title% + * * * +
+
+ + New + Note + Draft + Finished + + + New + Minor + Major + Main + +
+ + + Novel + ROOT + NOVEL + New + False + + + Title Page + FILE + NOVEL + New + True + TITLE + 28 + 6 + 1 + 0 + + + New Chapter + FOLDER + NOVEL + New + False + + + New Chapter + FILE + NOVEL + New + True + CHAPTER + 11 + 2 + 0 + 0 + + + New Scene + FILE + NOVEL + New + True + SCENE + 9 + 2 + 0 + 0 + + + Plot + ROOT + PLOT + New + False + + + Characters + ROOT + CHARACTER + New + False + + + World + ROOT + WORLD + New + False + + +
diff --git a/tests/reference/proj/3_nwProject.nwx b/tests/reference/proj/3_nwProject.nwx index 0c396343..c2be9007 100644 --- a/tests/reference/proj/3_nwProject.nwx +++ b/tests/reference/proj/3_nwProject.nwx @@ -1,9 +1,9 @@ - + New Project - 5 + 2 1 0 @@ -37,7 +37,7 @@ Main
- + Novel ROOT @@ -109,35 +109,7 @@ 0 0 - - Timeline - ROOT - TIMELINE - New - False - - - Object - ROOT - OBJECT - New - False - - - Custom1 - ROOT - CUSTOM - New - False - - - Custom2 - ROOT - CUSTOM - New - False - - + Hello FILE NOVEL @@ -149,7 +121,7 @@ 0 0 - + Jane FILE CHARACTER diff --git a/tests/test_config.py b/tests/test_config.py index cfff5d5d..b58e9697 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -5,112 +5,110 @@ import pytest from nwtools import cmpFiles from os import path -from nw.config import Config - -theConf = Config() @pytest.mark.core -def testConfigInit(nwTemp, nwRef): - tmpConf = path.join(nwTemp, "novelwriter.conf") +def testConfigCore(tmpConf, nwTemp, nwRef): refConf = path.join(nwRef, "novelwriter.conf") - assert theConf.initConfig(nwTemp, nwTemp) - assert theConf.setLastPath("") - assert theConf.saveConfig() - assert cmpFiles(tmpConf, refConf, [2]) - assert not theConf.confChanged + testConf = path.join(tmpConf.confPath, "novelwriter.conf") + + assert tmpConf.confPath == nwTemp + assert tmpConf.saveConfig() + assert cmpFiles(testConf, refConf, [2]) + assert not tmpConf.confChanged + + assert tmpConf.loadConfig() + assert not tmpConf.confChanged @pytest.mark.core -def testConfigSave(nwTemp, nwRef): - tmpConf = path.join(nwTemp, "novelwriter.conf") +def testConfigSetConfPath(tmpConf, nwTemp): + assert tmpConf.setConfPath(None) + assert not tmpConf.setConfPath(path.join("somewhere", "over", "the", "rainbow")) + assert tmpConf.setConfPath(path.join(nwTemp, "novelwriter.conf")) + assert tmpConf.confPath == nwTemp + assert tmpConf.confFile == "novelwriter.conf" + assert not tmpConf.confChanged + +@pytest.mark.core +def testConfigSetDataPath(tmpConf, nwTemp): + assert tmpConf.setDataPath(None) + assert not tmpConf.setDataPath(path.join("somewhere", "over", "the", "rainbow")) + assert tmpConf.setDataPath(nwTemp) + assert tmpConf.dataPath == nwTemp + assert not tmpConf.confChanged + +@pytest.mark.core +def testConfigSetWinSize(tmpConf, nwTemp, nwRef): refConf = path.join(nwRef, "novelwriter.conf") - assert theConf.confPath == nwTemp - assert theConf.saveConfig() - assert cmpFiles(tmpConf, refConf, [2]) - assert not theConf.confChanged + testConf = path.join(tmpConf.confPath, "novelwriter.conf") + + assert tmpConf.confPath == nwTemp + assert tmpConf.setWinSize(1105, 655) + assert not tmpConf.confChanged + assert tmpConf.setWinSize(70, 70) + assert tmpConf.confChanged + assert tmpConf.setWinSize(1100, 650) + assert tmpConf.saveConfig() + + assert cmpFiles(testConf, refConf, [2]) + assert not tmpConf.confChanged @pytest.mark.core -def testConfigSetConfPath(nwTemp): - assert theConf.setConfPath(None) - assert not theConf.setConfPath(path.join("somewhere", "over", "the", "rainbow")) - assert theConf.setConfPath(path.join(nwTemp, "novelwriter.conf")) - assert theConf.confPath == nwTemp - assert theConf.confFile == "novelwriter.conf" - assert not theConf.confChanged - -@pytest.mark.core -def testConfigSetDataPath(nwTemp): - assert theConf.setDataPath(None) - assert not theConf.setDataPath(path.join("somewhere", "over", "the", "rainbow")) - assert theConf.setDataPath(nwTemp) - assert theConf.dataPath == nwTemp - assert not theConf.confChanged - -@pytest.mark.core -def testConfigLoad(): - assert theConf.loadConfig() - assert not theConf.confChanged - -@pytest.mark.core -def testConfigSetWinSize(nwTemp, nwRef): - tmpConf = path.join(nwTemp, "novelwriter.conf") +def testConfigSetTreeColWidths(tmpConf, nwTemp, nwRef): refConf = path.join(nwRef, "novelwriter.conf") - assert theConf.setWinSize(1105, 655) - assert not theConf.confChanged - assert theConf.setWinSize(70, 70) - assert theConf.confChanged - assert theConf.setWinSize(1100, 650) - assert theConf.saveConfig() - assert cmpFiles(tmpConf, refConf, [2]) - assert not theConf.confChanged + testConf = path.join(tmpConf.confPath, "novelwriter.conf") + + assert tmpConf.confPath == nwTemp + assert tmpConf.setTreeColWidths([0, 0, 0]) + assert tmpConf.confChanged + assert tmpConf.setTreeColWidths([120, 30, 50]) + assert tmpConf.setProjColWidths([140, 55, 140]) + assert tmpConf.saveConfig() + + assert cmpFiles(testConf, refConf, [2]) + assert not tmpConf.confChanged @pytest.mark.core -def testConfigSetTreeColWidths(nwTemp, nwRef): - tmpConf = path.join(nwTemp, "novelwriter.conf") +def testConfigSetPanePos(tmpConf, nwTemp, nwRef): refConf = path.join(nwRef, "novelwriter.conf") - assert theConf.setTreeColWidths([0, 0, 0]) - assert theConf.confChanged - assert theConf.setTreeColWidths([120, 30, 50]) - assert theConf.setProjColWidths([140, 55, 140]) - assert theConf.saveConfig() - assert cmpFiles(tmpConf, refConf, [2]) - assert not theConf.confChanged + testConf = path.join(tmpConf.confPath, "novelwriter.conf") + + assert tmpConf.confPath == nwTemp + assert tmpConf.setMainPanePos([0, 0]) + assert tmpConf.confChanged + assert tmpConf.setMainPanePos([300, 800]) + assert tmpConf.setDocPanePos([400, 400]) + assert tmpConf.setViewPanePos([500, 150]) + assert tmpConf.setOutlinePanePos([500, 150]) + assert tmpConf.saveConfig() + + assert cmpFiles(testConf, refConf, [2]) + assert not tmpConf.confChanged @pytest.mark.core -def testConfigSetPanePos(nwTemp, nwRef): - tmpConf = path.join(nwTemp, "novelwriter.conf") +def testConfigFlags(tmpConf, nwTemp, nwRef): refConf = path.join(nwRef, "novelwriter.conf") - assert theConf.setMainPanePos([0, 0]) - assert theConf.confChanged - assert theConf.setMainPanePos([300, 800]) - assert theConf.setDocPanePos([400, 400]) - assert theConf.setViewPanePos([500, 150]) - assert theConf.setOutlinePanePos([500, 150]) - assert theConf.saveConfig() - assert cmpFiles(tmpConf, refConf, [2]) - assert not theConf.confChanged + testConf = path.join(tmpConf.confPath, "novelwriter.conf") + + assert tmpConf.confPath == nwTemp + assert not tmpConf.setShowRefPanel(False) + assert tmpConf.setShowRefPanel(True) + assert tmpConf.confChanged + assert tmpConf.saveConfig() + + assert cmpFiles(testConf, refConf, [2]) + assert not tmpConf.confChanged @pytest.mark.core -def testConfigFlags(nwTemp, nwRef): - tmpConf = path.join(nwTemp, "novelwriter.conf") - refConf = path.join(nwRef, "novelwriter.conf") - assert not theConf.setShowRefPanel(False) - assert theConf.setShowRefPanel(True) - assert theConf.confChanged - assert theConf.saveConfig() - assert cmpFiles(tmpConf, refConf, [2]) - assert not theConf.confChanged - -@pytest.mark.core -def testConfigErrors(nwTemp): +def testConfigErrors(tmpConf): nonPath = path.join("somewhere", "over", "the", "rainbow") - assert theConf.initConfig(nonPath, nonPath) - assert theConf.hasError - assert not theConf.loadConfig() - assert not theConf.saveConfig() - assert not theConf.loadRecentCache() - assert len(theConf.getErrData()) > 0 + assert tmpConf.initConfig(nonPath, nonPath) + assert tmpConf.hasError + assert not tmpConf.loadConfig() + assert not tmpConf.saveConfig() + assert not tmpConf.loadRecentCache() + assert len(tmpConf.getErrData()) > 0 @pytest.mark.core -def testConfigInternals(): - assert theConf._checkNone(None) is None - assert theConf._checkNone("None") is None +def testConfigInternals(tmpConf): + assert tmpConf._checkNone(None) is None + assert tmpConf._checkNone("None") is None diff --git a/tests/test_gui.py b/tests/test_gui.py index 22f82c61..5e02b21c 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -5,6 +5,7 @@ import nw import pytest import json +from shutil import copyfile from nwtools import cmpFiles from os import path @@ -24,8 +25,9 @@ keyDelay = 2 stepDelay = 20 @pytest.mark.gui -def testMainWindows(qtbot, nwTempGUI, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testMainWindows(qtbot, nwFuncTemp, nwTempGUI, nwRef, nwTemp): + + nwGUI = nw.main(["--testmode", "--config=%s" % nwFuncTemp, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -33,7 +35,7 @@ def testMainWindows(qtbot, nwTempGUI, nwRef, nwTemp): # Create new, save, close project nwGUI.theProject.projTree.setSeed(42) - assert nwGUI.newProject({"projPath": nwTempGUI}, True) + assert nwGUI.newProject({"projPath": nwFuncTemp}, True) assert nwGUI.saveProject() assert nwGUI.closeProject() @@ -50,14 +52,17 @@ def testMainWindows(qtbot, nwTempGUI, nwRef, nwTemp): assert not nwGUI.theProject.spellCheck # Check the files - projFile = path.join(nwTempGUI, "nwProject.nwx") - assert cmpFiles(projFile, path.join(nwRef, "gui", "0_nwProject.nwx"), [2, 6, 7, 8]) + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempGUI, "0_nwProject.nwx") + refFile = path.join(nwRef, "gui", "0_nwProject.nwx") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) qtbot.wait(stepDelay) # qtbot.stopForInteraction() # Re-open project - assert nwGUI.openProject(nwTempGUI) + assert nwGUI.openProject(nwFuncTemp) qtbot.wait(stepDelay) # Check that we loaded the data @@ -65,8 +70,8 @@ def testMainWindows(qtbot, nwTempGUI, nwRef, nwTemp): assert len(nwGUI.theProject.projTree._treeOrder) == 8 assert len(nwGUI.theProject.projTree._treeRoots) == 4 assert nwGUI.theProject.projTree.trashRoot() is None - assert nwGUI.theProject.projPath == nwTempGUI - assert nwGUI.theProject.projMeta == path.join(nwTempGUI, "meta") + assert nwGUI.theProject.projPath == nwFuncTemp + assert nwGUI.theProject.projMeta == path.join(nwFuncTemp, "meta") assert nwGUI.theProject.projFile == "nwProject.nwx" assert nwGUI.theProject.projName == "New Project" assert nwGUI.theProject.bookTitle == "" @@ -266,23 +271,42 @@ def testMainWindows(qtbot, nwTempGUI, nwRef, nwTemp): assert nwGUI.saveProject() # Check the files - refFile = path.join(nwTempGUI, "nwProject.nwx") - assert cmpFiles(refFile, path.join(nwRef, "gui", "1_nwProject.nwx"), [2, 6, 7, 8]) - refFile = path.join(nwTempGUI, "content", "031b4af5197ec.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "1_031b4af5197ec.nwd")) - refFile = path.join(nwTempGUI, "content", "1a6562590ef19.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "1_1a6562590ef19.nwd")) - refFile = path.join(nwTempGUI, "content", "0e17daca5f3e1.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "1_0e17daca5f3e1.nwd")) - refFile = path.join(nwTempGUI, "content", "41cfc0d1f2d12.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "1_41cfc0d1f2d12.nwd")) + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempGUI, "1_nwProject.nwx") + refFile = path.join(nwRef, "gui", "1_nwProject.nwx") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) + + projFile = path.join(nwFuncTemp, "content", "031b4af5197ec.nwd") + testFile = path.join(nwTempGUI, "1_031b4af5197ec.nwd") + refFile = path.join(nwRef, "gui", "1_031b4af5197ec.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwFuncTemp, "content", "1a6562590ef19.nwd") + testFile = path.join(nwTempGUI, "1_1a6562590ef19.nwd") + refFile = path.join(nwRef, "gui", "1_1a6562590ef19.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwFuncTemp, "content", "0e17daca5f3e1.nwd") + testFile = path.join(nwTempGUI, "1_0e17daca5f3e1.nwd") + refFile = path.join(nwRef, "gui", "1_0e17daca5f3e1.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwFuncTemp, "content", "41cfc0d1f2d12.nwd") + testFile = path.join(nwTempGUI, "1_41cfc0d1f2d12.nwd") + refFile = path.join(nwRef, "gui", "1_41cfc0d1f2d12.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) nwGUI.closeMain() # qtbot.stopForInteraction() @pytest.mark.gui -def testProjectEditor(qtbot, nwTempGUI, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testProjectEditor(qtbot, nwFuncTemp, nwTempGUI, nwRef, nwTemp): + nwGUI = nw.main(["--testmode", "--config=%s" % nwFuncTemp, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -290,8 +314,8 @@ def testProjectEditor(qtbot, nwTempGUI, nwRef, nwTemp): # Create new, save, open project nwGUI.theProject.projTree.setSeed(42) - assert nwGUI.newProject({"projPath": nwTempGUI}, True) - nwGUI.mainConf.backupPath = nwTempGUI + assert nwGUI.newProject({"projPath": nwFuncTemp}, True) + nwGUI.mainConf.backupPath = nwFuncTemp projEdit = GuiProjectSettings(nwGUI, nwGUI.theProject) projEdit.show() @@ -369,15 +393,18 @@ def testProjectEditor(qtbot, nwTempGUI, nwRef, nwTemp): qtbot.wait(stepDelay) # Check the files - projFile = path.join(nwTempGUI, "nwProject.nwx") - assert cmpFiles(projFile, path.join(nwRef, "gui", "2_nwProject.nwx"), [2, 8, 9, 10]) + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempGUI, "2_nwProject.nwx") + refFile = path.join(nwRef, "gui", "2_nwProject.nwx") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) # qtbot.stopForInteraction() nwGUI.closeMain() @pytest.mark.gui -def testItemEditor(qtbot, nwTempGUI, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testItemEditor(qtbot, nwFuncTemp, nwTempGUI, nwRef, nwTemp): + nwGUI = nw.main(["--testmode", "--config=%s" % nwFuncTemp, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -385,7 +412,7 @@ def testItemEditor(qtbot, nwTempGUI, nwRef, nwTemp): # Create new, save, open project nwGUI.theProject.projTree.setSeed(42) - assert nwGUI.newProject({"projPath": nwTempGUI}, True) + assert nwGUI.newProject({"projPath": nwFuncTemp}, True) assert nwGUI.openDocument("0e17daca5f3e1") itemEdit = GuiItemEditor(nwGUI, nwGUI.theProject, "0e17daca5f3e1") @@ -425,24 +452,70 @@ def testItemEditor(qtbot, nwTempGUI, nwRef, nwTemp): qtbot.wait(stepDelay) # Check the files - projFile = path.join(nwTempGUI, "nwProject.nwx") - assert cmpFiles(projFile, path.join(nwRef, "gui", "3_nwProject.nwx"), [2, 6, 7, 8]) + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempGUI, "3_nwProject.nwx") + refFile = path.join(nwRef, "gui", "3_nwProject.nwx") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) nwGUI.closeMain() # qtbot.stopForInteraction() @pytest.mark.gui -def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testWritingStatsExport(qtbot, nwFuncTemp, nwTemp): + nwGUI = nw.main(["--testmode", "--config=%s" % nwFuncTemp, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) qtbot.wait(stepDelay) - assert nwGUI.openProject(nwTempGUI) + # Create new, save, close project + nwGUI.theProject.projTree.setSeed(42) + assert nwGUI.newProject({"projPath": nwFuncTemp}, True) + assert nwGUI.saveProject() + assert nwGUI.closeProject() qtbot.wait(stepDelay) - nwGUI.mainConf.lastPath = nwTempGUI + assert nwGUI.openProject(nwFuncTemp) + qtbot.wait(stepDelay) + + # Add some text to the scene file + assert nwGUI.openDocument("0e17daca5f3e1") + assert nwGUI.docEditor.insertText( + "# Scene One\n\n" + "It was the best of times, it was the worst of times, it was the age of wisdom, it was " + "the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it " + "was the season of Light, it was the season of Darkness, it was the spring of hope, it " + "was the winter of despair, we had everything before us, we had nothing before us, we " + "were all going direct to Heaven, we were all going direct the other way – in short, the " + "period was so far like the present period, that some of its noisiest authorities " + "insisted on its being received, for good or for evil, in the superlative degree of " + "comparison only.\n\n" + ) + assert nwGUI.saveDocument() + + # Add a note file with some text + nwGUI.setFocus(1) + nwGUI.treeView.clearSelection() + nwGUI.treeView._getTreeItem("71ee45a3c0db9").setSelected(True) + nwGUI.treeView.newTreeItem(nwItemType.FILE, None) + assert nwGUI.openSelectedItem() + assert nwGUI.docEditor.insertText( + "# Jane Doe\n\n" + "All about Jane.\n\n" + ) + assert nwGUI.saveDocument() + qtbot.wait(500) # Ensures that the session length is > 0 + + assert nwGUI.saveProject() + assert nwGUI.closeProject() + qtbot.wait(stepDelay) + + # Open again, and check the stats + assert nwGUI.openProject(nwFuncTemp) + qtbot.wait(stepDelay) + + nwGUI.mainConf.lastPath = nwFuncTemp sessLog = GuiWritingStats(nwGUI, nwGUI.theProject) sessLog.show() qtbot.wait(stepDelay) @@ -452,15 +525,15 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): assert sessLog._saveData(sessLog.FMT_JSON) qtbot.wait(stepDelay) - jsonStats = path.join(nwTempGUI, "sessionStats.json") + jsonStats = path.join(nwFuncTemp, "sessionStats.json") with open(jsonStats, mode="r", encoding="utf-8") as inFile: jsonData = json.loads(inFile.read()) - assert len(jsonData) == 3 - assert jsonData[1]["length"] > 0 - assert jsonData[1]["newWords"] == 84 - assert jsonData[1]["novelWords"] == 63 - assert jsonData[1]["noteWords"] == 27 + assert len(jsonData) == 2 + assert jsonData[1]["length"] >= 0 + assert jsonData[1]["newWords"] == 126 + assert jsonData[1]["novelWords"] == 127 + assert jsonData[1]["noteWords"] == 5 # No Novel Files qtbot.mouseClick(sessLog.incNovel, Qt.LeftButton) @@ -468,15 +541,15 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): assert sessLog._saveData(sessLog.FMT_JSON) qtbot.wait(stepDelay) - jsonStats = path.join(nwTempGUI, "sessionStats.json") + jsonStats = path.join(nwFuncTemp, "sessionStats.json") with open(jsonStats, mode="r", encoding="utf-8") as inFile: jsonData = json.loads(inFile.read()) - assert len(jsonData) == 2 - assert jsonData[0]["length"] > 0 - assert jsonData[0]["newWords"] == 27 - assert jsonData[0]["novelWords"] == 63 - assert jsonData[0]["noteWords"] == 27 + assert len(jsonData) == 1 + assert jsonData[0]["length"] >= 0 + assert jsonData[0]["newWords"] == 5 + assert jsonData[0]["novelWords"] == 127 + assert jsonData[0]["noteWords"] == 5 # No Note Files qtbot.mouseClick(sessLog.incNovel, Qt.LeftButton) @@ -485,15 +558,15 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): assert sessLog._saveData(sessLog.FMT_JSON) qtbot.wait(stepDelay) - jsonStats = path.join(nwTempGUI, "sessionStats.json") + jsonStats = path.join(nwFuncTemp, "sessionStats.json") with open(jsonStats, mode="r", encoding="utf-8") as inFile: jsonData = json.loads(inFile.read()) - assert len(jsonData) == 3 - assert jsonData[1]["length"] > 0 - assert jsonData[1]["newWords"] == 57 - assert jsonData[1]["novelWords"] == 63 - assert jsonData[1]["noteWords"] == 27 + assert len(jsonData) == 2 + assert jsonData[1]["length"] >= 0 + assert jsonData[1]["newWords"] == 121 + assert jsonData[1]["novelWords"] == 127 + assert jsonData[1]["noteWords"] == 5 # No Negative Entries qtbot.mouseClick(sessLog.incNotes, Qt.LeftButton) @@ -502,7 +575,7 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): assert sessLog._saveData(sessLog.FMT_JSON) qtbot.wait(stepDelay) - jsonStats = path.join(nwTempGUI, "sessionStats.json") + jsonStats = path.join(nwFuncTemp, "sessionStats.json") with open(jsonStats, mode="r", encoding="utf-8") as inFile: jsonData = json.loads(inFile.read()) @@ -515,11 +588,11 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): assert sessLog._saveData(sessLog.FMT_JSON) qtbot.wait(stepDelay) - jsonStats = path.join(nwTempGUI, "sessionStats.json") + jsonStats = path.join(nwFuncTemp, "sessionStats.json") with open(jsonStats, mode="r", encoding="utf-8") as inFile: jsonData = json.loads(inFile.read()) - assert len(jsonData) == 4 + assert len(jsonData) == 2 # Group by Day qtbot.mouseClick(sessLog.groupByDay, Qt.LeftButton) @@ -527,7 +600,7 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): assert sessLog._saveData(sessLog.FMT_JSON) qtbot.wait(stepDelay) - jsonStats = path.join(nwTempGUI, "sessionStats.json") + jsonStats = path.join(nwFuncTemp, "sessionStats.json") with open(jsonStats, mode="r", encoding="utf-8") as inFile: jsonData = json.loads(inFile.read()) @@ -541,8 +614,8 @@ def testWritingStatsExport(qtbot, nwTempGUI, nwRef, nwTemp): nwGUI.closeMain() @pytest.mark.gui -def testAboutBox(qtbot, nwTempGUI, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testAboutBox(qtbot, nwFuncTemp, nwTemp): + nwGUI = nw.main(["--testmode", "--config=%s" % nwFuncTemp, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -553,14 +626,13 @@ def testAboutBox(qtbot, nwTempGUI, nwRef, nwTemp): assert msgAbout.pageLicense.document().characterCount() > 100 # qtbot.stopForInteraction() - msgAbout._doClose() nwGUI.closeMain() @pytest.mark.gui def testBuildTool(qtbot, nwTempBuild, nwLipsum, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempBuild, "--data=%s" % nwTemp]) + nwGUI = nw.main(["--testmode", "--config=%s" % nwLipsum, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -568,7 +640,7 @@ def testBuildTool(qtbot, nwTempBuild, nwLipsum, nwRef, nwTemp): assert nwGUI.openProject(nwLipsum) - nwGUI.mainConf.lastPath = nwTempBuild + nwGUI.mainConf.lastPath = nwLipsum nwBuild = GuiBuildNovel(nwGUI, nwGUI.theProject) @@ -578,10 +650,17 @@ def testBuildTool(qtbot, nwTempBuild, nwLipsum, nwRef, nwTemp): assert nwBuild._saveDocument(nwBuild.FMT_NWD) assert nwBuild._saveDocument(nwBuild.FMT_HTM) - refFile = path.join(nwTempBuild, "Lorem Ipsum.nwd") - assert cmpFiles(refFile, path.join(nwRef, "build", "1_LoremIpsum.nwd"), []) - refFile = path.join(nwTempBuild, "Lorem Ipsum.htm") - assert cmpFiles(refFile, path.join(nwRef, "build", "1_LoremIpsum.htm"), []) + projFile = path.join(nwLipsum, "Lorem Ipsum.nwd") + testFile = path.join(nwTempBuild, "1_LoremIpsum.nwd") + refFile = path.join(nwRef, "build", "1_LoremIpsum.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "Lorem Ipsum.htm") + testFile = path.join(nwTempBuild, "1_LoremIpsum.htm") + refFile = path.join(nwRef, "build", "1_LoremIpsum.htm") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) # Change Title Formats and Flip Switches nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%") @@ -610,10 +689,17 @@ def testBuildTool(qtbot, nwTempBuild, nwLipsum, nwRef, nwTemp): assert nwBuild._saveDocument(nwBuild.FMT_NWD) assert nwBuild._saveDocument(nwBuild.FMT_HTM) - refFile = path.join(nwTempBuild, "Lorem Ipsum.nwd") - assert cmpFiles(refFile, path.join(nwRef, "build", "2_LoremIpsum.nwd"), []) - refFile = path.join(nwTempBuild, "Lorem Ipsum.htm") - assert cmpFiles(refFile, path.join(nwRef, "build", "2_LoremIpsum.htm"), []) + projFile = path.join(nwLipsum, "Lorem Ipsum.nwd") + testFile = path.join(nwTempBuild, "2_LoremIpsum.nwd") + refFile = path.join(nwRef, "build", "2_LoremIpsum.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "Lorem Ipsum.htm") + testFile = path.join(nwTempBuild, "2_LoremIpsum.htm") + refFile = path.join(nwRef, "build", "2_LoremIpsum.htm") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) # Putline Mode nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%") @@ -637,19 +723,26 @@ def testBuildTool(qtbot, nwTempBuild, nwLipsum, nwRef, nwTemp): assert nwBuild._saveDocument(nwBuild.FMT_NWD) assert nwBuild._saveDocument(nwBuild.FMT_HTM) - refFile = path.join(nwTempBuild, "Lorem Ipsum.nwd") - assert cmpFiles(refFile, path.join(nwRef, "build", "3_LoremIpsum.nwd"), []) - refFile = path.join(nwTempBuild, "Lorem Ipsum.htm") - assert cmpFiles(refFile, path.join(nwRef, "build", "3_LoremIpsum.htm"), []) + projFile = path.join(nwLipsum, "Lorem Ipsum.nwd") + testFile = path.join(nwTempBuild, "3_LoremIpsum.nwd") + refFile = path.join(nwRef, "build", "3_LoremIpsum.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "Lorem Ipsum.htm") + testFile = path.join(nwTempBuild, "3_LoremIpsum.htm") + refFile = path.join(nwRef, "build", "3_LoremIpsum.htm") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) # qtbot.stopForInteraction() nwBuild._doClose() nwGUI.closeMain() @pytest.mark.gui -def testMergeTool(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): +def testMergeSplitTools(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) + nwGUI = nw.main(["--testmode", "--config=%s" % nwLipsum, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -670,24 +763,11 @@ def testMergeTool(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): assert nwGUI.theProject.projTree["73475cb40a568"] is not None - refFile = path.join(nwLipsum, "content", "73475cb40a568.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "4_73475cb40a568.nwd")) - - # qtbot.stopForInteraction() - nwGUI.closeMain() - -@pytest.mark.gui -def testSplitTool(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): - - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) - qtbot.addWidget(nwGUI) - nwGUI.show() - qtbot.waitForWindowShown(nwGUI) - qtbot.wait(stepDelay) - - nwGUI.theProject.projTree.setSeed(42) - assert nwGUI.openProject(nwLipsum) - qtbot.wait(stepDelay) + projFile = path.join(nwLipsum, "content", "73475cb40a568.nwd") + testFile = path.join(nwTempGUI, "4_73475cb40a568.nwd") + refFile = path.join(nwRef, "gui", "4_73475cb40a568.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) # Split By Chapter assert nwGUI.treeView.setSelectedHandle("73475cb40a568") @@ -701,8 +781,11 @@ def testSplitTool(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): assert nwGUI.theProject.projTree["71ee45a3c0db9"] is not None # This should give us back the file as it was before - refFile = path.join(nwLipsum, "content", "71ee45a3c0db9.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "4_73475cb40a568.nwd"), [1]) + projFile = path.join(nwLipsum, "content", "71ee45a3c0db9.nwd") + testFile = path.join(nwTempGUI, "4_71ee45a3c0db9.nwd") + refFile = path.join(nwRef, "gui", "4_73475cb40a568.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [1]) # Split By Scene assert nwGUI.treeView.setSelectedHandle("73475cb40a568") @@ -718,12 +801,23 @@ def testSplitTool(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): assert nwGUI.theProject.projTree["31489056e0916"] is not None assert nwGUI.theProject.projTree["98010bd9270f9"] is not None - refFile = path.join(nwLipsum, "content", "25fc0e7096fc6.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_25fc0e7096fc6.nwd")) - refFile = path.join(nwLipsum, "content", "31489056e0916.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_31489056e0916.nwd")) - refFile = path.join(nwLipsum, "content", "98010bd9270f9.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_98010bd9270f9.nwd")) + projFile = path.join(nwLipsum, "content", "25fc0e7096fc6.nwd") + testFile = path.join(nwTempGUI, "5_25fc0e7096fc6.nwd") + refFile = path.join(nwRef, "gui", "5_25fc0e7096fc6.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "content", "31489056e0916.nwd") + testFile = path.join(nwTempGUI, "5_31489056e0916.nwd") + refFile = path.join(nwRef, "gui", "5_31489056e0916.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "content", "98010bd9270f9.nwd") + testFile = path.join(nwTempGUI, "5_98010bd9270f9.nwd") + refFile = path.join(nwRef, "gui", "5_98010bd9270f9.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) # Split By Section assert nwGUI.treeView.setSelectedHandle("73475cb40a568") @@ -741,22 +835,41 @@ def testSplitTool(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): assert nwGUI.theProject.projTree["2858dcd1057d3"] is not None assert nwGUI.theProject.projTree["2fca346db6561"] is not None - refFile = path.join(nwLipsum, "content", "1a6562590ef19.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_25fc0e7096fc6.nwd"), [1]) - refFile = path.join(nwLipsum, "content", "031b4af5197ec.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_031b4af5197ec.nwd")) - refFile = path.join(nwLipsum, "content", "41cfc0d1f2d12.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_41cfc0d1f2d12.nwd")) - refFile = path.join(nwLipsum, "content", "2858dcd1057d3.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_2858dcd1057d3.nwd")) - refFile = path.join(nwLipsum, "content", "2fca346db6561.nwd") - assert cmpFiles(refFile, path.join(nwRef, "gui", "5_2fca346db6561.nwd")) + projFile = path.join(nwLipsum, "content", "1a6562590ef19.nwd") + testFile = path.join(nwTempGUI, "5_25fc0e7096fc6.nwd") + refFile = path.join(nwRef, "gui", "5_25fc0e7096fc6.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [1]) + + projFile = path.join(nwLipsum, "content", "031b4af5197ec.nwd") + testFile = path.join(nwTempGUI, "5_031b4af5197ec.nwd") + refFile = path.join(nwRef, "gui", "5_031b4af5197ec.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "content", "41cfc0d1f2d12.nwd") + testFile = path.join(nwTempGUI, "5_41cfc0d1f2d12.nwd") + refFile = path.join(nwRef, "gui", "5_41cfc0d1f2d12.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "content", "2858dcd1057d3.nwd") + testFile = path.join(nwTempGUI, "5_2858dcd1057d3.nwd") + refFile = path.join(nwRef, "gui", "5_2858dcd1057d3.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) + + projFile = path.join(nwLipsum, "content", "2fca346db6561.nwd") + testFile = path.join(nwTempGUI, "5_2fca346db6561.nwd") + refFile = path.join(nwRef, "gui", "5_2fca346db6561.nwd") + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile) # qtbot.stopForInteraction() nwGUI.closeMain() @pytest.mark.gui -def testNewProjectWizard(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): +def testNewProjectWizard(qtbot, nwLipsum, nwTemp): from PyQt5.QtWidgets import QWizard from nw.gui.projwizard import ( @@ -764,7 +877,7 @@ def testNewProjectWizard(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): ProjWizardCustomPage, ProjWizardFinalPage ) - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) + nwGUI = nw.main(["--testmode", "--config=%s" % nwLipsum, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -885,9 +998,9 @@ def testNewProjectWizard(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): nwGUI.closeMain() @pytest.mark.gui -def testDocAction(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): +def testDocAction(qtbot, nwLipsum, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) + nwGUI = nw.main(["--testmode", "--config=%s" % nwLipsum, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -1001,8 +1114,8 @@ def testDocAction(qtbot, nwTempGUI, nwLipsum, nwRef, nwTemp): nwGUI.closeMain() @pytest.mark.gui -def testInsertMenu(qtbot, nwTempGUI, nwFuncTemp, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testInsertMenu(qtbot, nwFuncTemp, nwTemp): + nwGUI = nw.main(["--testmode", "--config=%s" % nwFuncTemp, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) @@ -1079,24 +1192,29 @@ def testInsertMenu(qtbot, nwTempGUI, nwFuncTemp, nwTemp): nwGUI.closeMain() @pytest.mark.gui -def testLoadProject(qtbot, nwTempGUI, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempGUI, "--data=%s" % nwTemp]) +def testLoadProject(qtbot, nwMinimal, nwTemp): + nwGUI = nw.main(["--testmode", "--config=%s" % nwMinimal, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) qtbot.wait(stepDelay) + assert nwGUI.openProject(nwMinimal) + assert nwGUI.closeProject() + nwLoad = GuiProjectLoad(nwGUI) nwLoad.show() recentCount = nwLoad.listBox.topLevelItemCount() - assert recentCount > 1 + assert recentCount > 0 - selItem = nwLoad.listBox.topLevelItem(1) + selItem = nwLoad.listBox.topLevelItem(0) selPath = selItem.data(nwLoad.C_NAME, Qt.UserRole) + assert isinstance(selItem, QTreeWidgetItem) nwLoad.selPath.setText("") nwLoad.listBox.setCurrentItem(selItem) + nwLoad._doSelectRecent() assert nwLoad.selPath.text() == selPath qtbot.mouseClick(nwLoad.buttonBox.button(QDialogButtonBox.Open), Qt.LeftButton) @@ -1125,16 +1243,16 @@ def testLoadProject(qtbot, nwTempGUI, nwTemp): nwGUI.closeMain() @pytest.mark.gui -def testOutline(qtbot, nwTempBuild, nwLipsum, nwTemp): +def testOutline(qtbot, nwLipsum, nwTemp): - nwGUI = nw.main(["--testmode", "--config=%s" % nwTempBuild, "--data=%s" % nwTemp]) + nwGUI = nw.main(["--testmode", "--config=%s" % nwLipsum, "--data=%s" % nwTemp]) qtbot.addWidget(nwGUI) nwGUI.show() qtbot.waitForWindowShown(nwGUI) qtbot.wait(stepDelay) assert nwGUI.openProject(nwLipsum) - nwGUI.mainConf.lastPath = nwTempBuild + nwGUI.mainConf.lastPath = nwLipsum nwGUI.rebuildIndex() nwGUI.tabWidget.setCurrentIndex(nwGUI.idxTabProj) diff --git a/tests/test_item.py b/tests/test_item.py index ca78d28e..a3280c14 100644 --- a/tests/test_item.py +++ b/tests/test_item.py @@ -5,22 +5,15 @@ import pytest from lxml import etree -from nwdummy import DummyMain -from nw.config import Config from nw.core.project import NWProject, NWItem from nw.constants import nwItemClass, nwItemType, nwItemLayout -theConf = Config() -theMain = DummyMain() -theMain.mainConf = theConf - -theProject = NWProject(theMain) -theItem = NWItem(theProject) -nwXML = etree.Element("novelWriterXML") - @pytest.mark.project -def testItemSettersSimple(): +def testItemSettersSimple(nwDummy): + + theProject = NWProject(nwDummy) + theItem = NWItem(theProject) # Name theItem.setName("A Name") @@ -113,7 +106,10 @@ def testItemSettersSimple(): assert theItem.cursorPos == 1 @pytest.mark.project -def testItemClassSetter(): +def testItemClassSetter(nwDummy): + + theProject = NWProject(nwDummy) + theItem = NWItem(theProject) # Class theItem.setClass(None) @@ -138,13 +134,18 @@ def testItemClassSetter(): assert theItem.itemClass == nwItemClass.ENTITY theItem.setClass("CUSTOM") assert theItem.itemClass == nwItemClass.CUSTOM + theItem.setClass("ARCHIVE") + assert theItem.itemClass == nwItemClass.ARCHIVE theItem.setClass("TRASH") assert theItem.itemClass == nwItemClass.TRASH @pytest.mark.project -def testItemTypeSetter(): +def testItemTypeSetter(nwDummy): - # Class + theProject = NWProject(nwDummy) + theItem = NWItem(theProject) + + # Type theItem.setType(None) assert theItem.itemType == nwItemType.NO_TYPE theItem.setType("NONSENSE") @@ -161,9 +162,12 @@ def testItemTypeSetter(): assert theItem.itemType == nwItemType.TRASH @pytest.mark.project -def testItemLayoutSetter(): +def testItemLayoutSetter(nwDummy): - # Class + theProject = NWProject(nwDummy) + theItem = NWItem(theProject) + + # Layout theItem.setLayout(None) assert theItem.itemLayout == nwItemLayout.NO_LAYOUT theItem.setLayout("NONSENSE") @@ -188,7 +192,25 @@ def testItemLayoutSetter(): assert theItem.itemLayout == nwItemLayout.NOTE @pytest.mark.project -def testItemXMLPackUnpack(): +def testItemXMLPackUnpack(nwDummy): + + theProject = NWProject(nwDummy) + theItem = NWItem(theProject) + nwXML = etree.Element("novelWriterXML") + + theItem.setHandle("0123456789abc") + theItem.setParent("0123456789abc") + theItem.setOrder(1) + theItem.setName("A Name") + theItem.setClass("NOVEL") + theItem.setType("FILE") + theItem.setStatus("Main") + theItem.setLayout("NOTE") + theItem.setExpanded(True) + theItem.setParaCount(3) + theItem.setWordCount(5) + theItem.setCharCount(7) + theItem.setCursorPos(11) # Pack xContent = etree.SubElement(nwXML, "content") @@ -196,9 +218,9 @@ def testItemXMLPackUnpack(): assert etree.tostring(xContent, pretty_print=False, encoding="utf-8") == ( b"" b"" - b"A NameTRASHTRASH" - b"MainTrue" - b"" + b"A NameFILENOVELNew" + b"TrueNOTE7" + b"5311" b"" ) @@ -208,10 +230,10 @@ def testItemXMLPackUnpack(): assert theItem.parHandle == "0123456789abc" assert theItem.itemOrder == 1 assert theItem.isExpanded - assert theItem.charCount == 1 - assert theItem.wordCount == 1 - assert theItem.paraCount == 1 - assert theItem.cursorPos == 1 - assert theItem.itemClass == nwItemClass.TRASH - assert theItem.itemType == nwItemType.TRASH + assert theItem.paraCount == 3 + assert theItem.wordCount == 5 + assert theItem.charCount == 7 + assert theItem.cursorPos == 11 + assert theItem.itemClass == nwItemClass.NOVEL + assert theItem.itemType == nwItemType.FILE assert theItem.itemLayout == nwItemLayout.NOTE diff --git a/tests/test_project.py b/tests/test_project.py index 005bac2b..4e90a8c4 100644 --- a/tests/test_project.py +++ b/tests/test_project.py @@ -4,63 +4,66 @@ import pytest from os import path +from shutil import copyfile from nwtools import cmpFiles -from nwdummy import DummyMain -from nw.config import Config from nw.core.project import NWProject from nw.core.index import NWIndex from nw.constants import nwItemClass -theConf = Config() -theMain = DummyMain() -theMain.mainConf = theConf - -theProject = NWProject(theMain) -theProject.projTree.setSeed(42) - @pytest.mark.project -def testProjectNewMinimal(nwTempProj, nwRef, nwTemp): - projFile = path.join(nwTempProj, "nwProject.nwx") +def testProjectNewOpenSave(nwFuncTemp, nwTempProj, nwRef, nwTemp, nwDummy): + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempProj, "1_nwProject.nwx") refFile = path.join(nwRef, "proj", "1_nwProject.nwx") - assert theConf.initConfig(nwRef, nwTemp) - assert theProject.newProject({"projPath": nwTempProj}) - assert theProject.setProjectPath(nwTempProj) + + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + + assert theProject.newProject({"projPath": nwFuncTemp}) + assert theProject.setProjectPath(nwFuncTemp) assert theProject.saveProject() assert theProject.closeProject() - assert cmpFiles(projFile, refFile, [2, 6, 7, 8]) -@pytest.mark.project -def testProjectOpen(nwTempProj): - projFile = path.join(nwTempProj, "nwProject.nwx") + # Check the new project + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) + + # Open again assert theProject.openProject(projFile) -@pytest.mark.project -def testProjectSave(nwTempProj, nwRef): - projFile = path.join(nwTempProj, "nwProject.nwx") - refFile = path.join(nwRef, "proj", "1_nwProject.nwx") + # Save and close assert theProject.saveProject() assert theProject.closeProject() - assert cmpFiles(projFile, refFile, [2, 6, 7, 8]) + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) assert not theProject.projChanged -@pytest.mark.project -def testProjectOpenTwice(nwTempProj, nwRef): - projFile = path.join(nwTempProj, "nwProject.nwx") - refFile = path.join(nwRef, "proj", "1_nwProject.nwx") + # Open a second time assert theProject.openProject(projFile) assert not theProject.openProject(projFile) assert theProject.openProject(projFile, overrideLock=True) assert theProject.saveProject() assert theProject.closeProject() - assert cmpFiles(projFile, refFile, [2, 6, 7, 8]) + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) @pytest.mark.project -def testProjectNewRoot(nwTempProj, nwRef): - projFile = path.join(nwTempProj, "nwProject.nwx") +def testProjectNewRoot(nwFuncTemp, nwTempProj, nwRef, nwDummy): + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempProj, "2_nwProject.nwx") refFile = path.join(nwRef, "proj", "2_nwProject.nwx") + + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + + assert theProject.newProject({"projPath": nwFuncTemp}) + assert theProject.setProjectPath(nwFuncTemp) + assert theProject.saveProject() + assert theProject.closeProject() assert theProject.openProject(projFile) + assert isinstance(theProject.newRoot("Novel", nwItemClass.NOVEL), type(None)) assert isinstance(theProject.newRoot("Plot", nwItemClass.PLOT), type(None)) assert isinstance(theProject.newRoot("Character", nwItemClass.CHARACTER), type(None)) @@ -69,31 +72,48 @@ def testProjectNewRoot(nwTempProj, nwRef): assert isinstance(theProject.newRoot("Object", nwItemClass.OBJECT), str) assert isinstance(theProject.newRoot("Custom1", nwItemClass.CUSTOM), str) assert isinstance(theProject.newRoot("Custom2", nwItemClass.CUSTOM), str) + assert theProject.projChanged assert theProject.saveProject() assert theProject.closeProject() - assert cmpFiles(projFile, refFile, [2, 6, 7, 8]) + + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) assert not theProject.projChanged @pytest.mark.project -def testProjectNewFile(nwTempProj, nwRef): - projFile = path.join(nwTempProj, "nwProject.nwx") +def testProjectNewFile(nwFuncTemp, nwTempProj, nwRef, nwDummy): + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempProj, "3_nwProject.nwx") refFile = path.join(nwRef, "proj", "3_nwProject.nwx") + + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + + assert theProject.newProject({"projPath": nwFuncTemp}) + assert theProject.setProjectPath(nwFuncTemp) + assert theProject.saveProject() + assert theProject.closeProject() assert theProject.openProject(projFile) - assert isinstance(theProject.newFile("Hello", nwItemClass.NOVEL, "73475cb40a568"), str) + + assert isinstance(theProject.newFile("Hello", nwItemClass.NOVEL, "31489056e0916"), str) assert isinstance(theProject.newFile("Jane", nwItemClass.CHARACTER, "71ee45a3c0db9"), str) assert theProject.projChanged assert theProject.saveProject() assert theProject.closeProject() - assert cmpFiles(projFile, refFile, [2, 6, 7, 8]) + + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) assert not theProject.projChanged @pytest.mark.project -def testIndexScanThis(nwTempProj): - projFile = path.join(nwTempProj, "nwProject.nwx") - assert theProject.openProject(projFile) +def testIndexScanThis(nwMinimal, nwDummy): - theIndex = NWIndex(theProject, theMain) + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + assert theProject.openProject(nwMinimal) + + theIndex = NWIndex(theProject, nwDummy) isValid, theBits, thePos = theIndex.scanThis("tag: this, and this") assert not isValid @@ -135,15 +155,17 @@ def testIndexScanThis(nwTempProj): assert theProject.closeProject() @pytest.mark.project -def testIndexCheckThese(nwTempProj): - projFile = path.join(nwTempProj, "nwProject.nwx") - assert theProject.openProject(projFile) +def testIndexCheckThese(nwMinimal, nwDummy): - theIndex = NWIndex(theProject, theMain) - nHandle = "0e17daca5f3e1" - nItem = theProject.projTree[nHandle] - cHandle = "02d20bbd7e394" - cItem = theProject.projTree[cHandle] + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + assert theProject.openProject(nwMinimal) + + theIndex = NWIndex(theProject, nwDummy) + nHandle = theProject.newFile("Hello", nwItemClass.NOVEL, "a508bb932959c") + cHandle = theProject.newFile("Jane", nwItemClass.CHARACTER, "afb3043c7b2b3") + nItem = theProject.projTree[nHandle] + cItem = theProject.projTree[cHandle] assert theIndex.scanText(cHandle, ( "# Jane Smith\n" @@ -153,7 +175,7 @@ def testIndexCheckThese(nwTempProj): "# Hello World!\n" "@pov: Jane" )) - assert str(theIndex.tagIndex) == "{'Jane': [2, '02d20bbd7e394', 'CHARACTER', 'T000001']}" + assert str(theIndex.tagIndex) == "{'Jane': [2, '%s', 'CHARACTER', 'T000001']}" % cHandle assert theIndex.novelIndex[nHandle]["T000001"]["title"] == "Hello World!" assert str(theIndex.checkThese(["@tag", "Jane"], cItem)) == "[True, True]" @@ -168,13 +190,15 @@ def testIndexCheckThese(nwTempProj): assert theProject.closeProject() @pytest.mark.project -def testIndexMeta(nwTempProj): - projFile = path.join(nwTempProj, "nwProject.nwx") - assert theProject.openProject(projFile) +def testIndexMeta(nwMinimal, nwDummy): - theIndex = NWIndex(theProject, theMain) - nHandle = "0e17daca5f3e1" - cHandle = "02d20bbd7e394" + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + assert theProject.openProject(nwMinimal) + + theIndex = NWIndex(theProject, nwDummy) + nHandle = theProject.newFile("Hello", nwItemClass.NOVEL, "a508bb932959c") + cHandle = theProject.newFile("Jane", nwItemClass.CHARACTER, "afb3043c7b2b3") assert theIndex.scanText(cHandle, ( "# Jane Smith\n" @@ -191,11 +215,11 @@ def testIndexMeta(nwTempProj): "\n" "Well, not really.\n" )) - assert str(theIndex.tagIndex) == "{'Jane': [2, '02d20bbd7e394', 'CHARACTER', 'T000001']}" + assert str(theIndex.tagIndex) == "{'Jane': [2, '%s', 'CHARACTER', 'T000001']}" % cHandle assert theIndex.novelIndex[nHandle]["T000001"]["title"] == "Hello World!" # The novel structure should contain the pointer to the novel file header - assert str(theIndex.getNovelStructure()) == "['0e17daca5f3e1:T000001']" + assert str(theIndex.getNovelStructure()) == "['%s:T000001']" % nHandle # The novel file should have the correct counts cC, wC, pC = theIndex.getCounts(nHandle) @@ -210,21 +234,22 @@ def testIndexMeta(nwTempProj): # The character file should have a record of the reference from the novel file theRefs = theIndex.getBackReferenceList(cHandle) - assert str(theRefs) == "{'0e17daca5f3e1': 'T000001'}" + assert str(theRefs) == "{'%s': 'T000001'}" % nHandle assert theProject.closeProject() -# The two following tests must be at the end as they mess up the config object -# and the handle seed. They go into their own folders, but use the same project -# object as the test above. - @pytest.mark.project -def testProjectNewCustom(nwTempCustom, nwRef, nwTemp): +def testProjectNewCustom(nwFuncTemp, nwTempProj, nwRef, nwDummy): + + projFile = path.join(nwFuncTemp, "nwProject.nwx") + testFile = path.join(nwTempProj, "4_nwProject.nwx") + refFile = path.join(nwRef, "proj", "4_nwProject.nwx") + projData = { "projName": "Test Custom", "projTitle": "Test Novel", "projAuthors": "Jane Doe\nJohn Doh\n", - "projPath": nwTempCustom, + "projPath": nwFuncTemp, "popSample": False, "popMinimal": False, "popCustom": True, @@ -240,29 +265,33 @@ def testProjectNewCustom(nwTempCustom, nwRef, nwTemp): "numScenes": 3, "chFolders": True, } - theProject.mainConf = theConf + theProject = NWProject(nwDummy) theProject.projTree.setSeed(42) + assert theProject.newProject(projData) assert theProject.saveProject() assert theProject.closeProject() - projFile = path.join(nwTempCustom, "nwProject.nwx") - refFile = path.join(nwRef, "proj", "4_nwProject.nwx") - assert cmpFiles(projFile, refFile, [2, 6, 7, 8]) + + copyfile(projFile, testFile) + assert cmpFiles(testFile, refFile, [2, 6, 7, 8]) @pytest.mark.project -def testProjectNewSample(nwTempSample, nwLipsum, nwRef, nwTemp): +def testProjectNewSample(nwFuncTemp, nwRef, nwConf, nwDummy): projData = { "projName": "Test Sample", "projTitle": "Test Novel", "projAuthors": "Jane Doe\nJohn Doh\n", - "projPath": nwTempSample, + "projPath": nwFuncTemp, "popSample": True, "popMinimal": False, "popCustom": False, } - theProject.mainConf = theConf + theProject = NWProject(nwDummy) + theProject.projTree.setSeed(42) + theProject.mainConf = nwConf + assert theProject.newProject(projData) - assert theProject.openProject(nwTempSample) + assert theProject.openProject(nwFuncTemp) assert theProject.projName == "Sample Project" assert theProject.saveProject() assert theProject.closeProject()