diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d9e6b6345..f6b2d12d2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -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) diff --git a/tests/oracle/CMakeLists.txt b/tests/oracle/CMakeLists.txt new file mode 100644 index 000000000..da021a971 --- /dev/null +++ b/tests/oracle/CMakeLists.txt @@ -0,0 +1,19 @@ +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) diff --git a/tests/oracle/parse_cipt_test.cpp b/tests/oracle/parse_cipt_test.cpp new file mode 100644 index 000000000..f5036f962 --- /dev/null +++ b/tests/oracle/parse_cipt_test.cpp @@ -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(); +}