MailJDTourDownloadDocsQualityTestsCoverage

Which source lines and branches the tests execute. Lines 91.5 %, branches 75.0 % (minimum 85 % and 72 %). main @ 399ffe3d · 21 October 2026 · pipeline 7238.

GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 93.2% 55 / 0 / 59
Functions: 100.0% 6 / 0 / 6
Branches: 77.0% 57 / 0 / 74

presentation/MetSentence.cpp
Line Branch Exec Source
1 #include "MetSentence.h"
2
3 #include "ContactEditorFields.h"
4
5 #include <QCoreApplication>
6 #include <QDate>
7
8 namespace MetSentence {
9
10 namespace {
11
12 161 QString tr(const char *text) { return QCoreApplication::translate("MetSentence", text); }
13
14 // Splits a translated template around its single %1 into text segments with
15 // the argument as a link segment ("in %1" → "in ", <Lisbon>).
16 84 void appendTemplate(QList<Segment> *out, const QString &pattern, const QString &argument, const QString &link) {
17
1/1
✓ Branch 5 → 6 taken 84 times.
84 const int at = int(pattern.indexOf(QStringLiteral("%1")));
18
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 84 times.
84 if (at < 0) {
19 ✗ out->append({pattern, {}});
20 ✗ return;
21 }
22
1/2
✓ Branch 13 → 14 taken 84 times.
✗ Branch 13 → 18 not taken.
84 if (at > 0)
23 84 out->append({pattern.left(at), {}});
24 84 out->append({argument, link});
25
2/2
✓ Branch 23 → 24 taken 2 times.
✓ Branch 23 → 28 taken 82 times.
84 if (at + 2 < pattern.size())
26 2 out->append({pattern.mid(at + 2), {}});
27 170 }
28
29 } // namespace
30
31 147 QString formatDate(const LooseDate &date, const QLocale &locale) {
32
2/2
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 145 times.
147 if (!date.isValid())
33 2 return {};
34
2/2
✓ Branch 6 → 7 taken 37 times.
✓ Branch 6 → 9 taken 108 times.
145 if (date.hasDay())
35
1/1
✓ Branch 7 → 8 taken 37 times.
37 return ContactEditorFields::formatPartialDate({date.year, date.month, date.day}, locale);
36
2/2
✓ Branch 9 → 10 taken 55 times.
✓ Branch 9 → 18 taken 53 times.
108 if (date.month > 0)
37
2/2
✓ Branch 13 → 14 taken 55 times.
✓ Branch 14 → 15 taken 55 times.
55 return locale.toString(QDate(date.year, date.month, 1), QStringLiteral("MMMM yyyy"));
38 53 return QString::number(date.year);
39 }
40
41 93 QList<Segment> build(const Input &input, const QLocale &locale) {
42 93 QList<Segment> out;
43
1/1
✓ Branch 2 → 3 taken 93 times.
93 const QString when = formatDate(input.date, locale);
44
2/2
✓ Branch 4 → 5 taken 91 times.
✓ Branch 4 → 9 taken 2 times.
93 if (!when.isEmpty())
45 91 out.append({when, {}});
46 86 const auto space = [&out]() {
47
2/2
✓ Branch 3 → 4 taken 85 times.
✓ Branch 3 → 11 taken 1 time.
86 if (!out.isEmpty())
48 85 out.append({QStringLiteral(" "), {}});
49
1/3
✓ Branch 7 → 8 taken 85 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 16 not taken.
256 };
50
2/2
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 21 taken 91 times.
93 if (!input.eventTitle.isEmpty()) {
51
1/1
✓ Branch 11 → 12 taken 2 times.
2 space();
52 //: The occasion of a meeting, a calendar event: "at “Dinner at Taberna”" (German "bei „…“").
53
2/2
✓ Branch 15 → 16 taken 2 times.
✓ Branch 16 → 17 taken 2 times.
2 appendTemplate(&out, tr("at “%1”"), input.eventTitle, QStringLiteral("event"));
54
2/2
✓ Branch 22 → 23 taken 82 times.
✓ Branch 22 → 35 taken 9 times.
91 } else if (!input.place.isEmpty()) {
55
1/1
✓ Branch 23 → 24 taken 82 times.
82 space();
56 //: A city from the place list: "in Lisbon".
57
5/5
✓ Branch 27 → 28 taken 17 times.
✓ Branch 27 → 29 taken 65 times.
✓ Branch 28 → 30 taken 17 times.
✓ Branch 29 → 30 taken 65 times.
✓ Branch 30 → 31 taken 82 times.
82 appendTemplate(&out, input.placeIsCity ? tr("in %1") : tr("at %1"), input.place, QStringLiteral("place"));
58 }
59
2/2
✓ Branch 37 → 38 taken 2 times.
✓ Branch 37 → 43 taken 91 times.
93 if (input.channel == QLatin1String("mail")) {
60
1/1
✓ Branch 38 → 39 taken 2 times.
2 space();
61 2 out.append({tr("by mail"), {}});
62 }
63
2/2
✓ Branch 44 → 45 taken 72 times.
✓ Branch 44 → 103 taken 21 times.
93 if (!input.via.isEmpty()) {
64 //: Introducers after the date/place: ", through Ben Weber and Marta Silva" (German ", über …").
65
2/4
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 72 times.
✗ Branch 47 → 49 not taken.
✓ Branch 48 → 49 taken 72 times.
72 const QString pattern = out.isEmpty() ? tr("Through %1") : tr(", through %1");
66
1/1
✓ Branch 52 → 53 taken 72 times.
72 const int at = int(pattern.indexOf(QStringLiteral("%1")));
67
1/2
✓ Branch 55 → 56 taken 72 times.
✗ Branch 55 → 60 not taken.
72 if (at > 0)
68 72 out.append({pattern.left(at), {}});
69
2/2
✓ Branch 90 → 61 taken 75 times.
✓ Branch 90 → 91 taken 72 times.
147 for (int i = 0; i < input.via.size(); ++i) {
70
2/2
✓ Branch 61 → 62 taken 3 times.
✓ Branch 61 → 73 taken 72 times.
75 if (i > 0)
71
1/4
✗ Branch 70 → 71 not taken.
✓ Branch 70 → 72 taken 3 times.
✗ Branch 153 → 154 not taken.
✗ Branch 153 → 155 not taken.
3 out.append({i == input.via.size() - 1 ? tr(" and ") : QStringLiteral(", "), {}});
72 75 const Person &person = input.via.at(i);
73
4/8
✓ Branch 84 → 85 taken 73 times.
✓ Branch 84 → 86 taken 2 times.
✓ Branch 86 → 87 taken 73 times.
✓ Branch 86 → 88 taken 2 times.
✗ Branch 160 → 161 not taken.
✗ Branch 160 → 162 not taken.
✗ Branch 164 → 165 not taken.
✗ Branch 164 → 166 not taken.
221 out.append({person.name, person.key.isEmpty() ? QString() : QStringLiteral("person:") + person.key});
74 }
75
3/6
✓ Branch 91 → 92 taken 72 times.
✗ Branch 91 → 95 not taken.
✗ Branch 93 → 94 not taken.
✓ Branch 93 → 95 taken 72 times.
✗ Branch 96 → 97 not taken.
✓ Branch 96 → 101 taken 72 times.
72 if (at >= 0 && at + 2 < pattern.size())
76 ✗ out.append({pattern.mid(at + 2), {}});
77 72 }
78 93 return out;
79 409 }
80
81 92 QString plainText(const QList<Segment> &segments) {
82 92 QString text;
83
2/2
✓ Branch 8 → 4 taken 498 times.
✓ Branch 8 → 9 taken 92 times.
590 for (const Segment &segment : segments)
84
1/1
✓ Branch 5 → 6 taken 498 times.
498 text += segment.text;
85 92 return text;
86 ✗ }
87
88 } // namespace MetSentence
89