Integrate per-save identity and interaction UI
This commit is contained in:
parent
ac82a28f3b
commit
4fda6e97f6
58 changed files with 3471 additions and 461 deletions
151
tests/profile_title_validation.gd
Normal file
151
tests/profile_title_validation.gd
Normal file
|
|
@ -0,0 +1,151 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue