extends SceneTree ## Test suite for SettingsManager ## ## Tests input validation, file I/O, and error handling. const TestHelper = preload("res://tests/helpers/TestHelper.gd") var settings_manager: Node var original_settings: Dictionary var temp_files: Array[String] = [] func _initialize(): # Wait for autoloads to initialize await process_frame await process_frame run_tests() # Exit after tests complete quit() func run_tests(): TestHelper.print_test_header("SettingsManager") # Get reference to SettingsManager settings_manager = root.get_node("SettingsManager") if not settings_manager: TestHelper.assert_true(false, "SettingsManager autoload not found") TestHelper.print_test_footer("SettingsManager") return # Store original settings for restoration original_settings = settings_manager.settings.duplicate(true) # Run test suites test_basic_functionality() test_input_validation_security() test_file_io_security() test_json_parsing_security() test_language_validation() test_volume_validation() test_error_handling_and_recovery() test_reset_functionality() test_performance_benchmarks() # Cleanup and restore original state cleanup_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") # Test that SettingsManager has expected methods 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) # 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") # Test NaN validation var nan_result = settings_manager.set_setting("master_volume", NAN) TestHelper.assert_false(nan_result, "NaN values rejected for volume settings") # Test Infinity validation var inf_result = settings_manager.set_setting("master_volume", INF) TestHelper.assert_false(inf_result, "Infinity values rejected for volume settings") # Test negative infinity validation var neg_inf_result = settings_manager.set_setting("master_volume", -INF) TestHelper.assert_false(neg_inf_result, "Negative infinity values rejected") # Test range validation for volumes var negative_volume = settings_manager.set_setting("master_volume", -0.5) TestHelper.assert_false(negative_volume, "Negative volume values rejected") var excessive_volume = settings_manager.set_setting("master_volume", 1.5) TestHelper.assert_false(excessive_volume, "Volume values > 1.0 rejected") # 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") # Test string length validation for language var long_language = "a".repeat(20) # Exceeds MAX_SETTING_STRING_LENGTH var long_lang_result = settings_manager.set_setting("language", long_language) TestHelper.assert_false(long_lang_result, "Excessively long language codes rejected") # Test invalid characters in language code var invalid_chars = settings_manager.set_setting("language", "en