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 game_manager: Node
var original_scene: Node
var test_scenes_created: 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("GameManager")
@@ -49,20 +51,34 @@ func run_tests():
TestHelper.print_test_footer("GameManager")
func test_basic_functionality():
TestHelper.print_step("Basic Functionality")
# Test that GameManager has expected properties
TestHelper.assert_has_properties(game_manager, ["pending_gameplay_mode", "is_changing_scene"], "GameManager properties")
TestHelper.assert_has_properties(
game_manager, ["pending_gameplay_mode", "is_changing_scene"], "GameManager properties"
)
# Test that GameManager has expected methods
var expected_methods = ["start_new_game", "continue_game", "start_match3_game", "start_clickomania_game", "start_game_with_mode", "save_game", "exit_to_main_menu"]
var expected_methods = [
"start_new_game",
"continue_game",
"start_match3_game",
"start_clickomania_game",
"start_game_with_mode",
"save_game",
"exit_to_main_menu"
]
TestHelper.assert_has_methods(game_manager, expected_methods, "GameManager methods")
# Test initial state
TestHelper.assert_equal("match3", game_manager.pending_gameplay_mode, "Default pending gameplay mode")
TestHelper.assert_equal(
"match3", game_manager.pending_gameplay_mode, "Default pending gameplay mode"
)
TestHelper.assert_false(game_manager.is_changing_scene, "Initial scene change flag")
func test_scene_constants():
TestHelper.print_step("Scene Path Constants")
@@ -83,6 +99,7 @@ func test_scene_constants():
TestHelper.assert_true(ResourceLoader.exists(game_path), "Game scene file exists at path")
TestHelper.assert_true(ResourceLoader.exists(main_path), "Main scene file exists at path")
func test_input_validation():
TestHelper.print_step("Input Validation")
@@ -92,24 +109,41 @@ func test_input_validation():
# Test empty string validation
game_manager.start_game_with_mode("")
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Empty string mode rejected")
TestHelper.assert_false(game_manager.is_changing_scene, "Scene change flag unchanged after empty mode")
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Empty string mode rejected"
)
TestHelper.assert_false(
game_manager.is_changing_scene, "Scene change flag unchanged after empty mode"
)
# Test null validation - GameManager expects String, so this tests the type safety
# Note: In Godot 4.4, passing null to String parameter causes script error as expected
# The function properly validates empty strings instead
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Mode preserved after empty string test")
TestHelper.assert_false(game_manager.is_changing_scene, "Scene change flag unchanged after validation tests")
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Mode preserved after empty string test"
)
TestHelper.assert_false(
game_manager.is_changing_scene, "Scene change flag unchanged after validation tests"
)
# Test invalid mode validation
game_manager.start_game_with_mode("invalid_mode")
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Invalid mode rejected")
TestHelper.assert_false(game_manager.is_changing_scene, "Scene change flag unchanged after invalid mode")
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Invalid mode rejected"
)
TestHelper.assert_false(
game_manager.is_changing_scene, "Scene change flag unchanged after invalid mode"
)
# Test case sensitivity
game_manager.start_game_with_mode("MATCH3")
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Case-sensitive mode validation")
TestHelper.assert_false(game_manager.is_changing_scene, "Scene change flag unchanged after wrong case")
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Case-sensitive mode validation"
)
TestHelper.assert_false(
game_manager.is_changing_scene, "Scene change flag unchanged after wrong case"
)
func test_race_condition_protection():
TestHelper.print_step("Race Condition Protection")
@@ -122,16 +156,21 @@ func test_race_condition_protection():
game_manager.start_game_with_mode("match3")
# Verify second request was rejected
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Concurrent scene change blocked")
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Concurrent scene change blocked"
)
TestHelper.assert_true(game_manager.is_changing_scene, "Scene change flag preserved")
# Test exit to main menu during scene change
game_manager.exit_to_main_menu()
TestHelper.assert_true(game_manager.is_changing_scene, "Exit request blocked during scene change")
TestHelper.assert_true(
game_manager.is_changing_scene, "Exit request blocked during scene change"
)
# Reset state
game_manager.is_changing_scene = false
func test_gameplay_mode_validation():
TestHelper.print_step("Gameplay Mode Validation")
@@ -152,6 +191,7 @@ func test_gameplay_mode_validation():
var test_mode_invalid = not (mode in ["match3", "clickomania"])
TestHelper.assert_true(test_mode_invalid, "Invalid mode rejected: " + mode)
func test_scene_transition_safety():
TestHelper.print_step("Scene Transition Safety")
@@ -171,6 +211,7 @@ func test_scene_transition_safety():
# Test that current scene exists
TestHelper.assert_not_null(current_scene, "Current scene exists")
func test_error_handling():
TestHelper.print_step("Error Handling")
@@ -184,12 +225,23 @@ func test_error_handling():
# Verify state preservation after invalid inputs
game_manager.start_game_with_mode("")
TestHelper.assert_equal(original_changing, game_manager.is_changing_scene, "State preserved after empty mode error")
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Mode preserved after empty mode error")
TestHelper.assert_equal(
original_changing, game_manager.is_changing_scene, "State preserved after empty mode error"
)
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Mode preserved after empty mode error"
)
game_manager.start_game_with_mode("invalid")
TestHelper.assert_equal(original_changing, game_manager.is_changing_scene, "State preserved after invalid mode error")
TestHelper.assert_equal(original_mode, game_manager.pending_gameplay_mode, "Mode preserved after invalid mode error")
TestHelper.assert_equal(
original_changing,
game_manager.is_changing_scene,
"State preserved after invalid mode error"
)
TestHelper.assert_equal(
original_mode, game_manager.pending_gameplay_mode, "Mode preserved after invalid mode error"
)
func test_scene_method_validation():
TestHelper.print_step("Scene Method Validation")
@@ -210,6 +262,7 @@ func test_scene_method_validation():
# Clean up mock scene
mock_scene.queue_free()
func test_pending_mode_management():
TestHelper.print_step("Pending Mode Management")
@@ -222,7 +275,9 @@ func test_pending_mode_management():
if test_mode in ["match3", "clickomania"]:
# This simulates what would happen in start_game_with_mode
game_manager.pending_gameplay_mode = test_mode
TestHelper.assert_equal(test_mode, game_manager.pending_gameplay_mode, "Pending mode set correctly")
TestHelper.assert_equal(
test_mode, game_manager.pending_gameplay_mode, "Pending mode set correctly"
)
# Test mode preservation during errors
game_manager.pending_gameplay_mode = "match3"
@@ -230,11 +285,16 @@ func test_pending_mode_management():
# Attempt invalid operation (this should not change pending mode)
# The actual start_game_with_mode with invalid input won't change pending_gameplay_mode
TestHelper.assert_equal(preserved_mode, game_manager.pending_gameplay_mode, "Mode preserved during invalid operations")
TestHelper.assert_equal(
preserved_mode,
game_manager.pending_gameplay_mode,
"Mode preserved during invalid operations"
)
# Restore original mode
game_manager.pending_gameplay_mode = original_mode
func cleanup_tests():
TestHelper.print_step("Cleanup")
@@ -248,4 +308,4 @@ func cleanup_tests():
# Note: Can't actually delete from res:// in tests, just track for manual cleanup
pass
TestHelper.assert_true(true, "Test cleanup completed")
TestHelper.assert_true(true, "Test cleanup completed")