mirror of
https://github.com/RetroAchievements/RAIntegration.git
synced 2026-10-12 02:09:25 +00:00
545 lines
22 KiB
C++
545 lines
22 KiB
C++
#include "CppUnitTest.h"
|
|
|
|
#include "ui\viewmodels\TriggerSummaryViewModel.hh"
|
|
|
|
#include "tests\devkit\context\mocks\MockConsoleContext.hh"
|
|
#include "tests\devkit\context\mocks\MockEmulatorMemoryContext.hh"
|
|
#include "tests\devkit\context\mocks\MockUserContext.hh"
|
|
#include "tests\mocks\MockGameContext.hh"
|
|
|
|
#include "ui\EditorTheme.hh"
|
|
|
|
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
|
|
|
namespace ra {
|
|
namespace ui {
|
|
namespace viewmodels {
|
|
namespace tests {
|
|
|
|
TEST_CLASS(TriggerSummaryViewModel_Tests)
|
|
{
|
|
private:
|
|
class TriggerSummaryViewModelHarness : public TriggerSummaryViewModel
|
|
{
|
|
public:
|
|
ra::context::mocks::MockEmulatorMemoryContext mockEmulatorMemoryContext;
|
|
ra::context::mocks::MockUserContext mockUserContext;
|
|
ra::data::context::mocks::MockGameContext mockGameContext;
|
|
|
|
using TriggerSummaryViewModel::InitializeFrom;
|
|
|
|
void InitializeFrom(const std::string& sTrigger)
|
|
{
|
|
const auto nSize = rc_trigger_size(sTrigger.c_str());
|
|
if (nSize > 0)
|
|
{
|
|
m_sTriggerBuffer.resize(nSize);
|
|
rc_trigger_t* pTrigger = rc_parse_trigger(m_sTriggerBuffer.data(), sTrigger.c_str(), nullptr, 0);
|
|
TriggerSummaryViewModel::InitializeFrom(*pTrigger->requirement);
|
|
}
|
|
}
|
|
|
|
void AssertClause(gsl::index nIndex, const std::wstring& sIndices,
|
|
const std::wstring& sReference, const std::wstring& sOperation,
|
|
const std::wstring& sTarget, const std::wstring& sTally = L"")
|
|
{
|
|
const auto* pClause = Clauses().GetItemAt(nIndex);
|
|
Assert::IsNotNull(pClause);
|
|
Assert::AreEqual(sIndices, pClause->GetIndices(), ra::util::String::Printf(L"Indices on clause %u differ", nIndex).c_str());
|
|
Assert::AreEqual(sReference, pClause->GetReference(), ra::util::String::Printf(L"reference on clause %u differ", nIndex).c_str());
|
|
Assert::AreEqual(sOperation, pClause->GetOperation(), ra::util::String::Printf(L"Operation on clause %u differ", nIndex).c_str());
|
|
Assert::AreEqual(sTarget, pClause->GetTarget(), ra::util::String::Printf(L"Target on clause %u differ", nIndex).c_str());
|
|
Assert::AreEqual(sTally, pClause->GetTally(), ra::util::String::Printf(L"Tally on clause %u differ", nIndex).c_str());
|
|
}
|
|
|
|
void AssertHeader(gsl::index nIndex, const std::wstring& sHeader)
|
|
{
|
|
AssertClause(nIndex, L"", sHeader, L"", L"", L"");
|
|
}
|
|
|
|
private:
|
|
std::string m_sTriggerBuffer;
|
|
};
|
|
|
|
public:
|
|
TEST_METHOD(TestSimpleNoNotes)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345!=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"is not", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestSimpleDeltaOnly)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("d0xH1234=5_d0xH2345!=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"last frame was", L"5");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"last frame was not", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestSimplePriorOnly)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("p0xH1234=5_p0xH2345!=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"was", L"5");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"was not", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestSimpleHitTarget)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5.8._0xH2345>d0xH2345.4.");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"is", L"5", L"for 8 frames");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"increased", L"", L"4 times");
|
|
}
|
|
|
|
TEST_METHOD(TestSimpleOnce)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5.1._R:0xH2345=6.1.");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"is", L"5", L"once");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"is", L"6", L""); // once is redundant on a ResetIf
|
|
}
|
|
|
|
TEST_METHOD(TestOnceWithSameAddress)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345=6.1._0xH2345=7");
|
|
|
|
Assert::AreEqual({ 3U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"was", L"6", L"once");
|
|
summary.AssertClause(2, L"3", L"0x2345", L"is", L"7");
|
|
}
|
|
|
|
TEST_METHOD(TestSimpleNote)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.mockGameContext.SetNote({ 0x2345U }, L"[16-bit] Level");
|
|
summary.InitializeFrom("0xH1234=5_0x 2345!=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"World", L"is", L"5");
|
|
summary.AssertClause(1, L"2", L"Level", L"is not", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestEnumNote)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Character (1=Bill, 2=Bob, 3=Betty, 4=Bonnie, 5=Ben)");
|
|
summary.mockGameContext.SetNote({ 0x2345U }, L"Difficulty\r\n0=Easy\r\n1=Normal\r\n2=Hard\r\n");
|
|
summary.InitializeFrom("0xH1234=5_0x 2345!=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Character", L"is", L"Ben");
|
|
summary.AssertClause(1, L"2", L"Difficulty", L"is not", L"Easy");
|
|
}
|
|
|
|
TEST_METHOD(TestEnumNoteGreaterThanZero)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Character (1=Bill, 2=Bob, 3=Betty, 4=Bonnie, 5=Ben)");
|
|
summary.mockGameContext.SetNote({ 0x2345U }, L"Difficulty\r\n0=Easy\r\n1=Normal\r\n2=Hard\r\n");
|
|
summary.InitializeFrom("0xH1234>2_0x 2345>0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Character", L"is greater than", L"Bob");
|
|
summary.AssertClause(1, L"2", L"Difficulty", L"is not", L"Easy"); // >0 converted to !=0
|
|
}
|
|
|
|
TEST_METHOD(TestEnumNoteLessThanOne)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Character (1=Bill, 2=Bob, 3=Betty, 4=Bonnie, 5=Ben)");
|
|
summary.mockGameContext.SetNote({ 0x2345U }, L"Difficulty\r\n0=Easy\r\n1=Normal\r\n2=Hard\r\n");
|
|
summary.InitializeFrom("0xH1234<1_0x 2345<1");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Character", L"is", L"0");
|
|
summary.AssertClause(1, L"2", L"Difficulty", L"is", L"Easy"); // <1 converted to ==0
|
|
}
|
|
|
|
TEST_METHOD(TestIndirectNote)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U },
|
|
L"[32-bit pointer] Player data\r\n"
|
|
L"+0: [32-bit pointer] Class info\r\n"
|
|
L"++4: [32-bit] ID\r\n"
|
|
L"+4: [32-bit] Current HP\r\n"
|
|
L"+8: [32-bit] Max HP");
|
|
summary.InitializeFrom("I:0xX1234_0xX0004=0xX0008_I:0xX1234_I:0xX0000_0xX0004=3");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"Current HP", L"equals", L"Max HP");
|
|
summary.AssertClause(1, L"3-5", L"ID", L"is", L"3");
|
|
}
|
|
|
|
TEST_METHOD(TestMemoryReferenceDeltaSelf)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x2345U }, L"Difficulty\r\n0=Easy\r\n1=Normal\r\n2=Hard\r\n");
|
|
summary.InitializeFrom("0xH1234!=d0xH1234_0x 2345>d0x 2345_0x 2345<d0x 2345_d0x 2345<0x 2345");
|
|
|
|
Assert::AreEqual({ 4U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"0x1234", L"changed", L"");
|
|
summary.AssertClause(1, L"2", L"Difficulty", L"increased", L"");
|
|
summary.AssertClause(2, L"3", L"Difficulty", L"decreased", L"");
|
|
summary.AssertClause(3, L"4", L"Difficulty", L"increased", L"");
|
|
}
|
|
|
|
TEST_METHOD(TestOrNext)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("O:0xH1234=5_0xH2345=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(1, L"OR", L"0x2345", L"is", L"8");
|
|
}
|
|
|
|
TEST_METHOD(TestOrNextAliased)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World\n5=Jupiter");
|
|
summary.mockGameContext.SetNote({ 0x2345U }, L"Open Space Encounter\n8=Merchant");
|
|
summary.InitializeFrom("O:0xH1234=5_0xH2345=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"is", L"Jupiter");
|
|
summary.AssertClause(1, L"OR", L"Open Space Encounter", L"is", L"Merchant");
|
|
}
|
|
|
|
TEST_METHOD(TestOrNextAliasedPointerChain)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"[16-bit pointer]\n+4=World\n5=Jupiter\n+8=Open Space Encounter\n8=Merchant");
|
|
summary.InitializeFrom("I:0x1234_O:0x0004=5_I:0x1234_0x0008=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-4", L"World", L"is", L"Jupiter");
|
|
summary.AssertClause(1, L"OR", L"Open Space Encounter", L"is", L"Merchant");
|
|
}
|
|
|
|
TEST_METHOD(TestAndNext)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("N:0xH1234=5_0xH2345=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(1, L"AND", L"0x2345", L"is", L"8");
|
|
}
|
|
|
|
TEST_METHOD(TestChangedTo)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234=5_d0xH1234!=5");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"changed to", L"5");
|
|
}
|
|
|
|
TEST_METHOD(TestChangedFrom)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234!=5_d0xH1234=5");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"changed from", L"5");
|
|
}
|
|
|
|
TEST_METHOD(TestBitChangedTo)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"b1:Town\r\nb2:World");
|
|
summary.InitializeFrom("0xO1234=1_d0xO1234=0");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"changed to", L"1");
|
|
}
|
|
|
|
TEST_METHOD(TestBitChangedToDeltaFirst)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("d0xO1234=1_0xO1234=0");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"changed to", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestBitChangedToFromExplicit)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234=1_d0xH1234=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"World", L"changed to", L"1");
|
|
summary.AssertClause(1, L"2", L"World", L"changed from", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestBitChangedToFromExplicitDeltaFirst)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("d0xH1234=1_0xH1234=0");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"World", L"changed from", L"1");
|
|
summary.AssertClause(1, L"2", L"World", L"changed to", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestIncreasedTo)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234=5_d0xH1234<5");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"increased to", L"5");
|
|
}
|
|
|
|
TEST_METHOD(TestDecreasedTo)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234=5_d0xH1234>5");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1-2", L"World", L"decreased to", L"5");
|
|
}
|
|
|
|
TEST_METHOD(TestNotEqualTwoValues)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234!=4_0xH1234!=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"World", L"is not", L"4");
|
|
summary.AssertClause(1, L"2", L"World", L"is not", L"8");
|
|
}
|
|
|
|
TEST_METHOD(TestNotEqualTwoEnumValues)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World\r\n4=A\r\n8=B");
|
|
summary.InitializeFrom("0xH1234!=4_0xH1234!=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"World", L"is not", L"A");
|
|
summary.AssertClause(1, L"2", L"World", L"is not", L"B");
|
|
}
|
|
|
|
TEST_METHOD(TestNotEqualOrReset)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"World");
|
|
summary.InitializeFrom("0xH1234!=4_R:0xH1234=8");
|
|
|
|
Assert::AreEqual({ 2U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"World", L"is not", L"4");
|
|
summary.AssertClause(1, L"2", L"World", L"is", L"8"); // Reset will become a header
|
|
}
|
|
|
|
TEST_METHOD(TestMemoryReferenceEqualsOtherMemory)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Current HP");
|
|
summary.mockGameContext.SetNote({ 0x1238U }, L"Max HP");
|
|
summary.InitializeFrom("0xH1234=0xH1238");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Current HP", L"equals", L"Max HP");
|
|
}
|
|
|
|
TEST_METHOD(TestMemoryReferenceNotEqualsOtherMemory)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Current HP");
|
|
summary.mockGameContext.SetNote({ 0x1238U }, L"Max HP");
|
|
summary.InitializeFrom("0xH1234!=0xH1238");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Current HP", L"does not equal", L"Max HP");
|
|
}
|
|
|
|
TEST_METHOD(TestMemoryReferenceLessThanOtherMemory)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Current HP");
|
|
summary.mockGameContext.SetNote({ 0x1238U }, L"Max HP");
|
|
summary.InitializeFrom("0xH1234<0xH1238");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Current HP", L"is less than", L"Max HP");
|
|
}
|
|
|
|
TEST_METHOD(TestMemoryReferenceLessThanOrEqualOtherMemory)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Current HP");
|
|
summary.mockGameContext.SetNote({ 0x1238U }, L"Max HP");
|
|
summary.InitializeFrom("0xH1234<=0xH1238");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Current HP", L"is at most", L"Max HP");
|
|
}
|
|
|
|
TEST_METHOD(TestMemoryReferenceEqualsDeltaOtherMemory)
|
|
{
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.mockGameContext.SetNote({ 0x1234U }, L"Current HP");
|
|
summary.mockGameContext.SetNote({ 0x1238U }, L"Max HP");
|
|
summary.InitializeFrom("0xH1234=d0xH1238");
|
|
|
|
Assert::AreEqual({ 1U }, summary.Clauses().Count());
|
|
summary.AssertClause(0, L"1", L"Current HP", L"equals last frame of", L"Max HP");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersSimple)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345!=0");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 3U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(2, L"2", L"0x2345", L"is not", L"0");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersSimpleWithDelta)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345>d0xH2345");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 4U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"2", L"0x2345", L"increased", L"");
|
|
summary.AssertHeader(2, L"--- WHILE ---");
|
|
summary.AssertClause(3, L"1", L"0x1234", L"is", L"5");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersHitTargetWithReset)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345=6.1._R:0x3456=8.3.");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 6U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertHeader(2, L"--- STARTING WHEN ---");
|
|
summary.AssertClause(3, L"2", L"0x2345", L"is", L"6");
|
|
summary.AssertHeader(4, L"--- FAILING WHEN ---");
|
|
summary.AssertClause(5, L"3", L"0x3456", L"is", L"8", L"for 3 frames");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersMultipleHitTargetsWithReset)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345=6.1._R:0x3456=8.3._0xH4567=4.1.");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 7U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertHeader(2, L"--- STARTING WHEN ---");
|
|
summary.AssertClause(3, L"2", L"0x2345", L"is", L"6", L"once");
|
|
summary.AssertClause(4, L"4", L"0x4567", L"is", L"4", L"once");
|
|
summary.AssertHeader(5, L"--- FAILING WHEN ---");
|
|
summary.AssertClause(6, L"3", L"0x3456", L"is", L"8", L"for 3 frames");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersHitTargetWithResetOnce)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345=6.3._R:0x3456=8.1._R:0x4567!=d0x4567.2.");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 6U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(2, L"2", L"0x2345", L"is", L"6", L"for 3 frames");
|
|
summary.AssertHeader(3, L"--- RESTART WHEN ANY ---"); // header includes ANY when multiple clauses exist
|
|
summary.AssertClause(4, L"3", L"0x3456", L"is", L"8"); // once is redudant on any resetif, not just if there are multiple
|
|
summary.AssertClause(5, L"4", L"0x4567", L"changed", L"", L"twice");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersStartingWhenAndNextWithHitTarget)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_N:0xH2345=6_0x3456=8.3.");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 4U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(2, L"2-3", L"0x2345", L"is", L"6");
|
|
summary.AssertClause(3, L"AND", L"0x3456", L"is", L"8", L"for 3 frames");
|
|
}
|
|
|
|
TEST_METHOD(TestAddHeadersAssumeHitTargetGreaterThanOneIsTriggerWhenSingleHitTargetsExist)
|
|
{
|
|
ra::ui::EditorTheme pTheme;
|
|
ra::services::ServiceLocator::ServiceOverride<ra::ui::EditorTheme> pThemeOverride(&pTheme);
|
|
|
|
TriggerSummaryViewModelHarness summary;
|
|
summary.InitializeFrom("0xH1234=5_0xH2345=6.1._0x3456=8.3._R:0x4567=4");
|
|
summary.AddHeaders();
|
|
|
|
Assert::AreEqual({ 7U }, summary.Clauses().Count());
|
|
summary.AssertHeader(0, L"--- TRIGGER WHEN ---");
|
|
summary.AssertClause(1, L"1", L"0x1234", L"is", L"5");
|
|
summary.AssertClause(2, L"3", L"0x3456", L"is", L"8", L"for 3 frames");
|
|
summary.AssertHeader(3, L"--- STARTING WHEN ---");
|
|
summary.AssertClause(4, L"2", L"0x2345", L"is", L"6");
|
|
summary.AssertHeader(5, L"--- FAILING WHEN ---");
|
|
summary.AssertClause(6, L"4", L"0x4567", L"is", L"4");
|
|
}
|
|
};
|
|
|
|
} // namespace tests
|
|
} // namespace viewmodels
|
|
} // namespace ui
|
|
} // namespace ra
|