From cc47009198d29a762ca5556847d47b88f32a3290 Mon Sep 17 00:00:00 2001 From: Christian Daniel Jensen Date: Mon, 2 Nov 2026 05:54:41 -0700 Subject: [PATCH] Add regression tests for all fifteen Essence symbols and native XML properties --- tests/essence_types_test.cpp | 57 ++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 tests/essence_types_test.cpp diff --git a/tests/essence_types_test.cpp b/tests/essence_types_test.cpp new file mode 100644 index 000000000..5fbefdc20 --- /dev/null +++ b/tests/essence_types_test.cpp @@ -0,0 +1,57 @@ +#include +#include +#include + +#include +#include + +TEST(EssenceTypesTest, HasExactlyFifteenCanonicalSymbols) +{ + EXPECT_EQ(Essence::symbols(), QStringLiteral("MSOGEAQCBRLVTPN")); + EXPECT_EQ(Essence::symbols().size(), 15); + EXPECT_TRUE(Essence::isSymbol(QChar('N'))); // N is colorless. + EXPECT_FALSE(Essence::isSymbol(QChar('W'))); // MTG white is not Essence. + EXPECT_FALSE(Essence::isSymbol(QChar('U'))); // MTG blue is not Essence. +} + +TEST(EssenceTypesTest, ParsesAllBracedAndUnbracedTypes) +{ + const QString raw = QStringLiteral("{M}{S}{O}{G}{E}{A}{Q}{C}{B}{R}{L}{V}{T}{P}{N}"); + EXPECT_EQ(Essence::parseCost(raw).join(QString()), Essence::symbols()); + EXPECT_EQ(Essence::parseCost(QStringLiteral("MSN")).join(QString()), QStringLiteral("MSN")); + EXPECT_EQ(Essence::parseCost(QStringLiteral("{2}{N}{M}")).join(QStringLiteral("|")), + QStringLiteral("2|N|M")); +} + +TEST(EssenceTypesTest, RejectsUnknownLegacyAndHybridCodes) +{ + EXPECT_TRUE(Essence::parseCost(QStringLiteral("{W}{U}{Z}{M/N}")).isEmpty()); + EXPECT_EQ(Essence::parseCost(QStringLiteral("{N}")), QStringList{QStringLiteral("N")}); +} + +TEST(EssenceTypesTest, NormalizesUniqueIdentityInCanonicalOrder) +{ + EXPECT_EQ(Essence::normalizeIdentity(QStringLiteral("NSSMMO")), QStringLiteral("MSON")); + EXPECT_EQ(Essence::normalizeIdentity(QStringLiteral("N")), QStringLiteral("N")); + EXPECT_EQ(Essence::normalizeIdentity(QStringLiteral("WU")), QString()); +} + +TEST(EssenceTypesTest, NativePropertiesTakePrecedenceOverLegacyFallbacks) +{ + const QHash props = { + {QStringLiteral("essencecost"), QStringLiteral("{M}{N}")}, + {QStringLiteral("essence"), QStringLiteral("NM")}, + {QStringLiteral("essencevalue"), QStringLiteral("2")}, + {QStringLiteral("manacost"), QStringLiteral("{W}{U}")}, + {QStringLiteral("colors"), QStringLiteral("WU")}, + {QStringLiteral("cmc"), QStringLiteral("9")} + }; + + const CardInfoPtr card = CardInfo::newInstance(QStringLiteral("Essence Test"), + QString(), false, props, {}, {}, {}, {}); + ASSERT_TRUE(card); + EXPECT_EQ(card->getManaCost(), QStringLiteral("{M}{N}")); + EXPECT_EQ(card->getEssenceTypes(), QStringLiteral("MN")); + EXPECT_EQ(card->getColors(), QStringLiteral("MN")); + EXPECT_EQ(card->getCmc(), QStringLiteral("2")); +}