- Add and enable a scoped multiline pattern for canEscape blocks - Add regression coverage for extraction and translation replacement
105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Regression tests for RPG Maker code-355/655 script patterns."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import copy
|
|
import os
|
|
import re
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
os.chdir(ROOT)
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
import modules.rpgmakermvmz as mvmz # noqa: E402
|
|
|
|
|
|
class TestMVMZScriptPatterns(unittest.TestCase):
|
|
def test_battle_manager_can_escape_pattern_definition(self):
|
|
regex, multiline = mvmz.PATTERNS_355655["if (BattleManager.canEscape())"]
|
|
|
|
self.assertEqual(
|
|
regex,
|
|
r'\$gameMessage\.add\(\s*"((?:\\.|[^"\\])*)"\s*\)',
|
|
)
|
|
self.assertTrue(multiline)
|
|
|
|
def test_battle_manager_can_escape_extracts_only_message_text(self):
|
|
regex, _ = mvmz.PATTERNS_355655["if (BattleManager.canEscape())"]
|
|
script = r'$gameMessage.add("この戦闘では逃げることはできない!")'
|
|
|
|
match = re.search(regex, script)
|
|
|
|
self.assertIsNotNone(match)
|
|
self.assertEqual(match.group(1), "この戦闘では逃げることはできない!")
|
|
|
|
def test_battle_manager_can_escape_multiline_integration(self):
|
|
source_message = "この戦闘では逃げることはできない!"
|
|
translated_message = "You cannot escape from this battle!"
|
|
page = {
|
|
"list": [
|
|
{
|
|
"code": 355,
|
|
"indent": 0,
|
|
"parameters": ["if (BattleManager.canEscape()) {"],
|
|
},
|
|
{
|
|
"code": 655,
|
|
"indent": 0,
|
|
"parameters": ["// このコメントは翻訳しない"],
|
|
},
|
|
{
|
|
"code": 655,
|
|
"indent": 0,
|
|
"parameters": [f'$gameMessage.add("{source_message}");'],
|
|
},
|
|
{
|
|
"code": 655,
|
|
"indent": 0,
|
|
"parameters": ['const command = "内部CBRコマンド";'],
|
|
},
|
|
{
|
|
"code": 655,
|
|
"indent": 0,
|
|
"parameters": ['const filename = "日本語画像.png";'],
|
|
},
|
|
{"code": 655, "indent": 0, "parameters": ["}"]},
|
|
]
|
|
}
|
|
captured = []
|
|
|
|
def translate(text, history, batch=False):
|
|
captured.append(copy.deepcopy(text))
|
|
if isinstance(text, list):
|
|
return [[translated_message for _ in text], [0, 0]]
|
|
return [translated_message, [0, 0]]
|
|
|
|
original_translate = mvmz.translateAI
|
|
original_code355655 = mvmz.CODE355655
|
|
original_enabled = mvmz.ENABLED_PATTERNS_355655
|
|
mvmz.translateAI = translate
|
|
mvmz.CODE355655 = True
|
|
mvmz.ENABLED_PATTERNS_355655 = {"if (BattleManager.canEscape())"}
|
|
try:
|
|
translated_page = copy.deepcopy(page)
|
|
mvmz.searchCodes(translated_page, None, [], "TestMap.json")
|
|
finally:
|
|
mvmz.translateAI = original_translate
|
|
mvmz.CODE355655 = original_code355655
|
|
mvmz.ENABLED_PATTERNS_355655 = original_enabled
|
|
|
|
self.assertEqual(captured, [[source_message]])
|
|
self.assertEqual(
|
|
translated_page["list"][2]["parameters"][0],
|
|
f'$gameMessage.add("{translated_message}");',
|
|
)
|
|
self.assertEqual(translated_page["list"][1], page["list"][1])
|
|
self.assertEqual(translated_page["list"][3], page["list"][3])
|
|
self.assertEqual(translated_page["list"][4], page["list"][4])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|