mirror of
https://github.com/RetroAchievements/RAIntegration.git
synced 2026-10-12 02:09:25 +00:00
306 lines
13 KiB
C++
306 lines
13 KiB
C++
#include "CppUnitTest.h"
|
|
|
|
#include "ui\EditorTheme.hh"
|
|
#include "ui\viewmodels\MemoryRegionsViewModel.hh"
|
|
|
|
#include "tests\devkit\context\mocks\MockConsoleContext.hh"
|
|
#include "tests\devkit\context\mocks\MockDevKitContext.hh"
|
|
#include "tests\devkit\context\mocks\MockEmulatorMemoryContext.hh"
|
|
#include "tests\devkit\services\mocks\MockConfiguration.hh"
|
|
#include "tests\devkit\services\mocks\MockLocalStorage.hh"
|
|
#include "tests\devkit\services\mocks\MockLogger.hh"
|
|
#include "tests\ui\UIAsserts.hh"
|
|
#include "tests\RA_UnitTestHelpers.h"
|
|
#include "tests\mocks\MockDesktop.hh"
|
|
#include "tests\mocks\MockEmulatorContext.hh"
|
|
#include "tests\mocks\MockGameContext.hh"
|
|
#include "tests\mocks\MockWindowManager.hh"
|
|
|
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
|
|
namespace ra {
|
|
namespace ui {
|
|
namespace viewmodels {
|
|
namespace tests {
|
|
|
|
TEST_CLASS(MemoryRegionsViewModel_Tests)
|
|
{
|
|
private:
|
|
class MemoryRegionsViewModelHarness : public MemoryRegionsViewModel
|
|
{
|
|
public:
|
|
ra::context::mocks::MockConsoleContext mockConsoleContext;
|
|
ra::context::mocks::MockDevKitContext mockDevKitContext;
|
|
ra::context::mocks::MockEmulatorMemoryContext mockEmulatorMemoryContext;
|
|
ra::data::context::mocks::MockEmulatorContext mockEmulatorContext;
|
|
ra::data::context::mocks::MockGameContext mockGameContext;
|
|
ra::services::mocks::MockConfiguration mockConfiguration;
|
|
ra::services::mocks::MockLocalStorage mockLocalStorage;
|
|
ra::services::mocks::MockLogger mockLogger;
|
|
ra::ui::mocks::MockDesktop mockDesktop;
|
|
ra::ui::viewmodels::mocks::MockWindowManager mockWindowManager;
|
|
|
|
ra::data::models::MemoryRegionsModel& MemoryRegionsModel()
|
|
{
|
|
auto* pModel = mockGameContext.Assets().FindMemoryRegions();
|
|
if (!pModel)
|
|
{
|
|
auto pNewMemoryRegions = std::make_unique<ra::data::models::MemoryRegionsModel>();
|
|
pModel = dynamic_cast<ra::data::models::MemoryRegionsModel*>(&mockGameContext.Assets().Append(std::move(pNewMemoryRegions)));
|
|
}
|
|
return *pModel;
|
|
}
|
|
|
|
void MockRegions()
|
|
{
|
|
mockConsoleContext.AddMemoryRegion(0x0000, 0x1FFF, ra::data::MemoryRegion::Type::SystemRAM, L"System RAM");
|
|
mockConsoleContext.AddMemoryRegion(0x2000, 0x3FFF, ra::data::MemoryRegion::Type::VideoRAM, L"Video RAM");
|
|
mockConsoleContext.AddMemoryRegion(0x4000, 0x7FFF, ra::data::MemoryRegion::Type::SaveRAM, L"Cartridge RAM");
|
|
InitializeRegions();
|
|
}
|
|
};
|
|
|
|
public:
|
|
TEST_METHOD(TestInitialValues)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.InitializeRegions();
|
|
|
|
Assert::AreEqual({ 0U }, regions.Regions().Count());
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.CanRemove());
|
|
Assert::IsTrue(regions.CanSave());
|
|
}
|
|
|
|
TEST_METHOD(TestInitializeRegions)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 2U }, regions.Regions().Count());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x0000-0x1fff"), regions.Regions().GetItemAt(0)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"System RAM"), regions.Regions().GetItemAt(0)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsCustom());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x4000-0x7fff"), regions.Regions().GetItemAt(1)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"Cartridge RAM"), regions.Regions().GetItemAt(1)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsCustom());
|
|
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.CanRemove());
|
|
Assert::IsTrue(regions.CanSave());
|
|
}
|
|
|
|
TEST_METHOD(TestInitializeRegionsWithCustom)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.MemoryRegionsModel().AddCustomRegion(0x1200, 0x12FF, L"My region");
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x0000-0x1fff"), regions.Regions().GetItemAt(0)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"System RAM"), regions.Regions().GetItemAt(0)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsCustom());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x4000-0x7fff"), regions.Regions().GetItemAt(1)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"Cartridge RAM"), regions.Regions().GetItemAt(1)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsCustom());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x1200-0x12ff"), regions.Regions().GetItemAt(2)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"My region"), regions.Regions().GetItemAt(2)->GetLabel());
|
|
Assert::IsTrue(regions.Regions().GetItemAt(2)->IsCustom());
|
|
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.CanRemove());
|
|
Assert::IsTrue(regions.CanSave());
|
|
}
|
|
|
|
TEST_METHOD(TestAddNewRegion)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 2U }, regions.Regions().Count());
|
|
|
|
regions.AddNewRegion();
|
|
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x0000-0x1fff"), regions.Regions().GetItemAt(0)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"System RAM"), regions.Regions().GetItemAt(0)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsCustom());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x4000-0x7fff"), regions.Regions().GetItemAt(1)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"Cartridge RAM"), regions.Regions().GetItemAt(1)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsCustom());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x0000-0x0000"), regions.Regions().GetItemAt(2)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"New Custom Region"), regions.Regions().GetItemAt(2)->GetLabel());
|
|
Assert::IsTrue(regions.Regions().GetItemAt(2)->IsCustom());
|
|
|
|
Assert::AreEqual(2, regions.GetSelectedRegionIndex());
|
|
Assert::IsTrue(regions.CanRemove());
|
|
Assert::IsTrue(regions.CanSave());
|
|
}
|
|
|
|
TEST_METHOD(TestRemoveRegion)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.MemoryRegionsModel().AddCustomRegion(0x1200, 0x12FF, L"My region");
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.CanRemove());
|
|
|
|
regions.SetSelectedRegionIndex(1);
|
|
Assert::AreEqual(1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.CanRemove());
|
|
regions.RemoveRegion();
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
Assert::AreEqual(1, regions.GetSelectedRegionIndex());
|
|
|
|
regions.SetSelectedRegionIndex(2);
|
|
Assert::AreEqual(2, regions.GetSelectedRegionIndex());
|
|
Assert::IsTrue(regions.CanRemove());
|
|
regions.RemoveRegion();
|
|
|
|
Assert::AreEqual({ 2U }, regions.Regions().Count());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x0000-0x1fff"), regions.Regions().GetItemAt(0)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"System RAM"), regions.Regions().GetItemAt(0)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsCustom());
|
|
|
|
Assert::AreEqual(std::wstring(L"0x4000-0x7fff"), regions.Regions().GetItemAt(1)->GetRange());
|
|
Assert::AreEqual(std::wstring(L"Cartridge RAM"), regions.Regions().GetItemAt(1)->GetLabel());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsCustom());
|
|
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.CanRemove());
|
|
Assert::IsTrue(regions.CanSave());
|
|
}
|
|
|
|
TEST_METHOD(TestSelectedRegionIndex)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 2U }, regions.Regions().Count());
|
|
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsSelected());
|
|
|
|
regions.SetSelectedRegionIndex(0);
|
|
Assert::AreEqual(0, regions.GetSelectedRegionIndex());
|
|
Assert::IsTrue(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsSelected());
|
|
|
|
regions.SetSelectedRegionIndex(1);
|
|
Assert::AreEqual(1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsTrue(regions.Regions().GetItemAt(1)->IsSelected());
|
|
|
|
regions.SetSelectedRegionIndex(-1);
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsSelected());
|
|
|
|
regions.Regions().GetItemAt(0)->SetSelected(true);
|
|
Assert::AreEqual(0, regions.GetSelectedRegionIndex());
|
|
Assert::IsTrue(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsSelected());
|
|
|
|
regions.Regions().GetItemAt(1)->SetSelected(true);
|
|
Assert::AreEqual(1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsTrue(regions.Regions().GetItemAt(1)->IsSelected());
|
|
|
|
regions.Regions().GetItemAt(1)->SetSelected(false);
|
|
Assert::AreEqual(-1, regions.GetSelectedRegionIndex());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(0)->IsSelected());
|
|
Assert::IsFalse(regions.Regions().GetItemAt(1)->IsSelected());
|
|
}
|
|
|
|
TEST_METHOD(TestInvalidRange)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.MemoryRegionsModel().AddCustomRegion(0x1200, 0x12FF, L"My region");
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
|
|
auto& pRegion = *regions.Regions().GetItemAt(2);
|
|
Assert::AreEqual(std::wstring(L"0x1200-0x12ff"), pRegion.GetRange());
|
|
Assert::AreEqual(std::wstring(L"My region"), pRegion.GetLabel());
|
|
Assert::IsTrue(pRegion.IsCustom());
|
|
Assert::IsFalse(pRegion.IsInvalid());
|
|
|
|
pRegion.SetRange(L"banana");
|
|
Assert::IsTrue(pRegion.IsInvalid());
|
|
Assert::IsFalse(regions.CanSave());
|
|
|
|
pRegion.SetLabel(L"Banana");
|
|
Assert::IsTrue(pRegion.IsInvalid());
|
|
Assert::IsFalse(regions.CanSave());
|
|
|
|
pRegion.SetRange(L"0-$ff");
|
|
Assert::IsFalse(pRegion.IsInvalid());
|
|
Assert::IsTrue(regions.CanSave());
|
|
}
|
|
|
|
TEST_METHOD(TestSaveChanges)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.mockGameContext.SetGameId(1);
|
|
regions.mockGameContext.SetGameTitle(L"Game");
|
|
regions.MemoryRegionsModel().AddCustomRegion(0x1200, 0x12FF, L"My region");
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
|
|
auto& pRegion = *regions.Regions().GetItemAt(2);
|
|
Assert::AreEqual(std::wstring(L"0x1200-0x12ff"), pRegion.GetRange());
|
|
Assert::AreEqual(std::wstring(L"My region"), pRegion.GetLabel());
|
|
pRegion.SetLabel(L"Banana");
|
|
pRegion.SetRange(L"0-$ff");
|
|
|
|
regions.SetDialogResult(ra::ui::DialogResult::OK);
|
|
|
|
Assert::IsTrue(regions.mockLocalStorage.HasStoredData(ra::services::StorageItemType::UserAchievements, L"1"));
|
|
Assert::AreEqual(std::string(
|
|
"0.0.0.0\n"
|
|
"Game\n"
|
|
"M0:0x0000-0x00ff:\"Banana\"\n"
|
|
), regions.mockLocalStorage.GetStoredData(ra::services::StorageItemType::UserAchievements, L"1"));
|
|
}
|
|
|
|
TEST_METHOD(TestDiscardChanges)
|
|
{
|
|
MemoryRegionsViewModelHarness regions;
|
|
regions.mockGameContext.SetGameId(1);
|
|
regions.mockGameContext.SetGameTitle(L"Game");
|
|
regions.MemoryRegionsModel().AddCustomRegion(0x1200, 0x12FF, L"My region");
|
|
regions.MockRegions();
|
|
|
|
Assert::AreEqual({ 3U }, regions.Regions().Count());
|
|
|
|
auto& pRegion = *regions.Regions().GetItemAt(2);
|
|
Assert::AreEqual(std::wstring(L"0x1200-0x12ff"), pRegion.GetRange());
|
|
Assert::AreEqual(std::wstring(L"My region"), pRegion.GetLabel());
|
|
pRegion.SetLabel(L"Banana");
|
|
pRegion.SetRange(L"0-$ff");
|
|
|
|
regions.SetDialogResult(ra::ui::DialogResult::Cancel);
|
|
|
|
Assert::IsFalse(regions.mockLocalStorage.HasStoredData(ra::services::StorageItemType::UserAchievements, L"1"));
|
|
}
|
|
};
|
|
|
|
} // namespace tests
|
|
} // namespace viewmodels
|
|
} // namespace ui
|
|
} // namespace ra
|