1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
#include "statusline.h"
#include "3rd-party/catch.hpp"
using namespace newsboat;
class StatusTester : public IStatus {
public:
StatusTester()
: last_string_was_error(false)
{
}
void set_status(const std::string& message) override
{
last_message = message;
last_string_was_error = false;
}
void show_error(const std::string& message) override
{
last_message = message;
last_string_was_error = true;
}
std::string last_message;
bool last_string_was_error;
};
TEST_CASE("StatusLine passes status messages to registered IStatus implementation",
"[StatusLine]")
{
StatusTester status_message_handler;
StatusLine status_line(status_message_handler);
GIVEN("no previous registered messages") {
WHEN("show_message() is called") {
status_line.show_message("this is a status");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "this is a status");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
}
WHEN("show_error() is called") {
status_line.show_error("this is an error");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "this is an error");
REQUIRE(status_message_handler.last_string_was_error);
}
}
WHEN("show_message_until_finished() is called") {
auto message_lifetime = status_line.show_message_until_finished("test message...");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "test message...");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
WHEN("the message_lifetime object goes out of scope") {
message_lifetime.reset();
THEN("the message is cleared") {
REQUIRE(status_message_handler.last_message == "");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
}
}
}
GIVEN("a previous message or error") {
status_line.show_message("regular status");
status_line.show_error("error message");
WHEN("show_message() is called") {
status_line.show_message("this is a status");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "this is a status");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
}
WHEN("show_error() is called") {
status_line.show_error("this is an error");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "this is an error");
REQUIRE(status_message_handler.last_string_was_error);
}
}
WHEN("show_message_until_finished() is called") {
auto message_lifetime = status_line.show_message_until_finished("test message...");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "test message...");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
WHEN("the message_lifetime object goes out of scope") {
message_lifetime.reset();
THEN("the message is cleared") {
REQUIRE(status_message_handler.last_message == "");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
}
}
}
GIVEN("a previous show_message_until_finished call") {
auto previous_message_lifetime =
status_line.show_message_until_finished("previous message...");
WHEN("show_message() is called") {
status_line.show_message("this is a status");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "this is a status");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
WHEN("the previous show_message_until_finished() lifetime goes away") {
previous_message_lifetime.reset();
THEN("the message is not overwritten") {
REQUIRE(status_message_handler.last_message == "this is a status");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
}
}
}
WHEN("show_error() is called") {
status_line.show_error("this is an error");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "this is an error");
REQUIRE(status_message_handler.last_string_was_error);
WHEN("the previous show_message_until_finished() lifetime goes away") {
previous_message_lifetime.reset();
THEN("the message is not overwritten") {
REQUIRE(status_message_handler.last_message == "this is an error");
REQUIRE(status_message_handler.last_string_was_error);
}
}
}
}
WHEN("show_message_until_finished() is called") {
auto message_lifetime = status_line.show_message_until_finished("test message...");
THEN("the message is passed to the IStatus implementation") {
REQUIRE(status_message_handler.last_message == "test message...");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
WHEN("the message_lifetime object goes out of scope") {
message_lifetime.reset();
THEN("the previous message is restored") {
REQUIRE(status_message_handler.last_message == "previous message...");
REQUIRE_FALSE(status_message_handler.last_string_was_error);
}
}
}
}
}
TEST_CASE("show_message_until_finished() will restore old message when lifetime is destructed",
"[StatusLine]")
{
StatusTester status_message_handler;
StatusLine status_line(status_message_handler);
GIVEN("multiple message lifetimes") {
auto message_lifetime1 = status_line.show_message_until_finished("first message");
REQUIRE(status_message_handler.last_message == "first message");
auto message_lifetime2 = status_line.show_message_until_finished("second message");
REQUIRE(status_message_handler.last_message == "second message");
auto message_lifetime3 = status_line.show_message_until_finished("third message");
REQUIRE(status_message_handler.last_message == "third message");
WHEN("the latest message goes out of scope") {
message_lifetime3.reset();
THEN("the most recent active status message is restored") {
REQUIRE(status_message_handler.last_message == "second message");
THEN("a further destruction causes the then latest message to be restored") {
message_lifetime2.reset();
REQUIRE(status_message_handler.last_message == "first message");
THEN("the last destruction causes the status line to be cleared") {
message_lifetime1.reset();
REQUIRE(status_message_handler.last_message == "");
}
}
}
}
WHEN("an older message goes out of scope") {
status_message_handler.last_message = "should not be overwritten";
message_lifetime2.reset();
message_lifetime1.reset();
THEN("no changes are applied to the status line") {
REQUIRE(status_message_handler.last_message == "should not be overwritten");
}
}
WHEN("messages go out of scope in non-sorted mode") {
message_lifetime2.reset();
THEN("still, the most recent message is shown every time") {
REQUIRE(status_message_handler.last_message == "third message");
message_lifetime3.reset();
REQUIRE(status_message_handler.last_message == "first message");
message_lifetime1.reset();
REQUIRE(status_message_handler.last_message == "");
}
}
}
}
|