extends SceneTree const SPAWNER := preload("res://scripts/stage/stage_spawner.gd") const CARD := preload("res://scripts/shared/ui/asset_card.gd") const CHROME := preload("res://scripts/editors/stage/stage_chrome.gd") var _failures: int = 0 var _last_activated_payload: Dictionary = {} func _init() -> void: var world: Node2D = Node2D.new() var spawner: StageSpawner = SPAWNER.new(world) as StageSpawner var entries: Array[Dictionary] = spawner.get_palette_entries() _check(entries.size() == 7, "six established cards plus the Phase 19 Scenery card") _check(String(entries[0].get("placement_id", "")) == "ground", "registry id retained") var card: AssetCard = CARD.new() as AssetCard card.configure(entries[0]) _check(card.payload().get("kind", "") == "terrain", "card copies payload") var chrome: StageChrome = CHROME.new() as StageChrome chrome.configure(null, 0, 15.0, false, true, Color("#22C6FF"), Color("#FFB300"), Color("#33DD77"), 16, 18) chrome.palette_activated.connect(_on_palette_activated) chrome.build(entries) var palette_buttons: Dictionary = chrome.get_palette_buttons() _check(palette_buttons.size() == 7, "seven stage palette cards") for entry: Dictionary in entries: var placement_id: String = String(entry.get("placement_id", "")) var asset_card: AssetCard = palette_buttons.get(placement_id) as AssetCard _check(asset_card != null, "%s card exists" % placement_id) if asset_card == null: continue var icon: TextureRect = asset_card.thumbnail_rect() var card_box: VBoxContainer = asset_card.get_child(0) as VBoxContainer var glyph: Label = card_box.get_child(1) as Label var title: Label = card_box.get_child(2) as Label if placement_id == "scenery": _check(not icon.visible and icon.texture == null, "Scenery retains its themed 🌄 fallback without a dedicated image asset") _check(glyph.visible and glyph.text == "🌄", "Scenery fallback is kid-readable") _check(title.text == String(entry.get("label", "")), "Scenery text label remains") _check(asset_card.tooltip_text == String(entry.get("label", "")), "Scenery tooltip remains") continue _check(icon.visible, "%s image is visible" % placement_id) var icon_texture: Texture2D = icon.texture as Texture2D _check(icon_texture != null, "%s image texture is assigned" % placement_id) if icon_texture != null: var expected_path: String = "res://resources/icons/%s.png" % placement_id _check(icon_texture.resource_path == expected_path, "%s uses its matching source image" % placement_id) _check(icon_texture.get_width() <= 256 and icon_texture.get_height() <= 256, "%s import is capped at 256 px" % placement_id) _check(icon.custom_minimum_size == Vector2(64.0, 64.0), "%s image area stays 64 px" % placement_id) _check(icon.stretch_mode == TextureRect.STRETCH_KEEP_ASPECT_CENTERED, "%s image keeps aspect ratio" % placement_id) _check(not glyph.visible, "%s emoji fallback is hidden" % placement_id) _check(title.text == String(entry.get("label", "")), "%s text label remains" % placement_id) _check(asset_card.tooltip_text == String(entry.get("label", "")), "%s tooltip remains" % placement_id) if placement_id == "prop": asset_card._pressed() _check(String(_last_activated_payload.get("placement_id", "")) == placement_id, "click activation still relays payload") chrome.free() card.free() world.free() print("PASS" if _failures == 0 else "FAIL: %d" % _failures); quit(0 if _failures == 0 else 1) func _check(condition: bool, message: String) -> void: if not condition: _failures += 1; push_error("Phase 18 palette: " + message) func _on_palette_activated(payload: Dictionary) -> void: _last_activated_payload = payload.duplicate(true)