151 lines
5.1 KiB
GDScript
151 lines
5.1 KiB
GDScript
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
|