servatrice/tests/loading_from_clipboard/loading_from_clipboard_test.cpp
2018-02-06 08:45:13 -05:00

237 lines
No EOL
8 KiB
C++

#include "loading_from_clipboard_test.h"
#include "../../common/decklist.h"
#include "gtest/gtest.h"
#include <QTextStream>
DeckList *fromClipboard(QString *clipboard);
DeckList *fromClipboard(QString *clipboard)
{
DeckList *deckList = new DeckList;
QTextStream *stream = new QTextStream(clipboard);
deckList->loadFromStream_Plain(*stream);
return deckList;
}
using CardRows = QMap<QString, int>;
struct DecklistBuilder
{
CardRows actualMainboard;
CardRows actualSideboard;
explicit DecklistBuilder() : actualMainboard({}), actualSideboard({})
{
}
void operator()(const InnerDecklistNode *innerDecklistNode, const DecklistCardNode *card)
{
if (innerDecklistNode->getName() == DECK_ZONE_MAIN) {
actualMainboard[card->getName()] += card->getNumber();
} else if (innerDecklistNode->getName() == DECK_ZONE_SIDE) {
actualSideboard[card->getName()] += card->getNumber();
} else {
FAIL();
}
}
CardRows mainboard()
{
return actualMainboard;
}
CardRows sideboard()
{
return actualSideboard;
}
};
namespace
{
TEST(LoadingFromClipboardTest, EmptyDeck)
{
DeckList *deckList = fromClipboard(new QString(""));
ASSERT_TRUE(deckList->getCardList().isEmpty());
}
TEST(LoadingFromClipboardTest, EmptySideboard)
{
DeckList *deckList = fromClipboard(new QString("Sideboard"));
ASSERT_TRUE(deckList->getCardList().isEmpty());
}
TEST(LoadingFromClipboardTest, QuantityPrefixed)
{
QString *clipboard = new QString("1 Mountain\n"
"2x Island\n"
"3X FOREST\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows({{"mountain", 1}, {"island", 2}, {"forest", 3}});
CardRows expectedSideboard = CardRows({});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, CommentsAreIgnored)
{
QString *clipboard = new QString("//1 Mountain\n"
"//2x Island\n"
"//SB:2x Island\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows({});
CardRows expectedSideboard = CardRows({});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, SideboardPrefix)
{
QString *clipboard = new QString("1 Mountain\n"
"SB: 1 Mountain\n"
"SB: 2x Island\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows({{"mountain", 1}});
CardRows expectedSideboard = CardRows({{"mountain", 1}, {"island", 2}});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, UnknownCardsAreNotDiscarded)
{
QString *clipboard = new QString("1 CardThatDoesNotExistInCardsXml\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows({{"cardthatdoesnotexistincardsxml", 1}});
CardRows expectedSideboard = CardRows({});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, RemoveBlankEntriesFromBeginningAndEnd)
{
QString *clipboard = new QString("\n"
"\n"
"\n"
"1x Algae Gharial\n"
"3x CardThatDoesNotExistInCardsXml\n"
"2x Phelddagrif\n"
"\n"
"\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard =
CardRows({{"algae gharial", 1}, {"cardthatdoesnotexistincardsxml", 3}, {"phelddagrif", 2}});
CardRows expectedSideboard = CardRows({});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, UseFirstBlankIfOnlyOneBlankToSplitSideboard)
{
QString *clipboard = new QString("1x Algae Gharial\n"
"3x CardThatDoesNotExistInCardsXml\n"
"\n"
"2x Phelddagrif\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows({{"algae gharial", 1}, {"cardthatdoesnotexistincardsxml", 3}});
CardRows expectedSideboard = CardRows({{"phelddagrif", 2}});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, IfMultipleScatteredBlanksAllMainBoard)
{
QString *clipboard = new QString("1x Algae Gharial\n"
"3x CardThatDoesNotExistInCardsXml\n"
"\n"
"2x Phelddagrif\n"
"\n"
"3 Giant Growth\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows(
{{"algae gharial", 1}, {"cardthatdoesnotexistincardsxml", 3}, {"phelddagrif", 2}, {"giant growth", 3}});
CardRows expectedSideboard = CardRows({});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
TEST(LoadingFromClipboardTest, LotsOfStuffInBulkTesting)
{
QString *clipboard = new QString("\n"
"\n"
"\n"
"1x test1\n"
"testNoValueMB\n"
"2x test2\n"
"SB: 10 testSB\n"
"3 test3\n"
"4X test4\n"
"\n"
"\n"
"\n"
"\n"
"5x test5\n"
"6X test6\n"
"testNoValueSB\n"
"\n"
"\n"
"\n"
"\n");
DeckList *deckList = fromClipboard(clipboard);
DecklistBuilder decklistBuilder = DecklistBuilder();
deckList->forEachCard(decklistBuilder);
CardRows expectedMainboard = CardRows({{"test1", 1}, {"test2", 2}, {"test3", 3}, {"test4", 4}, {"testnovaluemb", 1}
});
CardRows expectedSideboard = CardRows({{"testsb", 10}, {"test5", 5}, {"test6", 6}, {"testnovaluesb", 1}
});
ASSERT_EQ(expectedMainboard, decklistBuilder.mainboard());
ASSERT_EQ(expectedSideboard, decklistBuilder.sideboard());
}
} // namespace
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}