extends SceneTree func _initialize() -> void: _run.call_deferred() func _run() -> void: _validate_profile_defaults_and_legacy_data() _validate_network_payloads() _validate_peer_registry_title() await _validate_profile_layout() print("Profile title validation: PASS") quit(0) func _validate_profile_defaults_and_legacy_data() -> void: var preferences := NetworkProfilePreferences.new() assert(preferences.display_name == "stray") assert(preferences.title == "newbie") assert(NetworkProfilePreferences.is_valid_title("trail guide")) assert(not NetworkProfilePreferences.is_valid_title("")) assert(not NetworkProfilePreferences.is_valid_title("x".repeat( NetworkProtocol.MAX_PLAYER_TITLE_LENGTH + 1 ))) preferences.profile_id = "profile-id" preferences.created_at_unix = 1 var save_data := preferences.to_save_data() assert(str(save_data.get("title", "")) == "newbie") assert(NetworkProfilePreferences.validate_save_data(save_data)) # Title was added without invalidating existing per-save character records. var legacy_save := save_data.duplicate(true) legacy_save.erase("title") assert(NetworkProfilePreferences.validate_save_data(legacy_save)) legacy_save["title"] = 7 assert(not NetworkProfilePreferences.validate_save_data(legacy_save)) preferences.free() func _validate_network_payloads() -> void: var appearance := CharacterCustomizationCatalog.default_snapshot() var fingerprint := "a".repeat(64) var hello := NetworkProtocol.make_client_hello( "profile-id", "stray", "client-nonce", appearance, fingerprint, PackedByteArray(), "trail guide", ) assert(NetworkProtocol.validate_client_hello(hello).is_empty()) assert(str(hello.get("player_title", "")) == "trail guide") var invalid_hello := hello.duplicate(true) invalid_hello["player_title"] = "" assert(not NetworkProtocol.validate_client_hello(invalid_hello).is_empty()) var check_request := { "request_id": "check", "session_id": "session", "display_name": "stray", } assert(NetworkProfileProtocol.valid_check_request(check_request)) var apply_request := check_request.duplicate(true) apply_request.merge({ "player_title": "trail guide", "appearance": appearance, "use_anyway": false, "sender_fingerprint": fingerprint, "sender_signature": PackedByteArray(), }) assert(NetworkProfileProtocol.valid_apply_request(apply_request)) var signed_fields := NetworkProfileProtocol.signature_fields(apply_request) assert(signed_fields.has("trail guide")) apply_request.erase("player_title") assert(not NetworkProfileProtocol.valid_apply_request(apply_request)) func _validate_peer_registry_title() -> void: var registry := PeerRegistry.new() assert(registry.add_peer( 2, "profile-id", "stray", NetworkProtocol.PROTOCOL_VERSION, "", "", PackedStringArray(), "trail guide", )) assert(registry.get_peer(2).title == "trail guide") assert(registry.update_title(2, "river scout")) assert(registry.get_peer(2).title == "river scout") assert(not registry.update_title(2, "")) assert(not registry.add_peer( 3, "invalid-profile", "stray", NetworkProtocol.PROTOCOL_VERSION, "", "", PackedStringArray(), "", )) func _validate_profile_layout() -> void: root.size = Vector2i(1280, 720) var page := ProfilePage.new() page.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) root.add_child(page) await process_frame await process_frame var name_label := page.get("_name_label") as Label var name_edit := page.get("_name_edit") as LineEdit var title_edit := page.get("_title_edit") as LineEdit var identity := page.find_child("IdentityFingerprint", true, false) as Label var identity_stack := page.find_child( "ProfileIdentityStack", true, false ) as VBoxContainer var experience_row := page.find_child( "ProfileExperienceRow", true, false ) as HBoxContainer assert(name_label != null and name_edit != null and title_edit != null) assert(name_label.text == "name") assert(identity != null and identity_stack != null and experience_row != null) assert(name_edit.placeholder_text == "stray") assert(title_edit.placeholder_text == "newbie") assert(title_edit.global_position.y > name_edit.global_position.y) assert(is_equal_approx(title_edit.position.x, name_edit.position.x)) assert(identity.get_parent() == identity_stack) assert(experience_row.get_parent() == identity_stack) assert(identity.horizontal_alignment == HORIZONTAL_ALIGNMENT_RIGHT) assert(identity_stack.global_position.x > name_edit.global_position.x) assert(name_label.tooltip_text.contains( "Shown to other players in multiplayer." )) page.call("_set_name_status", "Name is available in this game.") assert(name_label.tooltip_text.contains( "Name is available in this game." )) for visible_label: Label in page.find_children("*", "Label", true, false): if visible_label.visible: assert(visible_label.text != "Shown to other players in multiplayer.") assert(visible_label.text != "Name is available in this game.") var account_controls: Array = page.call("_account_controller_controls") assert(name_edit in account_controls) assert(title_edit in account_controls) page.queue_free() for _frame: int in 4: await process_frame