Files
2026-09-17 22:59:47 +03:00

85 lines
4.2 KiB
Python

"""Генератор launcher Lua не должен менять вложенность событий/сигнатуры."""
from pathlib import Path
import sys
import tempfile
import unittest
import xml.etree.ElementTree as ET
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT / 'toolchain'))
from sdbg_launcher import disk_entries, lua_script, write_keyboard_config
from mame_profile import MameProfile
class LauncherTests(unittest.TestCase):
def test_mame_profile_prefers_sprinter_and_keeps_legacy_binary(self):
with tempfile.TemporaryDirectory() as directory:
home = Path(directory).resolve()
legacy = home / 'mame.arm'
legacy.touch()
self.assertEqual(MameProfile.resolve({'MAME_HOME': directory,
'MAME_BIN': ''}).binary, legacy)
modern = home / 'sprinter'
modern.touch()
self.assertEqual(MameProfile.resolve({'MAME_HOME': directory,
'MAME_BIN': ''}).binary, modern)
self.assertEqual(MameProfile.resolve({'MAME_HOME': directory,
'MAME_BIN': str(legacy)}).binary,
legacy)
def test_lua_tables_have_expected_shape(self):
with tempfile.TemporaryDirectory() as directory:
path = Path(directory) / 'launch.lua'
lua_script(path, Path(directory)/'ready.json', 0x8100, b'\x21\x42',
[(0.0, ':kbd:test', 4, 1)], 0)
text = path.read_text()
self.assertIn('local events={{0.0,":kbd:test",4,1}}', text)
self.assertIn('local signature={33,66}', text)
self.assertIn('local function dss_prompt_row()', text)
self.assertNotIn('local events={{{', text)
self.assertNotIn('local signature={{', text)
def test_disk_entries_reject_missing_and_83_collision(self):
with tempfile.TemporaryDirectory() as directory:
root=Path(directory)
exe=root/'program-long.exe';exe.write_bytes(b'x')
duplicate=root/'program-last.exe';duplicate.write_bytes(b'y')
with self.assertRaisesRegex(ValueError,'8.3'):
disk_entries(exe,[duplicate])
with self.assertRaisesRegex(ValueError,'Не найден'):
disk_entries(exe,[root/'missing.dat'])
def test_isolated_config_enables_both_sprinter_keyboards(self):
with tempfile.TemporaryDirectory() as directory:
write_keyboard_config(Path(directory))
root = ET.parse(Path(directory)/'sprinter.cfg').getroot()
self.assertEqual(root.attrib['version'], '10')
self.assertEqual(root.find('system').attrib['name'], 'sprinter')
keyboards = {item.attrib['tag']: item.attrib['enabled']
for item in root.findall('./system/input/keyboard')}
self.assertEqual(keyboards, {':': '1', ':kbd:ms_naturl': '1'})
def test_existing_config_is_merged_not_replaced(self):
with tempfile.TemporaryDirectory() as directory:
path = Path(directory)/'sprinter.cfg'
path.write_text('\ufeff<?xml version="1.0"?>\n<mameconfig version="10">'
'<system name="sprinter"><input>'
'<keyboard tag=":" enabled="0" />'
'<port tag=":TURBO" type="OTHER" mask="1" defvalue="0" value="1" />'
'</input><video><target index="0" /></video>'
'</system></mameconfig>', encoding='utf-8')
write_keyboard_config(Path(directory))
root = ET.parse(path).getroot()
system = root.find('system')
self.assertEqual([item.tag for item in system.find('input')],
['keyboard', 'keyboard', 'port'])
keyboards = {item.attrib['tag']: item.attrib['enabled']
for item in system.findall('input/keyboard')}
self.assertEqual(keyboards, {':': '1', ':kbd:ms_naturl': '1'})
self.assertEqual(system.find('input/port').attrib['value'], '1')
self.assertIsNotNone(system.find('video/target'))
if __name__ == '__main__':
unittest.main()