# -*- coding: utf-8 -*- """novelWriter Spell Check Class Tester """ import os import sys import pytest 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