-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Clear the selected trigger in the windows when the level changes (#755)
When the level changes go through all windows that store the selected trigger and clear the selection. This stops them referring to triggers that no longer exist. Add tests for this in TriggersWindowManager and RoomsWindowManager. Only tests for this specific fix are added for RoomsWindowManager - they will be added separately as they would be too big for this change. Closes #751
- Loading branch information
Showing
25 changed files
with
376 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#include <trview.app/Windows/RoomsWindowManager.h> | ||
#include <trview.app/Elements/Types.h> | ||
#include <trview.app/Mocks/Windows/IRoomsWindow.h> | ||
#include <trview.common/Mocks/Windows/IShortcuts.h> | ||
#include <trview.app/Mocks/Geometry/IMesh.h> | ||
|
||
using namespace trview; | ||
using namespace trview::mocks; | ||
using namespace trview::tests; | ||
|
||
TEST(RoomsWindowManager, SetTriggersClearsSelectedTrigger) | ||
{ | ||
Event<> shortcut_handler; | ||
auto shortcuts = std::make_shared<MockShortcuts>(); | ||
EXPECT_CALL(*shortcuts, add_shortcut).WillOnce([&](auto, auto) -> Event<>&{ return shortcut_handler; }); | ||
auto mock_window = std::make_shared<MockRoomsWindow>(); | ||
EXPECT_CALL(*mock_window, set_triggers).Times(3); | ||
EXPECT_CALL(*mock_window, clear_selected_trigger).Times(2); | ||
RoomsWindowManager manager(create_test_window(L"RoomsWindowManagerTests"), shortcuts, [&mock_window](...) { return mock_window; }); | ||
|
||
auto created_window = manager.create_window().lock(); | ||
ASSERT_NE(created_window, nullptr); | ||
ASSERT_EQ(created_window, mock_window); | ||
|
||
auto trigger1 = std::make_unique<Trigger>(100, 55, 100, 200, TriggerInfo{}, [](auto, auto) { return std::make_unique<MockMesh>(); }); | ||
manager.set_triggers({ trigger1.get() }); | ||
|
||
ASSERT_EQ(manager.selected_trigger(), nullptr); | ||
manager.set_selected_trigger(trigger1.get()); | ||
ASSERT_EQ(manager.selected_trigger(), trigger1.get()); | ||
manager.set_triggers({}); | ||
ASSERT_EQ(manager.selected_trigger(), nullptr); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
#include <trview.app/Windows/RoomsWindow.h> | ||
#include <trview.ui.render/Mocks/IRenderer.h> | ||
#include <trview.ui/Button.h> | ||
#include <trview.ui/Listbox.h> | ||
#include <trview.app/Elements/Types.h> | ||
#include <trview.graphics/mocks/IDeviceWindow.h> | ||
#include <trview.app/Mocks/Geometry/IMesh.h> | ||
#include <trview.ui.render/Mocks/IMapRenderer.h> | ||
#include <trview.app/Mocks/Elements/ILevel.h> | ||
#include <trlevel/Mocks/ILevel.h> | ||
#include <trview.app/Mocks/Graphics/ILevelTextureStorage.h> | ||
#include <trview.app/Mocks/Graphics/IMeshStorage.h> | ||
|
||
using namespace trview; | ||
using namespace trview::tests; | ||
using namespace trview::graphics; | ||
using namespace trview::graphics::mocks; | ||
using namespace trview::ui::render::mocks; | ||
using namespace trview::mocks; | ||
|
||
TEST(RoomsWindow, ClearSelectedTriggerClearsSelection) | ||
{ | ||
auto [renderer_ptr_source, renderer] = create_mock<MockRenderer>(); | ||
auto renderer_ptr = std::move(renderer_ptr_source); | ||
RoomsWindow window([&](auto) { return std::make_unique<MockDeviceWindow>(); }, [&](auto) { return std::move(renderer_ptr); }, | ||
[&](auto) { return std::make_unique<MockMapRenderer>(); }, create_test_window(L"RoomsWindowTests")); | ||
|
||
std::optional<Trigger*> raised_trigger; | ||
auto token = window.on_trigger_selected += [&raised_trigger](const auto& trigger) { raised_trigger = trigger; }; | ||
|
||
auto [trlevel_ptr, trlevel] = create_mock<trlevel::mocks::MockLevel>(); | ||
auto [level_ptr, level] = create_mock<MockLevel>(); | ||
auto [texture_storage_ptr, texture_storage] = create_mock<MockLevelTextureStorage>(); | ||
auto [mesh_storage_ptr, mesh_storage] = create_mock<MockMeshStorage>(); | ||
trlevel::tr3_room tr_room{}; | ||
|
||
auto room = std::make_unique<Room>( | ||
[](auto, auto, auto, auto, auto) { return std::make_unique<MockMesh>(); }, | ||
trlevel, tr_room, texture_storage, mesh_storage, 0, level); | ||
|
||
auto trigger1 = std::make_unique<Trigger>(0, 0, 100, 200, TriggerInfo{ 0, 0, 0, TriggerType::Trigger, 0, { } }, [](auto, auto) { return std::make_unique<MockMesh>(); }); | ||
room->add_trigger(trigger1.get()); | ||
|
||
window.set_rooms({ room.get() }); | ||
window.set_triggers({ trigger1.get() }); | ||
|
||
auto list = window.root_control()->find<ui::Listbox>(RoomsWindow::Names::rooms_listbox); | ||
ASSERT_NE(list, nullptr); | ||
|
||
auto row = list->find<ui::Control>(ui::Listbox::Names::row_name_format + "0"); | ||
ASSERT_NE(row, nullptr); | ||
|
||
auto cell = row->find<ui::Button>(ui::Listbox::Row::Names::cell_name_format + "#"); | ||
ASSERT_NE(cell, nullptr); | ||
cell->clicked(Point()); | ||
|
||
auto triggers_list = window.root_control()->find<ui::Listbox>(RoomsWindow::Names::triggers_listbox); | ||
ASSERT_NE(triggers_list, nullptr); | ||
|
||
auto triggers_row = triggers_list->find<ui::Control>(ui::Listbox::Names::row_name_format + "0"); | ||
ASSERT_NE(triggers_row, nullptr); | ||
|
||
auto triggers_cell = triggers_row->find<ui::Button>(ui::Listbox::Row::Names::cell_name_format + "#"); | ||
ASSERT_NE(triggers_cell, nullptr); | ||
|
||
ASSERT_FALSE(triggers_list->selected_item().has_value()); | ||
|
||
triggers_cell->clicked(Point()); | ||
ASSERT_TRUE(triggers_list->selected_item().has_value()); | ||
|
||
window.clear_selected_trigger(); | ||
ASSERT_FALSE(triggers_list->selected_item().has_value()); | ||
} | ||
|
||
TEST(RoomsWindow, SetTriggersClearsSelection) | ||
{ | ||
auto [renderer_ptr_source, renderer] = create_mock<MockRenderer>(); | ||
auto renderer_ptr = std::move(renderer_ptr_source); | ||
RoomsWindow window([&](auto) { return std::make_unique<MockDeviceWindow>(); }, [&](auto) { return std::move(renderer_ptr); }, | ||
[&](auto) { return std::make_unique<MockMapRenderer>(); }, create_test_window(L"RoomsWindowTests")); | ||
|
||
std::optional<Trigger*> raised_trigger; | ||
auto token = window.on_trigger_selected += [&raised_trigger](const auto& trigger) { raised_trigger = trigger; }; | ||
|
||
auto [trlevel_ptr, trlevel] = create_mock<trlevel::mocks::MockLevel>(); | ||
auto [level_ptr, level] = create_mock<MockLevel>(); | ||
auto [texture_storage_ptr, texture_storage] = create_mock<MockLevelTextureStorage>(); | ||
auto [mesh_storage_ptr, mesh_storage] = create_mock<MockMeshStorage>(); | ||
trlevel::tr3_room tr_room{}; | ||
|
||
auto room = std::make_unique<Room>( | ||
[](auto, auto, auto, auto, auto) { return std::make_unique<MockMesh>(); }, | ||
trlevel, tr_room, texture_storage, mesh_storage, 0, level); | ||
|
||
auto trigger1 = std::make_unique<Trigger>(0, 0, 100, 200, TriggerInfo{ 0, 0, 0, TriggerType::Trigger, 0, { } }, [](auto, auto) { return std::make_unique<MockMesh>(); }); | ||
room->add_trigger(trigger1.get()); | ||
|
||
window.set_rooms({ room.get() }); | ||
window.set_triggers({ trigger1.get() }); | ||
|
||
auto list = window.root_control()->find<ui::Listbox>(RoomsWindow::Names::rooms_listbox); | ||
ASSERT_NE(list, nullptr); | ||
|
||
auto row = list->find<ui::Control>(ui::Listbox::Names::row_name_format + "0"); | ||
ASSERT_NE(row, nullptr); | ||
|
||
auto cell = row->find<ui::Button>(ui::Listbox::Row::Names::cell_name_format + "#"); | ||
ASSERT_NE(cell, nullptr); | ||
cell->clicked(Point()); | ||
|
||
auto triggers_list = window.root_control()->find<ui::Listbox>(RoomsWindow::Names::triggers_listbox); | ||
ASSERT_NE(triggers_list, nullptr); | ||
|
||
auto triggers_row = triggers_list->find<ui::Control>(ui::Listbox::Names::row_name_format + "0"); | ||
ASSERT_NE(triggers_row, nullptr); | ||
|
||
auto triggers_cell = triggers_row->find<ui::Button>(ui::Listbox::Row::Names::cell_name_format + "#"); | ||
ASSERT_NE(triggers_cell, nullptr); | ||
|
||
ASSERT_FALSE(triggers_list->selected_item().has_value()); | ||
|
||
triggers_cell->clicked(Point()); | ||
ASSERT_TRUE(triggers_list->selected_item().has_value()); | ||
|
||
window.set_triggers({}); | ||
ASSERT_FALSE(triggers_list->selected_item().has_value()); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#pragma once | ||
|
||
#include <trview.app/Windows/IRoomsWindow.h> | ||
|
||
namespace trview | ||
{ | ||
namespace mocks | ||
{ | ||
struct MockRoomsWindow : public IRoomsWindow | ||
{ | ||
virtual ~MockRoomsWindow() = default; | ||
MOCK_METHOD(void, clear_selected_trigger, ()); | ||
MOCK_METHOD(void, render, (bool)); | ||
MOCK_METHOD(void, set_current_room, (uint32_t)); | ||
MOCK_METHOD(void, set_items, (const std::vector<Item>&)); | ||
MOCK_METHOD(void, set_rooms, (const std::vector<Room*>&)); | ||
MOCK_METHOD(void, set_selected_item, (const Item&));; | ||
MOCK_METHOD(void, set_selected_trigger, (const Trigger* const)); | ||
MOCK_METHOD(void, set_triggers, (const std::vector<Trigger*>&)); | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.