83 lines
2.6 KiB
GDScript3
83 lines
2.6 KiB
GDScript3
|
|
extends SceneTree
|
||
|
|
|
||
|
|
const ControllerFocusNavigationType = preload(
|
||
|
|
"res://ui/controller_focus_navigation.gd"
|
||
|
|
)
|
||
|
|
const UIReferencePresentationType = preload(
|
||
|
|
"res://ui/ui_reference_presentation.gd"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
func _initialize() -> void:
|
||
|
|
call_deferred("_run")
|
||
|
|
|
||
|
|
|
||
|
|
func _run() -> void:
|
||
|
|
_validate_spatial_navigation()
|
||
|
|
_validate_controller_hierarchy_contract()
|
||
|
|
_validate_four_by_three_centering()
|
||
|
|
_validate_low_end_profile_contract()
|
||
|
|
print("Controller UI navigation validation: PASS")
|
||
|
|
quit()
|
||
|
|
|
||
|
|
|
||
|
|
func _validate_spatial_navigation() -> void:
|
||
|
|
var host := Control.new()
|
||
|
|
root.add_child(host)
|
||
|
|
var center := _make_button(host, "center", Vector2(200.0, 200.0))
|
||
|
|
var left := _make_button(host, "left", Vector2(50.0, 200.0))
|
||
|
|
var right := _make_button(host, "right", Vector2(350.0, 200.0))
|
||
|
|
var top := _make_button(host, "top", Vector2(200.0, 50.0))
|
||
|
|
var bottom := _make_button(host, "bottom", Vector2(200.0, 350.0))
|
||
|
|
var controls: Array[Control] = [center, left, right, top, bottom]
|
||
|
|
ControllerFocusNavigationType.configure_spatial_neighbors(controls)
|
||
|
|
assert(center.get_node(center.focus_neighbor_left) == left)
|
||
|
|
assert(center.get_node(center.focus_neighbor_right) == right)
|
||
|
|
assert(center.get_node(center.focus_neighbor_top) == top)
|
||
|
|
assert(center.get_node(center.focus_neighbor_bottom) == bottom)
|
||
|
|
host.queue_free()
|
||
|
|
|
||
|
|
|
||
|
|
func _validate_controller_hierarchy_contract() -> void:
|
||
|
|
var source: String = FileAccess.get_file_as_string(
|
||
|
|
"res://ui/player_menu.gd"
|
||
|
|
)
|
||
|
|
assert(source.contains("ROLE_POINTER_MODIFIER"))
|
||
|
|
assert(source.contains("ROLE_CAMERA_ZOOM"))
|
||
|
|
assert(source.contains("_handle_controller_secondary_switch"))
|
||
|
|
assert(source.contains("ROLE_LB"))
|
||
|
|
assert(source.contains("ROLE_RB"))
|
||
|
|
assert(source.contains("_reserve_main_navigation_for_page_switching"))
|
||
|
|
|
||
|
|
|
||
|
|
func _validate_four_by_three_centering() -> void:
|
||
|
|
var stage_position: Vector2 = (
|
||
|
|
UIReferencePresentationType.get_stage_position(Vector2(640.0, 480.0))
|
||
|
|
)
|
||
|
|
assert(stage_position.is_equal_approx(Vector2(0.0, 120.0)))
|
||
|
|
|
||
|
|
|
||
|
|
func _validate_low_end_profile_contract() -> void:
|
||
|
|
var launcher: String = FileAccess.get_file_as_string(
|
||
|
|
"res://scripts/portmaster/NETfishing.sh"
|
||
|
|
)
|
||
|
|
assert(launcher.contains("allwinner,h616"))
|
||
|
|
assert(launcher.contains("sun50iw9p1"))
|
||
|
|
assert(launcher.contains("NETFISHING_LOW_END=1"))
|
||
|
|
assert(launcher.contains("--max-fps 30"))
|
||
|
|
assert(launcher.contains("--audio-output-latency 40"))
|
||
|
|
|
||
|
|
|
||
|
|
func _make_button(
|
||
|
|
host: Control,
|
||
|
|
button_name: String,
|
||
|
|
button_position: Vector2,
|
||
|
|
) -> Button:
|
||
|
|
var button := Button.new()
|
||
|
|
button.name = button_name
|
||
|
|
button.position = button_position
|
||
|
|
button.size = Vector2(80.0, 80.0)
|
||
|
|
button.focus_mode = Control.FOCUS_ALL
|
||
|
|
host.add_child(button)
|
||
|
|
return button
|