extends SceneTree ## Headless smoke test verifying Bison model is present in the editor palette ## and loads properly via StaticObjectNode and EditorCore. const ChunkEditorModelClass := preload("res://scripts/editor/chunk_editor_model.gd") const EditorObjectCatalogClass := preload("res://scripts/editor/object_catalog.gd") const EditorCoreClass := preload("res://scripts/editor/editor_core.gd") const PalettePanelClass := preload("res://scripts/editor/ui/palette_panel.gd") const StaticObjectNodeClass := preload("res://scripts/static_object_node.gd") const WorldObjectClass := preload("res://scripts/world_object.gd") var passed := 0 var failed := 0 func _check(label: String, cond: bool) -> void: if cond: passed += 1 print(" PASS: ", label) else: failed += 1 printerr(" FAIL: ", label) func _initialize() -> void: await _run() func _run() -> void: print("=== Running Bison Model in Editor Palette Smoke Test ===") var root := Node.new() root.name = "TestRoot" get_root().add_child(root) # 1. Check catalog loading var catalog := EditorObjectCatalogClass.new() var err := catalog.load_catalog() _check("Loaded EditorObjectCatalog from JSON", err == OK) # 2. Check bison in default ids var all_ids := catalog.get_all_ids() _check("Catalog contains 'bison'", all_ids.has("bison")) var bison_entry := catalog.resolve("bison") _check("Bison entry has asset_id props/bison.glb", bison_entry.get("asset_id") == "props/bison.glb") _check("Bison entry display_name is Bison", bison_entry.get("display_name") == "Bison") _check("Bison asset file exists in project", FileAccess.file_exists("res://assets/props/bison.glb")) # 3. Check alias resolution for legacy custom import id var alias_entry := catalog.resolve("custom_bizon_by_madtrollstudio_rqk_lny_pnfx") _check("Legacy custom id resolves to bison", alias_entry.get("asset_id") == "props/bison.glb") # 4. Check PalettePanel populates bison in list var palette := PalettePanelClass.new() root.add_child(palette) await process_frame palette.set_catalog(catalog) var found_in_palette := false for i in range(palette._list.item_count): var item_text := palette._list.get_item_text(i) if item_text == "Bison": found_in_palette = true break _check("PalettePanel list contains 'Bison'", found_in_palette) # 5. Place bison in a chunk model var model := ChunkEditorModelClass.new() var core := EditorCoreClass.new(model, catalog) var obj_id := core.place_object("bison", Vector3(10.0, 0.0, 15.0)) _check("Placed bison via EditorCore", not obj_id.is_empty()) var placed_obj := model.find_object(obj_id) _check("Placed object has props/bison.glb", placed_obj != null and placed_obj.asset_id == "props/bison.glb") # 6. StaticObjectNode with default props/bison.glb var wo1 := WorldObjectClass.new() wo1.id = "test_bison_1" wo1.type = "prop" wo1.asset_id = "props/bison.glb" wo1.position = Vector3(10.0, 0.0, 15.0) var node1 := StaticObjectNodeClass.new() node1.world_object = wo1 root.add_child(node1) await process_frame _check("StaticObjectNode loaded visuals for props/bison.glb", node1.get_child_count() > 0) # 7. StaticObjectNode with legacy user:// path as saved in World 6 var wo2 := WorldObjectClass.new() wo2.id = "test_bison_legacy" wo2.type = "prop" wo2.asset_id = "user://custom_assets/Bizon by madtrollstudio - RqkLNYPnfx.glb" wo2.properties = {"catalog_id": "custom_bizon_by_madtrollstudio_rqk_lny_pnfx"} var node2 := StaticObjectNodeClass.new() node2.world_object = wo2 root.add_child(node2) await process_frame _check("StaticObjectNode loaded visuals for legacy world chunk bison", node2.get_child_count() > 0) print("Bison Palette Smoke Test complete. Passed: %d, Failed: %d" % [passed, failed]) if failed > 0: quit(1) else: quit(0)