import base64 import hashlib import json from pathlib import Path import struct import tempfile import unittest from unittest.mock import patch from local_translator.benchmark import write_json from local_translator.tomie import STATE, append_managed_records, atomic_copy, digest, inside, install, original_sources, patch_catalog, patch_lock, restore, rewrite_dictionary class DictionaryTests(unittest.TestCase): def test_missing_runtime_graphics_labels_are_added_as_managed_records(self): key = "Naninovel.UI.GameSettingsGraphicsDropdown.GraphicOption5" result = append_managed_records("Key: Value\r\n", {key: "Очень высокое"}) self.assertEqual(result, f"Key: Value\r\n{key}: Очень высокое\r\n") with self.assertRaises(ValueError): append_managed_records(result, {key: "Duplicate"}) with self.assertRaises(ValueError): append_managed_records("Key: Value", {key: "A\nB"}) def test_preserves_keys_whitespace_comments_and_crlf(self): source = '; comment\r\nMenu.Load: LOAD\r\nOther: value: extra\r\n' result = rewrite_dictionary(source, {"Menu.Load": "ЗАГРУЗИТЬ"}) self.assertEqual(result, '; comment\r\nMenu.Load: ЗАГРУЗИТЬ\r\nOther: value: extra\r\n') def test_unknown_duplicate_and_multiline_values_rejected(self): for source, replacements in [("Key: A", {"Other": "B"}), ("Key: A\nKey: B", {"Key": "В"}), ("Key: A", {"Key": "А\nБ"})]: with self.assertRaises(ValueError): rewrite_dictionary(source, replacements) def test_catalog_offsets_preserved_and_crc_actually_updated(self): old_hash, new_hash = "a" * 32, "b" * 32 record = json.dumps({"m_Hash": old_hash, "m_Crc": 2659166264, "m_BundleSize": 37229646}, separators=(",", ":")).encode("utf-16-le") payload = b"header" + struct.pack("