#include #include #include namespace { PlaymatInfo makePlaymatInfo(const QString &name, const QString &providerId = QString()) { PlaymatInfo info; info.card = {name, providerId}; return info; } } // namespace TEST(PlaymatResolverTest, EmptyChainReturnsEmpty) { DeckList deck; const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, {}, PlaymatFallbackModeFixed, 0); EXPECT_TRUE(resolved.card.isEmpty()); } TEST(PlaymatResolverTest, OverrideWinsOverDeckAndFallback) { DeckList deck; deck.setPlaymat({{QStringLiteral("Deck Mat"), QStringLiteral("deck-provider")}, {}}); const PlaymatInfo force = makePlaymatInfo(QStringLiteral("Force Mat"), QStringLiteral("force-provider")); const QList fallback = {makePlaymatInfo(QStringLiteral("Fallback Mat"))}; const PlaymatInfo resolved = resolveEffectivePlaymat(deck, force, fallback, PlaymatFallbackModeFixed, 0); EXPECT_EQ(resolved.card.name, QStringLiteral("Force Mat")); EXPECT_EQ(resolved.card.providerId, QStringLiteral("force-provider")); } TEST(PlaymatResolverTest, DeckWinsOverFallback) { DeckList deck; deck.setPlaymat({{QStringLiteral("Deck Mat"), QStringLiteral("deck-provider")}, {0.1, 0.2, 0.3, 1.5}}); const QList fallback = {makePlaymatInfo(QStringLiteral("Fallback Mat"))}; const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, fallback, PlaymatFallbackModeFixed, 0); EXPECT_EQ(resolved.card.name, QStringLiteral("Deck Mat")); EXPECT_EQ(resolved.card.providerId, QStringLiteral("deck-provider")); EXPECT_DOUBLE_EQ(resolved.params.marginPctL, 0.1); EXPECT_DOUBLE_EQ(resolved.params.verticalOffset, 0.3); } TEST(PlaymatResolverTest, FallbackUsedWhenDeckHasNone) { DeckList deck; const QList fallback = {makePlaymatInfo(QStringLiteral("Fallback Mat"))}; const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, fallback, PlaymatFallbackModeFixed, 0); EXPECT_EQ(resolved.card.name, QStringLiteral("Fallback Mat")); } TEST(PlaymatResolverTest, FixedAlwaysUsesFirst) { DeckList deck; const QList fallback = {makePlaymatInfo(QStringLiteral("First")), makePlaymatInfo(QStringLiteral("Second"))}; for (int i = 0; i < 5; ++i) { const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, fallback, PlaymatFallbackModeFixed, i); EXPECT_EQ(resolved.card.name, QStringLiteral("First")); } } TEST(PlaymatResolverTest, RoundRobinCyclesAndWraps) { DeckList deck; const QList fallback = {makePlaymatInfo(QStringLiteral("First")), makePlaymatInfo(QStringLiteral("Second")), makePlaymatInfo(QStringLiteral("Third"))}; const QStringList expected = {QStringLiteral("First"), QStringLiteral("Second"), QStringLiteral("Third"), QStringLiteral("First"), QStringLiteral("Second"), QStringLiteral("Third")}; for (int i = 0; i < expected.size(); ++i) { const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, fallback, PlaymatFallbackModeRoundRobin, i); EXPECT_EQ(resolved.card.name, expected.at(i)); } } TEST(PlaymatResolverTest, RoundRobinRespectsCursor) { DeckList deck; const QList fallback = {makePlaymatInfo(QStringLiteral("First")), makePlaymatInfo(QStringLiteral("Second"))}; const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, fallback, PlaymatFallbackModeRoundRobin, 5); EXPECT_EQ(resolved.card.name, QStringLiteral("Second")); // 5 % 2 == 1 } TEST(PlaymatResolverTest, RandomStaysWithinList) { DeckList deck; const QList fallback = {makePlaymatInfo(QStringLiteral("First")), makePlaymatInfo(QStringLiteral("Second")), makePlaymatInfo(QStringLiteral("Third"))}; for (int i = 0; i < 50; ++i) { const PlaymatInfo resolved = resolveEffectivePlaymat(deck, {}, fallback, PlaymatFallbackModeRandom, i); ASSERT_FALSE(resolved.card.name.isEmpty()); EXPECT_TRUE(fallback.contains(resolved)); } } TEST(PlaymatResolverTest, ForceWithEmptyCardIgnoresFallbackParamsButNotFallback) { DeckList deck; deck.setPlaymat({{QStringLiteral("Deck Mat")}, {}}); // An empty force entry must not mask the deck-configured playmat. const PlaymatInfo emptyForce; const PlaymatInfo resolved = resolveEffectivePlaymat(deck, emptyForce, {}, PlaymatFallbackModeFixed, 0); EXPECT_EQ(resolved.card.name, QStringLiteral("Deck Mat")); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }