Files
Text-Texture-Generator-for-…/test_preset_unicode.py
2025-08-11 14:40:14 +07:00

150 lines
5.0 KiB
Python

#!/usr/bin/env python3
"""
Test script to verify that preset names with Unicode characters like 'ö' work correctly.
This script tests the validation logic outside of Blender.
"""
import re
import json
import os
import tempfile
def test_preset_name_validation():
"""Test the new preset name validation regex"""
# Test cases with expected results
test_cases = [
# Valid names (should pass)
("Test Preset", True),
("Mein schönes Preset", True), # German with ö
("Préférence française", True), # French with accents
("Configuración español", True), # Spanish with ñ
("Test_123", True),
("Hello-World", True),
("Тест", True), # Cyrillic
("テスト", True), # Japanese
("测试", True), # Chinese
# Invalid names (should fail)
("Test<Preset", False), # Contains <
("Test>Preset", False), # Contains >
("Test:Preset", False), # Contains :
("Test\"Preset", False), # Contains "
("Test|Preset", False), # Contains |
("Test?Preset", False), # Contains ?
("Test*Preset", False), # Contains *
("Test/Preset", False), # Contains /
("Test\\Preset", False), # Contains \
("", False), # Empty string
]
print("Testing preset name validation...")
for preset_name, should_pass in test_cases:
# Test the Unicode regex pattern
unicode_pattern_match = bool(re.match(r'^[\w\s\-]+$', preset_name, re.UNICODE))
# Test filesystem-unsafe characters
invalid_chars = ['<', '>', ':', '"', '|', '?', '*', '/', '\\']
has_invalid_chars = any(char in preset_name for char in invalid_chars)
# Combined validation (same as in the actual code)
validation_passes = unicode_pattern_match and not has_invalid_chars and preset_name.strip()
status = "✅ PASS" if validation_passes == should_pass else "❌ FAIL"
print(f"{status}: '{preset_name}' -> Expected: {should_pass}, Got: {validation_passes}")
if validation_passes != should_pass:
print(f" Unicode match: {unicode_pattern_match}, Has invalid chars: {has_invalid_chars}")
def test_json_serialization():
"""Test that Unicode characters work correctly with JSON serialization/deserialization"""
print("\nTesting JSON serialization with Unicode characters...")
test_data = {
'name': 'Schönes Preset',
'text': 'Höllö Wörld',
'texture_width': 1024,
'texture_height': 1024,
'font_size': 96
}
try:
# Test JSON encoding/decoding
json_str = json.dumps(test_data, indent=2, ensure_ascii=False)
decoded_data = json.loads(json_str)
print("✅ JSON serialization successful")
print(f"Original name: {test_data['name']}")
print(f"Decoded name: {decoded_data['name']}")
print(f"Names match: {test_data['name'] == decoded_data['name']}")
# Test file I/O
with tempfile.NamedTemporaryFile(mode='w', suffix='.json', delete=False) as f:
json.dump(test_data, f, indent=2, ensure_ascii=False)
temp_file = f.name
with open(temp_file, 'r', encoding='utf-8') as f:
file_data = json.load(f)
os.unlink(temp_file)
print("✅ File I/O successful")
print(f"File data name: {file_data['name']}")
print(f"File names match: {test_data['name'] == file_data['name']}")
except Exception as e:
print(f"❌ JSON serialization failed: {e}")
def test_filesystem_compatibility():
"""Test creating files with Unicode names"""
print("\nTesting filesystem compatibility...")
test_names = [
"schönes_preset",
"café_preset",
"naïve_preset",
"test_ñ_preset"
]
temp_dir = tempfile.mkdtemp()
print(f"Testing in directory: {temp_dir}")
for name in test_names:
try:
filename = f"{name}.json"
filepath = os.path.join(temp_dir, filename)
# Create file
with open(filepath, 'w', encoding='utf-8') as f:
json.dump({'name': name}, f, ensure_ascii=False)
# Read file back
with open(filepath, 'r', encoding='utf-8') as f:
data = json.load(f)
# Clean up
os.unlink(filepath)
print(f"{name}: File created and read successfully")
except Exception as e:
print(f"{name}: Failed - {e}")
# Clean up temp directory
os.rmdir(temp_dir)
if __name__ == "__main__":
print("=" * 60)
print("Testing Text Texture Generator Preset Unicode Support")
print("=" * 60)
test_preset_name_validation()
test_json_serialization()
test_filesystem_compatibility()
print("\n" + "=" * 60)
print("Test completed! Check results above.")
print("=" * 60)