Skip to content

Commit

Permalink
tests: add tests for CLI printers
Browse files Browse the repository at this point in the history
  • Loading branch information
Bionus committed Jan 7, 2023
1 parent bbe27ca commit a5e9ded
Show file tree
Hide file tree
Showing 7 changed files with 241 additions and 14 deletions.
6 changes: 4 additions & 2 deletions src/cli/src/cli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <QSettings>
#include <QString>
#include <QStringList>
#include <QTextStream>
#include <QTimer>
#include <QUrl>
#include "cli.h"
Expand Down Expand Up @@ -163,9 +164,10 @@ int parseAndRunCliArgs(QCoreApplication *app, Profile *profile, bool defaultToGu
}
}

QTextStream stream(stdout);
Printer *printer = parser.isSet(jsonOption)
? (Printer*) new JsonPrinter(profile)
: (Printer*) new SimplePrinter(parser.value(tagsFormatOption));
? (Printer*) new JsonPrinter(&stream, profile)
: (Printer*) new SimplePrinter(&stream, parser.value(tagsFormatOption));

CliCommand *cmd = nullptr;

Expand Down
12 changes: 6 additions & 6 deletions src/cli/src/printers/json-printer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@
#include "tags/tag.h"


JsonPrinter::JsonPrinter(Profile *profile)
: m_profile(profile)
JsonPrinter::JsonPrinter(QTextStream *stream, Profile *profile)
: m_stream(stream), m_profile(profile)
{}


void JsonPrinter::print(int val) const
{
print(QString::number(val));
*m_stream << val << Qt::endl;
}

void JsonPrinter::print(const QString &val) const
{
QTextStream(stdout) << qPrintable(val);
*m_stream << val << Qt::endl;
}


Expand Down Expand Up @@ -71,7 +71,7 @@ void JsonPrinter::printArray(const QJsonArray &array) const
jsonDoc.setArray(array);

const QByteArray jsonResult = jsonDoc.toJson(QJsonDocument::Indented);
QTextStream(stdout) << qPrintable(jsonResult);
*m_stream << jsonResult;
}

void JsonPrinter::printObject(const QJsonObject &object) const
Expand All @@ -80,7 +80,7 @@ void JsonPrinter::printObject(const QJsonObject &object) const
jsonDoc.setObject(object);

const QByteArray jsonResult = jsonDoc.toJson(QJsonDocument::Indented);
QTextStream(stdout) << qPrintable(jsonResult);
*m_stream << jsonResult;
}


Expand Down
4 changes: 3 additions & 1 deletion src/cli/src/printers/json-printer.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ class Image;
class Profile;
class QJsonArray;
class QJsonObject;
class QTextStream;
class Site;
class Tag;

class JsonPrinter : public Printer
{
public:
explicit JsonPrinter(Profile *profile);
explicit JsonPrinter(QTextStream *stream, Profile *profile);

void print(int val) const override;
void print(const QString &val) const override;
Expand All @@ -32,6 +33,7 @@ class JsonPrinter : public Printer
QJsonObject serializeImage(const Image &image) const;

private:
QTextStream *m_stream;
Profile *m_profile;
};

Expand Down
9 changes: 5 additions & 4 deletions src/cli/src/printers/simple-printer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <QList>
#include <QSharedPointer>
#include <QString>
#include <QTextStream>
#include <iostream>
#include <utility>
#include "logger.h"
Expand All @@ -10,19 +11,19 @@
#include "tags/tag.h"


SimplePrinter::SimplePrinter(QString tagsFormat)
: m_tagsFormat(std::move(tagsFormat))
SimplePrinter::SimplePrinter(QTextStream *stream, QString tagsFormat)
: m_stream(stream), m_tagsFormat(std::move(tagsFormat))
{}


void SimplePrinter::print(int val) const
{
std::cout << val << std::endl;
*m_stream << val << Qt::endl;
}

void SimplePrinter::print(const QString &val) const
{
std::cout << val.toStdString() << std::endl;
*m_stream << val << Qt::endl;
}


Expand Down
4 changes: 3 additions & 1 deletion src/cli/src/printers/simple-printer.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@

class Image;
class Profile;
class QTextStream;
class Site;
class Tag;

class SimplePrinter : public Printer
{
public:
explicit SimplePrinter(QString tagsFormat);
explicit SimplePrinter(QTextStream *stream, QString tagsFormat);

void print(int val) const override;
void print(const QString &val) const override;
Expand All @@ -26,6 +27,7 @@ class SimplePrinter : public Printer
void print(const QList<Tag> &tags, Site *site) const override;

private:
QTextStream *m_stream;
QString m_tagsFormat;
};

Expand Down
123 changes: 123 additions & 0 deletions src/cli/tests/printers/json-printer-test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#include "catch.h"
#include <QList>
#include <QTextStream>
#include "models/image.h"
#include "models/profile.h"
#include "printers/json-printer.h"
#include "source-helpers.h"
#include "tags/tag.h"


TEST_CASE("JsonPrinter")
{
setupSource("Danbooru (2.0)");
setupSite("Danbooru (2.0)", "danbooru.donmai.us");
const QScopedPointer<Profile> profile(makeProfile());
Site *site = profile->getSites().value("danbooru.donmai.us");

QString output;
QTextStream stream(&output);
JsonPrinter printer(&stream, profile.data());

SECTION("Print int")
{
SECTION("Zero")
{
printer.print(0);
REQUIRE(output == "0\n");
}

SECTION("Positive")
{
printer.print(123);
REQUIRE(output == "123\n");
}

SECTION("Negative")
{
printer.print(-123);
REQUIRE(output == "-123\n");
}
}

SECTION("Print string")
{
SECTION("Empty string")
{
printer.print("");
REQUIRE(output == "\n");
}

SECTION("Simple string")
{
printer.print("test");
REQUIRE(output == "test\n");
}
}

SECTION("Print image")
{
Image image(site, {{ "id", "123" }, { "md5", "test_md5" }, { "file_url", "https://test.com/image.jpg" }}, profile.data());

printer.print(image);
REQUIRE(output.contains(R"("id": "123",)"));
REQUIRE(output.contains(R"("md5": "test_md5",)"));
REQUIRE(output.contains(R"("url_file": "https://test.com/image.jpg",)"));
}

SECTION("Print images")
{
QList<QSharedPointer<Image>> images {
QSharedPointer<Image>(new Image(site, {{ "id", "123" }, { "md5", "test_md5_1" }, { "file_url", "https://test.com/image_1.jpg" }}, profile.data())),
QSharedPointer<Image>(new Image(site, {{ "id", "456" }, { "md5", "test_md5_2" }, { "file_url", "https://test.com/image_2.jpg" }}, profile.data())),
QSharedPointer<Image>(new Image(site, {{ "id", "789" }, { "md5", "test_md5_3" }, { "file_url", "https://test.com/image_3.jpg" }}, profile.data())),
};

printer.print(images);
REQUIRE(output.contains(R"("id": "123",)"));
REQUIRE(output.contains(R"("id": "456",)"));
REQUIRE(output.contains(R"("id": "789",)"));
}

SECTION("Print tag")
{
Tag tag("test_tag", "artist", 123);

printer.print(tag, site);
REQUIRE(output == R"({
"count": 123,
"text": "test_tag",
"type": "artist"
}
)");
}

SECTION("Print tags")
{
QList<Tag> tags {
Tag("test_tag_1", "artist", 123),
Tag("test_tag_2", "general", 45),
Tag("test_tag_3", "copyright", 678),
};

printer.print(tags, site);
REQUIRE(output == R"([
{
"count": 123,
"text": "test_tag_1",
"type": "artist"
},
{
"count": 45,
"text": "test_tag_2",
"type": "general"
},
{
"count": 678,
"text": "test_tag_3",
"type": "copyright"
}
]
)");
}
}
97 changes: 97 additions & 0 deletions src/cli/tests/printers/simple-printer-test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#include "catch.h"
#include <QList>
#include <QTextStream>
#include "models/image.h"
#include "models/profile.h"
#include "printers/simple-printer.h"
#include "source-helpers.h"
#include "tags/tag.h"


TEST_CASE("SimplePrinter")
{
setupSource("Danbooru (2.0)");
setupSite("Danbooru (2.0)", "danbooru.donmai.us");
const QScopedPointer<Profile> profile(makeProfile());
Site *site = profile->getSites().value("danbooru.donmai.us");

QString output;
QTextStream stream(&output);
SimplePrinter printer(&stream, "%tag\t%count\t%type");

SECTION("Print int")
{
SECTION("Zero")
{
printer.print(0);
REQUIRE(output == "0\n");
}

SECTION("Positive")
{
printer.print(123);
REQUIRE(output == "123\n");
}

SECTION("Negative")
{
printer.print(-123);
REQUIRE(output == "-123\n");
}
}

SECTION("Print string")
{
SECTION("Empty string")
{
printer.print("");
REQUIRE(output == "\n");
}

SECTION("Simple string")
{
printer.print("test");
REQUIRE(output == "test\n");
}
}

SECTION("Print image")
{
Image image(site, {{ "id", "123" }, { "md5", "test_md5" }, { "file_url", "https://test.com/image.jpg" }}, profile.data());

printer.print(image);
REQUIRE(output == "https://test.com/image.jpg\n");
}

SECTION("Print images")
{
QList<QSharedPointer<Image>> images {
QSharedPointer<Image>(new Image(site, {{ "id", "123" }, { "md5", "test_md5_1" }, { "file_url", "https://test.com/image_1.jpg" }}, profile.data())),
QSharedPointer<Image>(new Image(site, {{ "id", "456" }, { "md5", "test_md5_2" }, { "file_url", "https://test.com/image_2.jpg" }}, profile.data())),
QSharedPointer<Image>(new Image(site, {{ "id", "789" }, { "md5", "test_md5_3" }, { "file_url", "https://test.com/image_3.jpg" }}, profile.data())),
};

printer.print(images);
REQUIRE(output == "https://test.com/image_1.jpg\nhttps://test.com/image_2.jpg\nhttps://test.com/image_3.jpg\n");
}

SECTION("Print tag")
{
Tag tag("test_tag", "artist", 123);

printer.print(tag, site);
REQUIRE(output == "test_tag\t123\tartist\n");
}

SECTION("Print tags")
{
QList<Tag> tags {
Tag("test_tag_1", "artist", 123),
Tag("test_tag_2", "general", 45),
Tag("test_tag_3", "copyright", 678),
};

printer.print(tags, site);
REQUIRE(output == "test_tag_1\t123\tartist\ntest_tag_2\t45\tgeneral\ntest_tag_3\t678\tcopyright\n");
}
}

0 comments on commit a5e9ded

Please sign in to comment.