76 auto room_result = dungeon_editor_system_->GetRoom(0x0000);
77 ASSERT_TRUE(room_result.ok()) <<
"Failed to load room 0x0000: " << room_result.status().message();
79 const auto& room = room_result.value();
83 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
84 EXPECT_EQ(dungeon_editor_system_->GetCurrentRoom(), 0x0000);
87 auto room2_result = dungeon_editor_system_->GetRoom(0x0001);
88 ASSERT_TRUE(room2_result.ok()) <<
"Failed to load room 0x0001: " << room2_result.status().message();
90 const auto& room2 = room2_result.value();
97 auto object_editor = dungeon_editor_system_->GetObjectEditor();
98 ASSERT_NE(object_editor,
nullptr);
101 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
104 ASSERT_TRUE(object_editor->InsertObject(5, 5, 0x10, 0x12, 0).ok());
105 ASSERT_TRUE(object_editor->InsertObject(10, 10, 0x20, 0x22, 1).ok());
108 EXPECT_EQ(object_editor->GetObjectCount(), 2);
111 ASSERT_TRUE(object_editor->SelectObject(5 * 16, 5 * 16).ok());
112 auto selection = object_editor->GetSelection();
113 EXPECT_EQ(selection.selected_objects.size(), 1);
116 ASSERT_TRUE(object_editor->DeleteSelectedObjects().ok());
117 EXPECT_EQ(object_editor->GetObjectCount(), 1);
123 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
128 sprite_data.
name =
"Test Sprite";
132 sprite_data.
layer = 0;
136 ASSERT_TRUE(dungeon_editor_system_->AddSprite(sprite_data).ok());
139 auto sprites_result = dungeon_editor_system_->GetSpritesByRoom(0x0000);
140 ASSERT_TRUE(sprites_result.ok()) <<
"Failed to get sprites: " << sprites_result.status().message();
142 const auto& sprites = sprites_result.value();
143 EXPECT_EQ(sprites.size(), 1);
144 EXPECT_EQ(sprites[0].sprite_id, 1);
145 EXPECT_EQ(sprites[0].name,
"Test Sprite");
149 ASSERT_TRUE(dungeon_editor_system_->UpdateSprite(1, sprite_data).ok());
152 auto sprite_result = dungeon_editor_system_->GetSprite(1);
153 ASSERT_TRUE(sprite_result.ok());
154 EXPECT_EQ(sprite_result.value().x, 150);
157 ASSERT_TRUE(dungeon_editor_system_->RemoveSprite(1).ok());
160 auto sprites_after = dungeon_editor_system_->GetSpritesByRoom(0x0000);
161 ASSERT_TRUE(sprites_after.ok());
162 EXPECT_EQ(sprites_after.value().size(), 0);
168 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
174 item_data.
name =
"Small Key";
181 ASSERT_TRUE(dungeon_editor_system_->AddItem(item_data).ok());
184 auto items_result = dungeon_editor_system_->GetItemsByRoom(0x0000);
185 ASSERT_TRUE(items_result.ok()) <<
"Failed to get items: " << items_result.status().message();
187 const auto& items = items_result.value();
188 EXPECT_EQ(items.size(), 1);
189 EXPECT_EQ(items[0].item_id, 1);
190 EXPECT_EQ(items[0].name,
"Small Key");
194 ASSERT_TRUE(dungeon_editor_system_->UpdateItem(1, item_data).ok());
197 auto item_result = dungeon_editor_system_->GetItem(1);
198 ASSERT_TRUE(item_result.ok());
199 EXPECT_TRUE(item_result.value().is_hidden);
202 ASSERT_TRUE(dungeon_editor_system_->RemoveItem(1).ok());
205 auto items_after = dungeon_editor_system_->GetItemsByRoom(0x0000);
206 ASSERT_TRUE(items_after.ok());
207 EXPECT_EQ(items_after.value().size(), 0);
216 entrance_data.
name =
"Test Entrance";
226 ASSERT_TRUE(dungeon_editor_system_->AddEntrance(entrance_data).ok());
229 auto entrances_result = dungeon_editor_system_->GetEntrancesByRoom(0x0000);
230 ASSERT_TRUE(entrances_result.ok()) <<
"Failed to get entrances: " << entrances_result.status().message();
232 const auto& entrances = entrances_result.value();
233 EXPECT_EQ(entrances.size(), 1);
234 EXPECT_EQ(entrances[0].name,
"Test Entrance");
237 int entrance_id = entrances[0].entrance_id;
240 ASSERT_TRUE(dungeon_editor_system_->ConnectRooms(0x0000, 0x0001, 150, 150, 250, 250).ok());
243 auto entrances_after = dungeon_editor_system_->GetEntrancesByRoom(0x0000);
244 ASSERT_TRUE(entrances_after.ok());
245 EXPECT_GE(entrances_after.value().size(), 1);
248 ASSERT_TRUE(dungeon_editor_system_->RemoveEntrance(entrance_id).ok());
251 auto entrances_final = dungeon_editor_system_->GetEntrancesByRoom(0x0000);
252 ASSERT_TRUE(entrances_final.ok());
253 EXPECT_EQ(entrances_final.value().size(), 0);
261 door_data.
name =
"Test Door";
274 ASSERT_TRUE(dungeon_editor_system_->AddDoor(door_data).ok());
277 auto doors_result = dungeon_editor_system_->GetDoorsByRoom(0x0000);
278 ASSERT_TRUE(doors_result.ok()) <<
"Failed to get doors: " << doors_result.status().message();
280 const auto& doors = doors_result.value();
281 EXPECT_EQ(doors.size(), 1);
282 EXPECT_EQ(doors[0].door_id, 1);
283 EXPECT_EQ(doors[0].name,
"Test Door");
287 ASSERT_TRUE(dungeon_editor_system_->UpdateDoor(1, door_data).ok());
290 auto door_result = dungeon_editor_system_->GetDoor(1);
291 ASSERT_TRUE(door_result.ok());
292 EXPECT_TRUE(door_result.value().is_locked);
295 ASSERT_TRUE(dungeon_editor_system_->SetDoorKeyRequirement(1,
true, 1).ok());
298 auto door_with_key = dungeon_editor_system_->GetDoor(1);
299 ASSERT_TRUE(door_with_key.ok());
300 EXPECT_TRUE(door_with_key.value().requires_key);
301 EXPECT_EQ(door_with_key.value().key_type, 1);
304 ASSERT_TRUE(dungeon_editor_system_->RemoveDoor(1).ok());
307 auto doors_after = dungeon_editor_system_->GetDoorsByRoom(0x0000);
308 ASSERT_TRUE(doors_after.ok());
309 EXPECT_EQ(doors_after.value().size(), 0);
326 ASSERT_TRUE(dungeon_editor_system_->AddChest(
chest_data).ok());
329 auto chests_result = dungeon_editor_system_->GetChestsByRoom(0x0000);
330 ASSERT_TRUE(chests_result.ok()) <<
"Failed to get chests: " << chests_result.status().message();
332 const auto& chests = chests_result.value();
333 EXPECT_EQ(chests.size(), 1);
334 EXPECT_EQ(chests[0].chest_id, 1);
335 EXPECT_EQ(chests[0].item_id, 10);
338 ASSERT_TRUE(dungeon_editor_system_->SetChestItem(1, 20, 5).ok());
341 auto chest_result = dungeon_editor_system_->GetChest(1);
342 ASSERT_TRUE(chest_result.ok());
343 EXPECT_EQ(chest_result.value().item_id, 20);
344 EXPECT_EQ(chest_result.value().item_quantity, 5);
347 ASSERT_TRUE(dungeon_editor_system_->SetChestOpened(1,
true).ok());
350 auto opened_chest = dungeon_editor_system_->GetChest(1);
351 ASSERT_TRUE(opened_chest.ok());
352 EXPECT_TRUE(opened_chest.value().is_opened);
355 ASSERT_TRUE(dungeon_editor_system_->RemoveChest(1).ok());
358 auto chests_after = dungeon_editor_system_->GetChestsByRoom(0x0000);
359 ASSERT_TRUE(chests_after.ok());
360 EXPECT_EQ(chests_after.value().size(), 0);
368 properties.
name =
"Test Room";
369 properties.
description =
"A test room for integration testing";
379 ASSERT_TRUE(dungeon_editor_system_->SetRoomProperties(0x0000, properties).ok());
382 auto properties_result = dungeon_editor_system_->GetRoomProperties(0x0000);
383 ASSERT_TRUE(properties_result.ok()) <<
"Failed to get room properties: " << properties_result.status().message();
385 const auto& retrieved_properties = properties_result.value();
386 EXPECT_EQ(retrieved_properties.room_id, 0x0000);
387 EXPECT_EQ(retrieved_properties.name,
"Test Room");
388 EXPECT_EQ(retrieved_properties.description,
"A test room for integration testing");
389 EXPECT_EQ(retrieved_properties.dungeon_id, 1);
392 properties.
name =
"Updated Test Room";
394 ASSERT_TRUE(dungeon_editor_system_->SetRoomProperties(0x0000, properties).ok());
397 auto updated_properties = dungeon_editor_system_->GetRoomProperties(0x0000);
398 ASSERT_TRUE(updated_properties.ok());
399 EXPECT_EQ(updated_properties.value().name,
"Updated Test Room");
400 EXPECT_TRUE(updated_properties.value().is_boss_room);
408 settings.
name =
"Test Dungeon";
409 settings.
description =
"A test dungeon for integration testing";
420 ASSERT_TRUE(dungeon_editor_system_->SetDungeonSettings(settings).ok());
423 auto settings_result = dungeon_editor_system_->GetDungeonSettings();
424 ASSERT_TRUE(settings_result.ok()) <<
"Failed to get dungeon settings: " << settings_result.status().message();
426 const auto& retrieved_settings = settings_result.value();
427 EXPECT_EQ(retrieved_settings.dungeon_id, 1);
428 EXPECT_EQ(retrieved_settings.name,
"Test Dungeon");
429 EXPECT_EQ(retrieved_settings.total_rooms, 10);
430 EXPECT_EQ(retrieved_settings.starting_room_id, 0x0000);
431 EXPECT_EQ(retrieved_settings.boss_room_id, 0x0001);
432 EXPECT_TRUE(retrieved_settings.has_map);
433 EXPECT_TRUE(retrieved_settings.has_compass);
434 EXPECT_TRUE(retrieved_settings.has_big_key);
440 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
443 auto object_editor = dungeon_editor_system_->GetObjectEditor();
444 ASSERT_NE(object_editor,
nullptr);
447 ASSERT_TRUE(object_editor->InsertObject(5, 5, 0x10, 0x12, 0).ok());
448 ASSERT_TRUE(object_editor->InsertObject(10, 10, 0x20, 0x22, 1).ok());
451 EXPECT_EQ(object_editor->GetObjectCount(), 2);
454 ASSERT_TRUE(dungeon_editor_system_->Undo().ok());
455 EXPECT_EQ(object_editor->GetObjectCount(), 1);
458 ASSERT_TRUE(dungeon_editor_system_->Redo().ok());
459 EXPECT_EQ(object_editor->GetObjectCount(), 2);
462 ASSERT_TRUE(dungeon_editor_system_->Undo().ok());
463 ASSERT_TRUE(dungeon_editor_system_->Undo().ok());
464 EXPECT_EQ(object_editor->GetObjectCount(), 0);
467 ASSERT_TRUE(dungeon_editor_system_->Redo().ok());
468 ASSERT_TRUE(dungeon_editor_system_->Redo().ok());
469 EXPECT_EQ(object_editor->GetObjectCount(), 2);
475 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
478 auto room_validation = dungeon_editor_system_->ValidateRoom(0x0000);
479 ASSERT_TRUE(room_validation.ok()) <<
"Room validation failed: " << room_validation.message();
482 auto dungeon_validation = dungeon_editor_system_->ValidateDungeon();
483 ASSERT_TRUE(dungeon_validation.ok()) <<
"Dungeon validation failed: " << dungeon_validation.message();
489 ASSERT_TRUE(dungeon_editor_system_->SetCurrentRoom(0x0000).ok());
491 auto object_editor = dungeon_editor_system_->GetObjectEditor();
492 ASSERT_NE(object_editor,
nullptr);
494 ASSERT_TRUE(object_editor->InsertObject(5, 5, 0x10, 0x12, 0).ok());
495 ASSERT_TRUE(object_editor->InsertObject(10, 10, 0x20, 0x22, 1).ok());
498 ASSERT_TRUE(dungeon_editor_system_->SaveRoom(0x0000).ok());
501 ASSERT_TRUE(dungeon_editor_system_->ReloadRoom(0x0000).ok());
504 auto reloaded_objects = object_editor->GetObjects();
505 EXPECT_EQ(reloaded_objects.size(), 2);
508 ASSERT_TRUE(dungeon_editor_system_->SaveDungeon().ok());
513 auto start_time = std::chrono::high_resolution_clock::now();
516 for (
int i = 0; i < 100; i++) {
521 sprite_data.
x = i * 10;
522 sprite_data.
y = i * 10;
523 sprite_data.
layer = 0;
525 ASSERT_TRUE(dungeon_editor_system_->AddSprite(sprite_data).ok());
531 item_data.
x = i * 15;
532 item_data.
y = i * 15;
535 ASSERT_TRUE(dungeon_editor_system_->AddItem(item_data).ok());
538 auto end_time = std::chrono::high_resolution_clock::now();
539 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
542 EXPECT_LT(duration.count(), 5000) <<
"Performance test too slow: " << duration.count() <<
"ms";
544 std::cout <<
"Performance test: 200 operations took " << duration.count() <<
"ms" << std::endl;
550 auto invalid_room = dungeon_editor_system_->GetRoom(-1);
551 EXPECT_FALSE(invalid_room.ok());
553 auto invalid_room_large = dungeon_editor_system_->GetRoom(10000);
554 EXPECT_FALSE(invalid_room_large.ok());
557 auto invalid_sprite = dungeon_editor_system_->GetSprite(-1);
558 EXPECT_FALSE(invalid_sprite.ok());
561 auto invalid_item = dungeon_editor_system_->GetItem(-1);
562 EXPECT_FALSE(invalid_item.ok());
565 auto invalid_entrance = dungeon_editor_system_->GetEntrance(-1);
566 EXPECT_FALSE(invalid_entrance.ok());
569 auto invalid_door = dungeon_editor_system_->GetDoor(-1);
570 EXPECT_FALSE(invalid_door.ok());
573 auto invalid_chest = dungeon_editor_system_->GetChest(-1);
574 EXPECT_FALSE(invalid_chest.ok());