Update cipt parsing (#5712)

* refactor

* move thing out

* write unit tests

* get thing to work

* optimization?

* fix build failure
This commit is contained in:
RickyRister 2025-03-14 18:44:13 -07:00 committed by GitHub
parent 068465143b
commit 3a11ccb854
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 305 additions and 3 deletions

View file

@ -51,3 +51,4 @@ target_link_libraries(password_hash_test cockatrice_common Threads::Threads ${GT
add_subdirectory(carddatabase)
add_subdirectory(loading_from_clipboard)
add_subdirectory(oracle)

View file

@ -0,0 +1,11 @@
add_executable(parse_cipt_test ../../oracle/src/parsehelpers.cpp parse_cipt_test.cpp)
if(NOT GTEST_FOUND)
add_dependencies(parse_cipt_test gtest)
endif()
set(TEST_QT_MODULES ${COCKATRICE_QT_VERSION_NAME}::Widgets)
target_link_libraries(parse_cipt_test cockatrice_common Threads::Threads ${GTEST_BOTH_LIBRARIES} ${TEST_QT_MODULES})
add_test(NAME parse_cipt_test COMMAND parse_cipt_test)

View file

@ -0,0 +1,219 @@
#include "../../oracle/src/parsehelpers.h"
#include "gtest/gtest.h"
TEST(ParseCiptTest, parsesThisEntersTapped)
{
auto name = "Boring Fields";
auto text = "This land enters tapped.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesThisEntersTheBattlefieldTapped)
{
auto name = "Boring Fields";
auto text = "This land enters the battlefield tapped.\n"
"{T}: Add {G}.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesItEntersTappedAtEndOfSentence)
{
auto name = "Shocking Fields";
auto text = "As this land enters, you may pay 2 life. If you don't, it enters tapped.\n"
"{T}: Add {G}.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesThisEntersTappedWhenNotOnFirstLine)
{
auto name = "Boring Fields";
auto text = "Flying\n"
"This land enters tapped.\n"
"{T}: Add {G}.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesFullNameWithUnderscoreAppendedText)
{
auto name = "Boring Fields_SL50";
auto text = "Boring Fields enters tapped.\n"
"{T}: Add {G}.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesFullNameWithBracketsAppendedText)
{
auto name = "Boring Fields (SL50)";
auto text = "Boring Fields enters tapped.\n"
"{T}: Add {G}.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesFullNameWithComma)
{
auto name = "Bob, the Legend";
auto text = "Bob, the Legend enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesFullNameWithCommaAtEndOfSentence)
{
auto name = "Bob, the Legend";
auto text = "As Bob, the Legend enters, you may pay 2 life. If you don't, Bob, the Legend enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesFullNameWithApostropheAtEndOfSentence)
{
auto name = "Bob's Bobber";
auto text = "As Bob's Bobber enters, you may pay 2 life. If you don't, Bob's Bobber enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesShortnameEndingWithComma)
{
auto name = "Bob, the Legend";
auto text = "Bob enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesShortnameEndingWithSpace)
{
auto name = "Bob the Legend";
auto text = "Bob enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesMultiWordShortnameEndingWithComma)
{
auto name = "Bob Dod, the Legend";
auto text = "Bob Dod enters tapped.\n"
"Whenever Bob Dod attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesMultiWordShortnameEndingWithSpace)
{
auto name = "Bob Dod the Legend";
auto text = "Bob Dod enters tapped.\n"
"Whenever Bob Dod attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesShortnameEndingWithSpaceWithUnderscoreAppendedText)
{
auto name = "Bob the Legend_SL50";
auto text = "Bob enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesShortnameEndingWithSpaceWithBracketsAppendedText)
{
auto name = "Bob the Legend (SL50)";
auto text = "Bob enters tapped.\n"
"Whenever Bob attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesMultiWordShortnameEndingWithSpaceWithUnderscoreAppendedText)
{
auto name = "Bob Dod the Legend_SL50";
auto text = "Bob Dod enters tapped.\n"
"Whenever Bob Dod attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesMultiWordShortnameEndingWithSpaceWithBracketsAppendedText)
{
auto name = "Bob Dod the Legend (SL50)";
auto text = "Bob Dod enters tapped.\n"
"Whenever Bob Dod attacks, you win the game.";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, rejectsEmptyText)
{
auto name = "Vanilla Dude";
auto text = "";
ASSERT_FALSE(parseCipt(name, text));
}
TEST(ParseCiptTest, rejectsEntersTappedUnless)
{
auto name = "Fast Fields";
auto text = "This land enters tapped unless you control another land.";
ASSERT_FALSE(parseCipt(name, text));
}
TEST(ParseCiptTest, rejectsWhenNameIsDifferent)
{
auto name = "Boring Fields";
auto text = "Fast Fields enters tapped.";
ASSERT_FALSE(parseCipt(name, text));
}
TEST(ParseCiptTest, rejectsOtherCreaturesEnterTapped)
{
auto name = "Imposing Guy";
auto text = "Other creatures enter tapped.";
ASSERT_FALSE(parseCipt(name, text));
}
TEST(ParseCiptTest, rejectsAbilityGrantingEntersTapped)
{
auto name = "Imposing Guy";
auto text = "Other creatures have \"This creature enters tapped\".";
ASSERT_FALSE(parseCipt(name, text));
}
TEST(ParseCiptTest, parsesEntersTappedAndAbilityGrantingEntersTappedOnSameCard)
{
auto name = "Imposing Guy";
auto text = "This creature enters tapped."
"Other creatures have \"This creature enters tapped\".";
ASSERT_TRUE(parseCipt(name, text));
}
TEST(ParseCiptTest, rejectsItEntersTappedAndAttacking)
{
auto name = "Token Maker";
auto text = "When Token Maker attacks, create a token. It enters tapped and attacking.";
ASSERT_FALSE(parseCipt(name, text));
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}