Add dialogue parser test coverage
This commit is contained in:
@@ -26,7 +26,7 @@ import pytest
|
|||||||
|
|
||||||
from novelwriter import CONFIG
|
from novelwriter import CONFIG
|
||||||
from novelwriter.constants import nwUnicode
|
from novelwriter.constants import nwUnicode
|
||||||
from novelwriter.text.patterns import REGEX_PATTERNS
|
from novelwriter.text.patterns import REGEX_PATTERNS, DialogParser
|
||||||
|
|
||||||
|
|
||||||
def allMatches(regEx: re.Pattern, text: str) -> list[list[str]]:
|
def allMatches(regEx: re.Pattern, text: str) -> list[list[str]]:
|
||||||
@@ -267,6 +267,10 @@ def testTextPatterns_ShortcodesValue():
|
|||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testTextPatterns_DialogueStyle():
|
def testTextPatterns_DialogueStyle():
|
||||||
"""Test the dialogue style pattern regexes."""
|
"""Test the dialogue style pattern regexes."""
|
||||||
|
# Before set, the regex is None
|
||||||
|
CONFIG.dialogStyle = 0
|
||||||
|
assert REGEX_PATTERNS.dialogStyle is None
|
||||||
|
|
||||||
# Set the config
|
# Set the config
|
||||||
CONFIG.fmtSQuoteOpen = nwUnicode.U_LSQUO
|
CONFIG.fmtSQuoteOpen = nwUnicode.U_LSQUO
|
||||||
CONFIG.fmtSQuoteClose = nwUnicode.U_RSQUO
|
CONFIG.fmtSQuoteClose = nwUnicode.U_RSQUO
|
||||||
@@ -280,6 +284,7 @@ def testTextPatterns_DialogueStyle():
|
|||||||
|
|
||||||
CONFIG.allowOpenDial = False
|
CONFIG.allowOpenDial = False
|
||||||
regEx = REGEX_PATTERNS.dialogStyle
|
regEx = REGEX_PATTERNS.dialogStyle
|
||||||
|
assert regEx is not None
|
||||||
|
|
||||||
# Defined single quotes are recognised
|
# Defined single quotes are recognised
|
||||||
assert allMatches(regEx, "one \u2018two\u2019 three") == [
|
assert allMatches(regEx, "one \u2018two\u2019 three") == [
|
||||||
@@ -305,6 +310,7 @@ def testTextPatterns_DialogueStyle():
|
|||||||
|
|
||||||
CONFIG.allowOpenDial = True
|
CONFIG.allowOpenDial = True
|
||||||
regEx = REGEX_PATTERNS.dialogStyle
|
regEx = REGEX_PATTERNS.dialogStyle
|
||||||
|
assert regEx is not None
|
||||||
|
|
||||||
# Defined single quotes are recognised also when open
|
# Defined single quotes are recognised also when open
|
||||||
assert allMatches(regEx, "one \u2018two three") == [
|
assert allMatches(regEx, "one \u2018two three") == [
|
||||||
@@ -320,19 +326,19 @@ def testTextPatterns_DialogueStyle():
|
|||||||
@pytest.mark.core
|
@pytest.mark.core
|
||||||
def testTextPatterns_DialogueSpecial():
|
def testTextPatterns_DialogueSpecial():
|
||||||
"""Test the special dialogue style pattern regexes."""
|
"""Test the special dialogue style pattern regexes."""
|
||||||
# Set the config
|
# Before set, the regex is None
|
||||||
CONFIG.fmtSQuoteOpen = nwUnicode.U_LSQUO
|
CONFIG.altDialogOpen = ""
|
||||||
CONFIG.fmtSQuoteClose = nwUnicode.U_RSQUO
|
CONFIG.altDialogClose = ""
|
||||||
CONFIG.fmtDQuoteOpen = nwUnicode.U_LDQUO
|
assert REGEX_PATTERNS.altDialogStyle is None
|
||||||
CONFIG.fmtDQuoteClose = nwUnicode.U_RDQUO
|
|
||||||
|
|
||||||
CONFIG.dialogStyle = 3
|
# Set the config
|
||||||
CONFIG.altDialogOpen = "::"
|
CONFIG.altDialogOpen = "::"
|
||||||
CONFIG.altDialogClose = "::"
|
CONFIG.altDialogClose = "::"
|
||||||
|
|
||||||
# Alternative Dialogue
|
# Alternative Dialogue
|
||||||
# ====================
|
# ====================
|
||||||
regEx = REGEX_PATTERNS.altDialogStyle
|
regEx = REGEX_PATTERNS.altDialogStyle
|
||||||
|
assert regEx is not None
|
||||||
|
|
||||||
# With no padding
|
# With no padding
|
||||||
assert allMatches(regEx, "one ::two:: three") == [
|
assert allMatches(regEx, "one ::two:: three") == [
|
||||||
@@ -343,3 +349,106 @@ def testTextPatterns_DialogueSpecial():
|
|||||||
assert allMatches(regEx, "one :: two :: three") == [
|
assert allMatches(regEx, "one :: two :: three") == [
|
||||||
[(":: two ::", 4, 13)]
|
[(":: two ::", 4, 13)]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.core
|
||||||
|
def testTextPatterns_DialogParserEnglish():
|
||||||
|
"""Test the dialog parser with English settings."""
|
||||||
|
# Set the config
|
||||||
|
CONFIG.dialogStyle = 3
|
||||||
|
CONFIG.fmtSQuoteOpen = nwUnicode.U_LSQUO
|
||||||
|
CONFIG.fmtSQuoteClose = nwUnicode.U_RSQUO
|
||||||
|
CONFIG.fmtDQuoteOpen = nwUnicode.U_LDQUO
|
||||||
|
CONFIG.fmtDQuoteClose = nwUnicode.U_RDQUO
|
||||||
|
|
||||||
|
parser = DialogParser()
|
||||||
|
parser.initParser()
|
||||||
|
|
||||||
|
# Positions: 0 18
|
||||||
|
assert parser("“Simple dialogue.”") == [
|
||||||
|
(0, 18),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Positions: 0 18
|
||||||
|
assert parser("“Simple dialogue,” argued John.") == [
|
||||||
|
(0, 18),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Positions: 0 18 32 56
|
||||||
|
assert parser("“Simple dialogue,” argued John, “is not always so easy.”") == [
|
||||||
|
(0, 18), (32, 56),
|
||||||
|
]
|
||||||
|
|
||||||
|
# With Narrator breaks
|
||||||
|
CONFIG.dialogLine = ""
|
||||||
|
CONFIG.narratorBreak = nwUnicode.U_EMDASH
|
||||||
|
parser.initParser()
|
||||||
|
|
||||||
|
# Positions: 0 18 34 58
|
||||||
|
assert parser("“Simple dialogue, — argued John, — is not always so easy.”") == [
|
||||||
|
(0, 18), (34, 58),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.core
|
||||||
|
def testTextPatterns_DialogParserSpanish():
|
||||||
|
"""Test the dialog parser with Spanish settings."""
|
||||||
|
# Set the config
|
||||||
|
CONFIG.dialogStyle = 3
|
||||||
|
CONFIG.fmtSQuoteOpen = nwUnicode.U_LSAQUO
|
||||||
|
CONFIG.fmtSQuoteClose = nwUnicode.U_RSAQUO
|
||||||
|
CONFIG.fmtDQuoteOpen = nwUnicode.U_LAQUO
|
||||||
|
CONFIG.fmtDQuoteClose = nwUnicode.U_RAQUO
|
||||||
|
CONFIG.dialogLine = nwUnicode.U_EMDASH + nwUnicode.U_RAQUO
|
||||||
|
CONFIG.narratorBreak = nwUnicode.U_EMDASH
|
||||||
|
|
||||||
|
parser = DialogParser()
|
||||||
|
parser.initParser()
|
||||||
|
|
||||||
|
# Positions: 0 18 54 70
|
||||||
|
assert parser("—No te preocupes. —Cerró la puerta y salió corriendo—. Volveré pronto.") == [
|
||||||
|
(0, 18), (54, 70),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Positions: 0 14
|
||||||
|
assert parser("«Tengo hambre», pensó Pedro.") == [
|
||||||
|
(0, 14),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Positions: 0 16
|
||||||
|
assert parser("—Puedes hacerlo —le dije y pensé «pero te costará mucho trabajo».") == [
|
||||||
|
(0, 16),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.core
|
||||||
|
def testTextPatterns_DialogParserAlternating():
|
||||||
|
"""Test the dialog parser with alternating dialogue/narration like
|
||||||
|
for Portuguese and Polish.
|
||||||
|
"""
|
||||||
|
# Set the config
|
||||||
|
CONFIG.dialogStyle = 0
|
||||||
|
CONFIG.fmtSQuoteOpen = nwUnicode.U_LSAQUO
|
||||||
|
CONFIG.fmtSQuoteClose = nwUnicode.U_RSAQUO
|
||||||
|
CONFIG.fmtDQuoteOpen = nwUnicode.U_LAQUO
|
||||||
|
CONFIG.fmtDQuoteClose = nwUnicode.U_RAQUO
|
||||||
|
CONFIG.dialogLine = ""
|
||||||
|
CONFIG.narratorBreak = nwUnicode.U_EMDASH
|
||||||
|
|
||||||
|
parser = DialogParser()
|
||||||
|
parser.initParser()
|
||||||
|
|
||||||
|
# Positions: 0 21
|
||||||
|
assert parser("— Está ficando tarde.") == [
|
||||||
|
(0, 21),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Positions: 0 12
|
||||||
|
assert parser("— Ainda não — ela responde.") == [
|
||||||
|
(0, 12),
|
||||||
|
]
|
||||||
|
|
||||||
|
# Positions: 0 12 28 49
|
||||||
|
assert parser("— Tudo bem? — ele pergunta. — Você falou com ele?") == [
|
||||||
|
(0, 12), (28, 49),
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user