173 lines
5.0 KiB
Python
173 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""novelWriter Spell Check Class Tester
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import pytest
|
|
|
|
from difflib import get_close_matches
|
|
|
|
from dummy import causeOSError
|
|
from tools import readFile, writeFile
|
|
|
|
from nw.core.spellcheck import NWSpellCheck, NWSpellEnchant, NWSpellSimple
|
|
from nw.constants import nwConst
|
|
|
|
@pytest.mark.core
|
|
def testCoreSpell_Super(monkeypatch, tmpDir, tmpConf):
|
|
"""Test the spell checker super class
|
|
"""
|
|
wList = os.path.join(tmpDir, "wordlist.txt")
|
|
writeFile(wList, "a_word\nb_word\nc_word\n")
|
|
|
|
spChk = NWSpellCheck()
|
|
spChk.mainConf = tmpConf
|
|
|
|
# Check that dummy functions return results that reflects that spell
|
|
# checking is effectively disabled
|
|
assert spChk.setLanguage("", "") is None
|
|
assert spChk.checkWord("")
|
|
assert spChk.suggestWords("") == []
|
|
assert spChk.listDictionaries() == []
|
|
assert spChk.describeDict() == ("", "")
|
|
|
|
# Check language info
|
|
assert NWSpellCheck.expandLanguage("en") == "English"
|
|
assert NWSpellCheck.expandLanguage("en_GB") == "English (GB)"
|
|
|
|
# Add a word to the user's dictionary
|
|
assert spChk._readProjectDictionary("dummy") is False
|
|
monkeypatch.setattr("builtins.open", causeOSError)
|
|
assert spChk._readProjectDictionary(wList) is False
|
|
monkeypatch.undo()
|
|
assert spChk._readProjectDictionary(wList) is True
|
|
assert spChk.projectDict == wList
|
|
|
|
# Cannot write to file
|
|
monkeypatch.setattr("builtins.open", causeOSError)
|
|
assert spChk.addWord("d_word") is False
|
|
monkeypatch.undo()
|
|
assert readFile(wList) == "a_word\nb_word\nc_word\n"
|
|
|
|
# First time, OK
|
|
assert spChk.addWord("d_word") is True
|
|
assert readFile(wList) == "a_word\nb_word\nc_word\nd_word\n"
|
|
|
|
# But not added twice
|
|
assert spChk.addWord("d_word") is False
|
|
assert readFile(wList) == "a_word\nb_word\nc_word\nd_word\n"
|
|
|
|
# END Test testCoreSpell_Super
|
|
|
|
@pytest.mark.core
|
|
def testCoreSpell_Enchant(monkeypatch, tmpDir, tmpConf):
|
|
"""Test the pyenchant spell checker
|
|
"""
|
|
wList = os.path.join(tmpDir, "wordlist.txt")
|
|
writeFile(wList, "a_word\nb_word\nc_word\n")
|
|
|
|
# Block the enchant package (and trigger the dummy class)
|
|
monkeypatch.setitem(sys.modules, "enchant", None)
|
|
spChk = NWSpellEnchant()
|
|
|
|
spChk.setLanguage("en", wList)
|
|
assert spChk.setLanguage("", "") is None
|
|
assert spChk.checkWord("")
|
|
assert spChk.suggestWords("") == []
|
|
assert spChk.listDictionaries() == []
|
|
assert spChk.describeDict() == ("", "")
|
|
|
|
monkeypatch.undo()
|
|
|
|
# Load the proper enchant package
|
|
spChk = NWSpellEnchant()
|
|
spChk.mainConf = tmpConf
|
|
spChk.setLanguage("en", wList)
|
|
|
|
assert spChk.checkWord("a_word")
|
|
assert spChk.checkWord("b_word")
|
|
assert spChk.checkWord("c_word")
|
|
assert not spChk.checkWord("d_word")
|
|
|
|
spChk.addWord("d_word")
|
|
assert spChk.checkWord("d_word")
|
|
|
|
wSuggest = spChk.suggestWords("wrod")
|
|
assert len(wSuggest) > 0
|
|
assert "word" in wSuggest
|
|
|
|
dList = spChk.listDictionaries()
|
|
assert len(dList) > 0
|
|
|
|
aTag, aName = spChk.describeDict()
|
|
assert aTag == "en"
|
|
assert aName != ""
|
|
|
|
# END Test testCoreSpell_Enchant
|
|
|
|
@pytest.mark.core
|
|
def testCoreSpell_Simple(monkeypatch, tmpDir, tmpConf):
|
|
"""Test the fallback simple spell checker
|
|
"""
|
|
wList = os.path.join(tmpDir, "wordlist.txt")
|
|
wDict = os.path.join(tmpDir, "en.dict")
|
|
writeFile(wList, "a_word\nb_word\nc_word\n")
|
|
writeFile(wDict, "# Comment\ne_word\nf_word\ng_word\n")
|
|
|
|
spChk = NWSpellSimple()
|
|
spChk.mainConf = tmpConf
|
|
spChk.mainConf.dictPath = tmpDir
|
|
|
|
# Load dictionary, but fail
|
|
monkeypatch.setattr("builtins.open", causeOSError)
|
|
spChk.setLanguage("en", wList)
|
|
assert spChk.spellLanguage is None
|
|
assert spChk.WORDS == spChk.projDict
|
|
monkeypatch.undo()
|
|
|
|
# Load dictionary properly
|
|
spChk.setLanguage("en", wList)
|
|
assert spChk.projDict == ["a_word", "b_word", "c_word"]
|
|
assert spChk.WORDS == ["e_word", "f_word", "g_word", "a_word", "b_word", "c_word"]
|
|
|
|
# Check words
|
|
assert spChk.checkWord("a_word")
|
|
assert spChk.checkWord("b_word")
|
|
assert spChk.checkWord("c_word")
|
|
assert not spChk.checkWord("d_word")
|
|
assert spChk.checkWord("e_word")
|
|
assert spChk.checkWord("f_word")
|
|
assert spChk.checkWord("g_word")
|
|
|
|
# Add word
|
|
spChk.addWord("d_word")
|
|
assert spChk.checkWord("d_word")
|
|
|
|
# Check spelling
|
|
assert spChk.suggestWords(" \t") == []
|
|
|
|
wSuggest = spChk.suggestWords("d_wrod")
|
|
assert len(wSuggest) > 0
|
|
assert "d_word" in wSuggest
|
|
|
|
# Break the matching
|
|
monkeypatch.setattr("difflib.get_close_matches", lambda *args, **kwargs: [""])
|
|
assert spChk.suggestWords("word") == []
|
|
monkeypatch.undo()
|
|
|
|
# Capitalisation
|
|
wSuggest = spChk.suggestWords("D_wrod")
|
|
assert len(wSuggest) > 0
|
|
assert "D_word" in wSuggest
|
|
|
|
# List dictionaries
|
|
assert spChk.listDictionaries() == [("en", "English [%s]" % nwConst.SP_INTERNAL)]
|
|
|
|
# Description
|
|
aTag, aName = spChk.describeDict()
|
|
assert aTag == "en"
|
|
assert aName == nwConst.SP_INTERNAL
|
|
|
|
# END Test testCoreSpell_Simple
|