diff options
author | Alexander Batischev <eual.jp@gmail.com> | 2019-07-27 20:08:45 +0300 |
---|---|---|
committer | Alexander Batischev <eual.jp@gmail.com> | 2019-07-27 20:11:44 +0300 |
commit | 3a412e9a09bcc0f64d4839735efd88392a40b08a (patch) | |
tree | de1e29c454f1a41a6631a0a597e253f483bf975c /test/feedcontainer.cpp | |
parent | 3621c68f9006110db3e4ae4a83725fadb68baa2a (diff) |
Add tests for new FeedContainer methods
Diffstat (limited to 'test/feedcontainer.cpp')
-rw-r--r-- | test/feedcontainer.cpp | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/test/feedcontainer.cpp b/test/feedcontainer.cpp index 9fcd552a..aa9fc85b 100644 --- a/test/feedcontainer.cpp +++ b/test/feedcontainer.cpp @@ -552,3 +552,297 @@ TEST_CASE("unread_item_count() returns number of unread items in all feeds", REQUIRE(feedcontainer.unread_item_count() == 4); } + +TEST_CASE("get_unread_feed_count_per_tag returns 0 if there are no feeds " + "with given tag", + "[FeedContainer]") +{ + FeedContainer feedcontainer; + + SECTION("Empty FeedContainer") { + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("unknown") == 0); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("test") == 0); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("with space") == 0); + } + + SECTION("Non-empty FeedContainer, but no feeds are tagged") { + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + feedcontainer.add_feed(std::make_shared<RssFeed>(&rsscache)); + feedcontainer.add_feed(std::make_shared<RssFeed>(&rsscache)); + feedcontainer.add_feed(std::make_shared<RssFeed>(&rsscache)); + + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("unknown") == 0); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("test") == 0); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("with space") == 0); + } + + SECTION("Non-empty FeedContainer, no feeds are tagged with our desired tag") { + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + auto feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({"one", "two", "three"}); + feedcontainer.add_feed(feed); + + feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({"some", "different", "tags"}); + feedcontainer.add_feed(feed); + + feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({"here's one with spaces"}); + feedcontainer.add_feed(feed); + + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("unknown") == 0); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("test") == 0); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag("with space") == 0); + } +} + +TEST_CASE("get_unread_feed_count_per_tag returns 0 if feeds with given tag " + "contain no unread items", + "[FeedContainer]") +{ + FeedContainer feedcontainer; + + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + const auto desired_tag = std::string("target"); + const auto different_tag = std::string("something else entirely"); + + auto feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({desired_tag}); + for (int i = 0; i < 10; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(false); + feed->add_item(item); + } + feedcontainer.add_feed(feed); + + feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({different_tag}); + for (int i = 0; i < 5; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(true); + feed->add_item(item); + } + for (int i = 0; i < 5; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(false); + feed->add_item(item); + } + feedcontainer.add_feed(feed); + + REQUIRE(feedcontainer.get_unread_feed_count_per_tag(desired_tag) == 0); +} + +TEST_CASE("get_unread_feed_count_per_tag returns the number of feeds that have " + "a given tag and also have unread items", + "[FeedContainer]") +{ + FeedContainer feedcontainer; + + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + const auto desired_tag = std::string("target"); + const auto different_tag = std::string("something else entirely"); + + const auto add_feed_with_tag_and_unreads = + [&feedcontainer, &rsscache] + (std::string tag, unsigned int unreads) { + auto feed = std::make_shared<RssFeed>(&rsscache); + + feed->set_tags({tag}); + + for (unsigned int i = 0; i < unreads; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(true); + feed->add_item(item); + } + for (int i = 0; i < 10; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(false); + feed->add_item(item); + } + + feedcontainer.add_feed(std::move(feed)); + }; + + SECTION("One feed") { + add_feed_with_tag_and_unreads(different_tag, 1); + add_feed_with_tag_and_unreads(desired_tag, 1); + REQUIRE(feedcontainer.get_unread_feed_count_per_tag(desired_tag) + == 1); + } + + SECTION("Two feeds") { + add_feed_with_tag_and_unreads(different_tag, 4); + + add_feed_with_tag_and_unreads(desired_tag, 5); + add_feed_with_tag_and_unreads(desired_tag, 8); + + REQUIRE(feedcontainer.get_unread_feed_count_per_tag(desired_tag) + == 2); + } + + SECTION("Three feeds") { + add_feed_with_tag_and_unreads(different_tag, 4); + + add_feed_with_tag_and_unreads(desired_tag, 5); + add_feed_with_tag_and_unreads(desired_tag, 8); + add_feed_with_tag_and_unreads(desired_tag, 11); + + REQUIRE(feedcontainer.get_unread_feed_count_per_tag(desired_tag) + == 3); + } +} + +TEST_CASE("get_unread_item_count_per_tag returns 0 if there are no feeds " + "with given tag", + "[FeedContainer]") +{ + FeedContainer feedcontainer; + + SECTION("Empty FeedContainer") { + REQUIRE(feedcontainer.get_unread_item_count_per_tag("unknown") == 0); + REQUIRE(feedcontainer.get_unread_item_count_per_tag("test") == 0); + REQUIRE(feedcontainer.get_unread_item_count_per_tag("with space") == 0); + } + + SECTION("Non-empty FeedContainer, but no feeds are tagged") { + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + feedcontainer.add_feed(std::make_shared<RssFeed>(&rsscache)); + feedcontainer.add_feed(std::make_shared<RssFeed>(&rsscache)); + feedcontainer.add_feed(std::make_shared<RssFeed>(&rsscache)); + + REQUIRE(feedcontainer.get_unread_item_count_per_tag("unknown") == 0); + REQUIRE(feedcontainer.get_unread_item_count_per_tag("test") == 0); + REQUIRE(feedcontainer.get_unread_item_count_per_tag("with space") == 0); + } + + SECTION("Non-empty FeedContainer, no feeds are tagged with our desired tag") { + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + auto feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({"one", "two", "three"}); + feedcontainer.add_feed(feed); + + feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({"some", "different", "tags"}); + feedcontainer.add_feed(feed); + + feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({"here's one with spaces"}); + feedcontainer.add_feed(feed); + + REQUIRE(feedcontainer.get_unread_item_count_per_tag("unknown") == 0); + REQUIRE(feedcontainer.get_unread_item_count_per_tag("test") == 0); + REQUIRE(feedcontainer.get_unread_item_count_per_tag("with space") == 0); + } +} + +TEST_CASE("get_unread_item_count_per_tag returns 0 if feeds with given tag " + "contain no unread items", + "[FeedContainer]") +{ + FeedContainer feedcontainer; + + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + const auto desired_tag = std::string("target"); + const auto different_tag = std::string("something else entirely"); + + auto feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({desired_tag}); + for (int i = 0; i < 10; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(false); + feed->add_item(item); + } + feedcontainer.add_feed(feed); + + feed = std::make_shared<RssFeed>(&rsscache); + feed->set_tags({different_tag}); + for (int i = 0; i < 5; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(true); + feed->add_item(item); + } + for (int i = 0; i < 5; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(false); + feed->add_item(item); + } + feedcontainer.add_feed(feed); + + REQUIRE(feedcontainer.get_unread_item_count_per_tag(desired_tag) == 0); +} + +TEST_CASE("get_unread_item_count_per_tag returns the number of unread items " + "in feeds that have a given tag", + "[FeedContainer]") +{ + FeedContainer feedcontainer; + + ConfigContainer cfg; + Cache rsscache(":memory:", &cfg); + + const auto desired_tag = std::string("target"); + const auto different_tag = std::string("something else entirely"); + + const auto add_feed_with_tag_and_unreads = + [&feedcontainer, &rsscache] + (std::string tag, unsigned int unreads) { + auto feed = std::make_shared<RssFeed>(&rsscache); + + feed->set_tags({tag}); + + for (unsigned int i = 0; i < unreads; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(true); + feed->add_item(item); + } + for (int i = 0; i < 10; ++i) { + auto item = std::make_shared<RssItem>(&rsscache); + item->set_unread(false); + feed->add_item(item); + } + + feedcontainer.add_feed(std::move(feed)); + }; + + SECTION("One feed, one unread") { + add_feed_with_tag_and_unreads(different_tag, 1); + add_feed_with_tag_and_unreads(desired_tag, 1); + REQUIRE(feedcontainer.get_unread_item_count_per_tag(desired_tag) + == 1); + } + + SECTION("Two feeds, 13 unreads") { + add_feed_with_tag_and_unreads(different_tag, 4); + + add_feed_with_tag_and_unreads(desired_tag, 5); + add_feed_with_tag_and_unreads(desired_tag, 8); + + REQUIRE(feedcontainer.get_unread_item_count_per_tag(desired_tag) + == 13); + } + + SECTION("Three feeds, 24 unreads") { + add_feed_with_tag_and_unreads(different_tag, 4); + + add_feed_with_tag_and_unreads(desired_tag, 5); + add_feed_with_tag_and_unreads(desired_tag, 8); + add_feed_with_tag_and_unreads(desired_tag, 11); + + REQUIRE(feedcontainer.get_unread_item_count_per_tag(desired_tag) + == 24); + } +} |