extends SceneTree const VehicleCommand = preload("res://game/application/vehicle/vehicle_command.gd") const CameraLookCommand = preload( "res://game/application/vehicle/camera_look_command.gd" ) const PilotUseCase = preload("res://game/application/vehicle/pilot_use_case.gd") const VehicleMotionPort = preload( "res://game/application/interfaces/vehicle_motion_port.gd" ) const TEST_COUNT := 10 var _failures: Array[String] = [] class RecordingMotionPort extends VehicleMotionPort: var commands: Array[VehicleCommand] = [] func apply_command(command: VehicleCommand) -> void: commands.append(command) func _init() -> void: _test_vehicle_command_contract() _test_camera_command_contract() _test_pilot_use_case_orders_commands() if _failures.is_empty(): print("Vehicle application unit tests: %d passed, 0 failed." % TEST_COUNT) quit(0) else: for failure: String in _failures: push_error(failure) print("Vehicle application unit tests: %d failed." % _failures.size()) quit(1) func _test_vehicle_command_contract() -> void: var neutral: VehicleCommand = VehicleCommand.neutral(0) _expect(neutral.validation_error().is_empty(), "neutral command is valid") _expect( VehicleCommand.new(-1, 0.0, 0.0, 0.0, false).validation_error() == "vehicle command sequence is negative", "negative sequence is rejected" ) _expect( not VehicleCommand.new(0, 1.01, 0.0, 0.0, false).validation_error().is_empty(), "non-normalized axis is rejected" ) func _test_camera_command_contract() -> void: _expect(CameraLookCommand.new(0.2, -0.1).validation_error().is_empty(), "finite camera look is valid") _expect( not CameraLookCommand.new(NAN, 0.0).validation_error().is_empty(), "non-finite camera look is rejected" ) func _test_pilot_use_case_orders_commands() -> void: var port := RecordingMotionPort.new() var pilot := PilotUseCase.new(port) var first = pilot.execute(VehicleCommand.new(0, 1.0, 0.0, 0.0, false)) _expect(first.accepted, "first consecutive vehicle command is accepted") _expect(port.commands.size() == 1 and port.commands[0].longitudinal == 1.0, "accepted command reaches motion port") var skipped = pilot.execute(VehicleCommand.neutral(2)) _expect(not skipped.accepted, "skipped vehicle sequence is rejected") _expect(port.commands.size() == 1, "rejected command does not reach motion port") var retry = pilot.execute(VehicleCommand.neutral(1)) _expect(retry.accepted and port.commands.size() == 2, "expected sequence remains retryable") func _expect(condition: bool, label: String) -> void: if not condition: _failures.append(label)