aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_cardlayout.cpp46
-rw-r--r--tests/test_config.cpp50
2 files changed, 96 insertions, 0 deletions
diff --git a/tests/test_cardlayout.cpp b/tests/test_cardlayout.cpp
index fdc18bf..bce6a0f 100644
--- a/tests/test_cardlayout.cpp
+++ b/tests/test_cardlayout.cpp
@@ -40,6 +40,7 @@ private slots:
void replyCardCarriesNoAccentBar();
void theDateFitsWhenTheCardIsBold();
void theDateFollowsTheSystemLocale();
+ void aConfiguredDateFormatIsUsedAndReservedFor();
};
namespace {
@@ -343,6 +344,51 @@ void TestCardLayout::theDateFollowsTheSystemLocale()
"formatting of a date");
}
+void TestCardLayout::aConfiguredDateFormatIsUsedAndReservedFor()
+{
+ const QDateTime when(QDate(2025, 8, 10), QTime(6, 26));
+
+ // A pattern deliberately much longer than any locale's short format, so
+ // the width claim below cannot pass by accident on a locale whose own
+ // dates happen to be wide enough already.
+ const QString format = QStringLiteral("dddd d MMMM yyyy 'at' hh:mm:ss");
+
+ QCOMPARE(CardLayout::formatDate(when, format),
+ QLocale::system().toString(when, format));
+ QVERIFY2(CardLayout::formatDate(when, format)
+ != CardLayout::formatDate(when),
+ "a configured format produced the same string as the system one, "
+ "so the parameter is being ignored");
+
+ // An empty format is what an absent or rejected config key gives, and it
+ // must mean the system format rather than an empty date.
+ QCOMPARE(CardLayout::formatDate(when, QString()),
+ CardLayout::formatDate(when));
+
+ // The load-bearing half: the reserved width has to follow the SAME format,
+ // or a long pattern is elided into a rect sized for a short one. This is
+ // the fault that a static, format-independent widest-date sample produces.
+ QFont font;
+ const int h = CardLayout::heightFor(font);
+ CardLayout::Input in = threadInput();
+ in.dateFormat = format;
+ const CardLayout card = CardLayout::compute(in, QRect(0, 0, 900, h), font);
+ QFont bold = font;
+ bold.setBold(true);
+ QVERIFY2(card.dateRect.width()
+ >= QFontMetrics(bold).horizontalAdvance(
+ CardLayout::formatDate(when, format)),
+ "the reserved date width is narrower than the configured format's "
+ "own output");
+
+ // And it is genuinely wider than the default's, which proves the width
+ // moved with the format rather than a generous constant covering both.
+ const CardLayout plain =
+ CardLayout::compute(threadInput(), QRect(0, 0, 900, h), font);
+ QVERIFY2(card.dateRect.width() > plain.dateRect.width(),
+ "a longer date format reserved no more width than the default");
+}
+
void TestCardLayout::theDateFitsWhenTheCardIsBold()
{
// An UNREAD card draws BOLD, and bold is wider. The layout is computed from
diff --git a/tests/test_config.cpp b/tests/test_config.cpp
index 7e0d6fb..b9321e0 100644
--- a/tests/test_config.cpp
+++ b/tests/test_config.cpp
@@ -52,6 +52,9 @@ private slots:
void markReadDelayDefaultsToTwoSeconds();
void markReadDelayIsActuallyRead();
void markReadDelayAcceptsZeroAndNegative();
+ void dateFormatDefaultsToEmpty();
+ void dateFormatIsActuallyRead();
+ void dateFormatWithoutAFieldIsRejectedAndReported();
void markReadDelayRejectsGarbage();
void syncOnExitDefaultsToAsk();
void syncOnExitReadsAllThreeValues();
@@ -570,6 +573,53 @@ void TestConfig::markReadDelayAcceptsZeroAndNegative()
QVERIFY(never.problems().isEmpty());
}
+void TestConfig::dateFormatDefaultsToEmpty()
+{
+ // Empty is what tells CardLayout to use the system's short format, which is
+ // the shipped behaviour and must survive this key existing.
+ QTemporaryDir dir;
+ Config config;
+ config.load(writeIni(dir, QStringLiteral("[general]\n")));
+ QVERIFY(config.dateFormat().isEmpty());
+ QVERIFY(config.problems().isEmpty());
+}
+
+void TestConfig::dateFormatIsActuallyRead()
+{
+ // A pattern that is not the default, which is what proves the key is read
+ // at all: a "general/date_format" lookup matches nothing and would still
+ // pass a test that only checked the empty default.
+ QTemporaryDir dir;
+ Config config;
+ config.load(writeIni(dir, QStringLiteral("[general]\n"
+ "date_format=yyyy-MM-dd\n")));
+ QCOMPARE(config.dateFormat(), QStringLiteral("yyyy-MM-dd"));
+ QVERIFY(config.problems().isEmpty());
+}
+
+void TestConfig::dateFormatWithoutAFieldIsRejectedAndReported()
+{
+ // The specific trap: QDateTime::toString() with a pattern carrying no date
+ // or time field returns something fixed rather than failing, so this would
+ // print the same string on every card and look like a rendering fault
+ // rather than a config one.
+ //
+ // "xyz" and not a friendlier-looking word, because almost every letter is
+ // a field character: "banana" formats as "bpmnpmnpm" (a is AM/PM, n is the
+ // minute) and "hello" as "22ello" (h is the hour). Those are nonsense but
+ // they do vary with the instant, so they are not what this rejects and the
+ // check would fail against them. What it catches is a pattern whose output
+ // is CONSTANT, which is the case that silently shows one date forever.
+ QTemporaryDir dir;
+ Config config;
+ config.load(writeIni(dir, QStringLiteral("[general]\n"
+ "date_format=xyz\n")));
+ QVERIFY2(config.dateFormat().isEmpty(),
+ "a pattern with no date field was accepted");
+ QCOMPARE(config.problems().size(), 1);
+ QVERIFY(config.problems().first().contains(QStringLiteral("xyz")));
+}
+
void TestConfig::markReadDelayRejectsGarbage()
{
// Absent is silent, but present-and-unparseable means the user asked for