Add gdlint and gdformat scripts

This commit is contained in:
2025-09-27 20:40:13 +04:00
parent 86439abea8
commit 06f0f87970
40 changed files with 2314 additions and 732 deletions

View File

@@ -10,6 +10,7 @@ var settings_manager: Node
var original_settings: Dictionary
var temp_files: Array[String] = []
func _initialize():
# Wait for autoloads to initialize
await process_frame
@@ -20,6 +21,7 @@ func _initialize():
# Exit after tests complete
quit()
func run_tests():
TestHelper.print_test_header("SettingsManager")
@@ -49,26 +51,36 @@ func run_tests():
TestHelper.print_test_footer("SettingsManager")
func test_basic_functionality():
TestHelper.print_step("Basic Functionality")
# Test that SettingsManager has expected properties
TestHelper.assert_has_properties(settings_manager, ["settings", "default_settings", "languages_data"], "SettingsManager properties")
TestHelper.assert_has_properties(
settings_manager,
["settings", "default_settings", "languages_data"],
"SettingsManager properties"
)
# Test that SettingsManager has expected methods
var expected_methods = ["get_setting", "set_setting", "save_settings", "load_settings", "reset_settings_to_defaults"]
var expected_methods = [
"get_setting", "set_setting", "save_settings", "load_settings", "reset_settings_to_defaults"
]
TestHelper.assert_has_methods(settings_manager, expected_methods, "SettingsManager methods")
# Test default settings structure
var expected_defaults = ["master_volume", "music_volume", "sfx_volume", "language"]
for key in expected_defaults:
TestHelper.assert_has_key(settings_manager.default_settings, key, "Default setting key: " + key)
TestHelper.assert_has_key(
settings_manager.default_settings, key, "Default setting key: " + key
)
# Test getting settings
var master_volume = settings_manager.get_setting("master_volume")
TestHelper.assert_not_null(master_volume, "Can get master_volume setting")
TestHelper.assert_true(master_volume is float, "master_volume is float type")
func test_input_validation_security():
TestHelper.print_step("Input Validation Security")
@@ -94,7 +106,9 @@ func test_input_validation_security():
# Test valid volume range
var valid_volume = settings_manager.set_setting("master_volume", 0.5)
TestHelper.assert_true(valid_volume, "Valid volume values accepted")
TestHelper.assert_equal(0.5, settings_manager.get_setting("master_volume"), "Volume value set correctly")
TestHelper.assert_equal(
0.5, settings_manager.get_setting("master_volume"), "Volume value set correctly"
)
# Test string length validation for language
var long_language = "a".repeat(20) # Exceeds MAX_SETTING_STRING_LENGTH
@@ -109,11 +123,14 @@ func test_input_validation_security():
var valid_lang = settings_manager.set_setting("language", "en")
TestHelper.assert_true(valid_lang, "Valid language codes accepted")
func test_file_io_security():
TestHelper.print_step("File I/O Security")
# Test file size limits by creating oversized config
var oversized_config_path = TestHelper.create_temp_file("oversized_settings.cfg", "x".repeat(70000)) # > 64KB
var oversized_config_path = TestHelper.create_temp_file(
"oversized_settings.cfg", "x".repeat(70000)
) # > 64KB
temp_files.append(oversized_config_path)
# Test that normal save/load operations work
@@ -127,21 +144,30 @@ func test_file_io_security():
# Test that settings file exists after save
TestHelper.assert_file_exists("user://settings.cfg", "Settings file created after save")
func test_json_parsing_security():
TestHelper.print_step("JSON Parsing Security")
# Create invalid languages.json for testing
var invalid_json_path = TestHelper.create_temp_file("invalid_languages.json", TestHelper.create_invalid_json())
var invalid_json_path = TestHelper.create_temp_file(
"invalid_languages.json", TestHelper.create_invalid_json()
)
temp_files.append(invalid_json_path)
# Create oversized JSON file
var large_json_content = '{"languages": {"' + "x".repeat(70000) + '": "test"}}'
var oversized_json_path = TestHelper.create_temp_file("oversized_languages.json", large_json_content)
var oversized_json_path = TestHelper.create_temp_file(
"oversized_languages.json", large_json_content
)
temp_files.append(oversized_json_path)
# Test that SettingsManager handles invalid JSON gracefully
# This should fall back to default languages
TestHelper.assert_true(settings_manager.languages_data.has("languages"), "Default languages loaded on JSON parse failure")
TestHelper.assert_true(
settings_manager.languages_data.has("languages"),
"Default languages loaded on JSON parse failure"
)
func test_language_validation():
TestHelper.print_step("Language Validation")
@@ -164,6 +190,7 @@ func test_language_validation():
var null_result = settings_manager.set_setting("language", null)
TestHelper.assert_false(null_result, "Null language rejected")
func test_volume_validation():
TestHelper.print_step("Volume Validation")
@@ -171,16 +198,29 @@ func test_volume_validation():
for setting in volume_settings:
# Test boundary values
TestHelper.assert_true(settings_manager.set_setting(setting, 0.0), "Volume 0.0 accepted for " + setting)
TestHelper.assert_true(settings_manager.set_setting(setting, 1.0), "Volume 1.0 accepted for " + setting)
TestHelper.assert_true(
settings_manager.set_setting(setting, 0.0), "Volume 0.0 accepted for " + setting
)
TestHelper.assert_true(
settings_manager.set_setting(setting, 1.0), "Volume 1.0 accepted for " + setting
)
# Test out of range values
TestHelper.assert_false(settings_manager.set_setting(setting, -0.1), "Negative volume rejected for " + setting)
TestHelper.assert_false(settings_manager.set_setting(setting, 1.1), "Volume > 1.0 rejected for " + setting)
TestHelper.assert_false(
settings_manager.set_setting(setting, -0.1), "Negative volume rejected for " + setting
)
TestHelper.assert_false(
settings_manager.set_setting(setting, 1.1), "Volume > 1.0 rejected for " + setting
)
# Test invalid types
TestHelper.assert_false(settings_manager.set_setting(setting, "0.5"), "String volume rejected for " + setting)
TestHelper.assert_false(settings_manager.set_setting(setting, null), "Null volume rejected for " + setting)
TestHelper.assert_false(
settings_manager.set_setting(setting, "0.5"), "String volume rejected for " + setting
)
TestHelper.assert_false(
settings_manager.set_setting(setting, null), "Null volume rejected for " + setting
)
func test_error_handling_and_recovery():
TestHelper.print_step("Error Handling and Recovery")
@@ -198,12 +238,23 @@ func test_error_handling_and_recovery():
# Verify defaults are loaded
var default_volume = settings_manager.default_settings["master_volume"]
TestHelper.assert_equal(default_volume, settings_manager.get_setting("master_volume"), "Reset to defaults works correctly")
TestHelper.assert_equal(
default_volume,
settings_manager.get_setting("master_volume"),
"Reset to defaults works correctly"
)
# Test fallback language loading
TestHelper.assert_true(settings_manager.languages_data.has("languages"), "Fallback languages loaded")
TestHelper.assert_has_key(settings_manager.languages_data["languages"], "en", "English fallback language available")
TestHelper.assert_has_key(settings_manager.languages_data["languages"], "ru", "Russian fallback language available")
TestHelper.assert_true(
settings_manager.languages_data.has("languages"), "Fallback languages loaded"
)
TestHelper.assert_has_key(
settings_manager.languages_data["languages"], "en", "English fallback language available"
)
TestHelper.assert_has_key(
settings_manager.languages_data["languages"], "ru", "Russian fallback language available"
)
func test_reset_functionality():
TestHelper.print_step("Reset Functionality")
@@ -216,12 +267,21 @@ func test_reset_functionality():
settings_manager.reset_settings_to_defaults()
# Verify reset worked
TestHelper.assert_equal(settings_manager.default_settings["master_volume"], settings_manager.get_setting("master_volume"), "Volume reset to default")
TestHelper.assert_equal(settings_manager.default_settings["language"], settings_manager.get_setting("language"), "Language reset to default")
TestHelper.assert_equal(
settings_manager.default_settings["master_volume"],
settings_manager.get_setting("master_volume"),
"Volume reset to default"
)
TestHelper.assert_equal(
settings_manager.default_settings["language"],
settings_manager.get_setting("language"),
"Language reset to default"
)
# Test that reset saves automatically
TestHelper.assert_file_exists("user://settings.cfg", "Settings file exists after reset")
func test_performance_benchmarks():
TestHelper.print_step("Performance Benchmarks")
@@ -241,6 +301,7 @@ func test_performance_benchmarks():
settings_manager.set_setting("master_volume", 0.5)
TestHelper.end_performance_test("validation", 50.0, "100 validations within 50ms")
func cleanup_tests():
TestHelper.print_step("Cleanup")
@@ -253,4 +314,4 @@ func cleanup_tests():
for temp_file in temp_files:
TestHelper.cleanup_temp_file(temp_file)
TestHelper.assert_true(true, "Test cleanup completed")
TestHelper.assert_true(true, "Test cleanup completed")