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: 94.1% 414 / 0 / 440
Functions: 100.0% 17 / 0 / 17
Branches: 72.2% 696 / 0 / 964

presentation/ConflictValueText.cpp
Line Branch Exec Source
1 #include "ConflictValueText.h"
2
3 #include "RuleSentence.h"
4 #include "data/ICalTime.h"
5 #include "data/ICalendar.h"
6 #include "data/RecurrenceRule.h"
7 #include "data/SieveRuleCodec.h"
8 #include "data/VCardCodec.h"
9
10 #include <QJsonArray>
11 #include <QJsonDocument>
12 #include <QJsonObject>
13 #include <QLocale>
14 #include <QRegularExpression>
15
16 namespace {
17
18 4221 ICal::Property propertyOf(const QString &line) {
19 const ICal::Component parsed =
20
3/3
✓ Branch 11 → 12 taken 4221 times.
✓ Branch 12 → 13 taken 4221 times.
✓ Branch 13 → 14 taken 4221 times.
12663 ICal::parseFirst(QStringLiteral("BEGIN:X\r\n") + line + QStringLiteral("\r\nEND:X\r\n"), QStringLiteral("X"));
21
2/2
✓ Branch 23 → 24 taken 126 times.
✓ Branch 23 → 25 taken 4095 times.
8442 return parsed.properties.isEmpty() ? ICal::Property{} : parsed.properties.first();
22 4221 }
23
24 // The first line of a (possibly multi-line) value.
25
1/1
✓ Branch 5 → 6 taken 4789 times.
4789 QString firstLine(const QString &text) { return text.section(QLatin1Char('\n'), 0, 0); }
26
27 1629 QString shortText(QString text, int limit = 160) {
28
1/1
✓ Branch 7 → 8 taken 1629 times.
1629 text.replace(QLatin1Char('\n'), QStringLiteral(" · "));
29
10/16
✓ Branch 11 → 12 taken 4 times.
✓ Branch 11 → 17 taken 1625 times.
✓ Branch 15 → 16 taken 4 times.
✓ Branch 16 → 18 taken 4 times.
✓ Branch 19 → 20 taken 4 times.
✓ Branch 19 → 21 taken 1625 times.
✓ Branch 21 → 22 taken 4 times.
✓ Branch 21 → 23 taken 1625 times.
✓ Branch 23 → 24 taken 4 times.
✓ Branch 23 → 25 taken 1625 times.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 37 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 41 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 45 not taken.
1633 return text.size() > limit ? text.left(limit - 1) + QStringLiteral("…") : text;
30 }
31
32 // "PT15M", "-P1D", "-PT1H30M" → minutes (negative = before).
33 94 int durationMinutes(const QString &value, bool *ok) {
34 static const QRegularExpression pattern(
35
4/7
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 15 taken 93 times.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 15 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
95 QStringLiteral("^([+-])?P(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?$"));
36
3/3
✓ Branch 16 → 17 taken 94 times.
✓ Branch 17 → 18 taken 94 times.
✓ Branch 18 → 19 taken 94 times.
94 const auto match = pattern.match(value.trimmed().toUpper());
37
1/1
✓ Branch 21 → 22 taken 94 times.
94 *ok = match.hasMatch();
38
2/2
✓ Branch 22 → 23 taken 4 times.
✓ Branch 22 → 24 taken 90 times.
94 if (!*ok)
39 4 return 0;
40
4/4
✓ Branch 24 → 25 taken 90 times.
✓ Branch 25 → 26 taken 90 times.
✓ Branch 26 → 27 taken 90 times.
✓ Branch 27 → 28 taken 90 times.
180 const int minutes = match.captured(2).toInt() * 7 * 24 * 60 + match.captured(3).toInt() * 24 * 60 +
41
4/4
✓ Branch 28 → 29 taken 90 times.
✓ Branch 29 → 30 taken 90 times.
✓ Branch 30 → 31 taken 90 times.
✓ Branch 31 → 32 taken 90 times.
90 match.captured(4).toInt() * 60 + match.captured(5).toInt();
42
3/3
✓ Branch 37 → 38 taken 90 times.
✓ Branch 39 → 40 taken 77 times.
✓ Branch 39 → 41 taken 13 times.
90 return match.captured(1) == QLatin1String("-") ? -minutes : minutes;
43 94 }
44
45 263 ICalTime::ZoneResolver zonesOf(const QString &calendarText) {
46
2/2
✓ Branch 5 → 6 taken 263 times.
✓ Branch 6 → 7 taken 263 times.
263 return ICalTime::ZoneResolver(ICal::parseFirst(calendarText));
47 }
48
49 263 QString sideText(const Merge::Plan &plan, ConflictValueText::Side side) {
50
3/4
✓ Branch 2 → 3 taken 71 times.
✓ Branch 2 → 4 taken 77 times.
✓ Branch 2 → 5 taken 115 times.
✗ Branch 2 → 6 not taken.
263 switch (side) {
51 71 case ConflictValueText::Side::Base:
52 71 return plan.baseText;
53 77 case ConflictValueText::Side::Server:
54 77 return plan.serverText;
55 115 case ConflictValueText::Side::Local:
56 115 break;
57 }
58 115 return plan.localText;
59 }
60
61 } // namespace
62
63 10048 const Merge::Value &ConflictValueText::valueOf(const Merge::Item &item, Side side) {
64
3/4
✓ Branch 2 → 3 taken 2799 times.
✓ Branch 2 → 4 taken 3533 times.
✓ Branch 2 → 5 taken 3716 times.
✗ Branch 2 → 6 not taken.
10048 switch (side) {
65 2799 case Side::Base:
66 2799 return item.base;
67 3533 case Side::Server:
68 3533 return item.server;
69 3716 case Side::Local:
70 3716 break;
71 }
72 3716 return item.local;
73 }
74
75 117 QString ConflictValueText::groupLabel(const QString &group) {
76
2/2
✓ Branch 4 → 5 taken 72 times.
✓ Branch 4 → 6 taken 45 times.
117 if (group == QLatin1String("time"))
77 72 return tr("Time");
78
2/2
✓ Branch 8 → 9 taken 9 times.
✓ Branch 8 → 10 taken 36 times.
45 if (group == QLatin1String("completion"))
79 9 return tr("Done");
80
2/2
✓ Branch 12 → 13 taken 8 times.
✓ Branch 12 → 14 taken 28 times.
36 if (group == QLatin1String("recurrence"))
81 8 return tr("Repeats");
82
2/2
✓ Branch 16 → 17 taken 16 times.
✓ Branch 16 → 18 taken 12 times.
28 if (group == QLatin1String("name"))
83 16 return tr("Name");
84
3/3
✓ Branch 19 → 20 taken 12 times.
✓ Branch 20 → 21 taken 2 times.
✓ Branch 20 → 22 taken 10 times.
12 if (group.startsWith(QLatin1String("dav:")))
85 2 return tr("Calendars and address books");
86 10 return group;
87 }
88
89 1103 QString ConflictValueText::label(const Merge::Plan &plan, const Merge::Item &item) {
90 1103 const QString name = item.name;
91
2/2
✓ Branch 5 → 6 taken 51 times.
✓ Branch 5 → 79 taken 1052 times.
1103 if (plan.domain == QLatin1String("settings")) {
92 51 const QString key = item.context;
93
2/2
✓ Branch 9 → 10 taken 14 times.
✓ Branch 9 → 15 taken 37 times.
51 if (name == QLatin1String("folderIcons"))
94
2/2
✓ Branch 10 → 11 taken 14 times.
✓ Branch 12 → 13 taken 14 times.
28 return tr("%1 — icon").arg(key);
95
2/2
✓ Branch 17 → 18 taken 3 times.
✓ Branch 17 → 23 taken 34 times.
37 if (name == QLatin1String("folderColors"))
96
2/2
✓ Branch 18 → 19 taken 3 times.
✓ Branch 20 → 21 taken 3 times.
6 return tr("%1 — colour").arg(key);
97
2/2
✓ Branch 25 → 26 taken 3 times.
✓ Branch 25 → 28 taken 31 times.
34 if (name == QLatin1String("calendarColors"))
98
1/1
✓ Branch 26 → 27 taken 3 times.
3 return tr("Calendar colour");
99
2/2
✓ Branch 30 → 31 taken 7 times.
✓ Branch 30 → 33 taken 24 times.
31 if (name == QLatin1String("hiddenFolders"))
100
1/1
✓ Branch 31 → 32 taken 7 times.
7 return tr("Hidden folders");
101
2/2
✓ Branch 35 → 36 taken 7 times.
✓ Branch 35 → 47 taken 17 times.
24 if (name == QLatin1String("davAccounts"))
102
3/3
✓ Branch 37 → 38 taken 7 times.
✓ Branch 38 → 39 taken 2 times.
✓ Branch 38 → 40 taken 5 times.
7 return key.endsWith(QLatin1String(":books")) ? tr("Address books")
103
3/3
✓ Branch 41 → 42 taken 5 times.
✓ Branch 42 → 43 taken 2 times.
✓ Branch 42 → 44 taken 3 times.
12 : key.endsWith(QLatin1String(":calendars")) ? tr("Calendars")
104
3/3
✓ Branch 39 → 45 taken 2 times.
✓ Branch 43 → 45 taken 2 times.
✓ Branch 44 → 45 taken 3 times.
7 : tr("Calendar and contact account");
105
1/2
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 61 taken 17 times.
17 if (name == QLatin1String("identities"))
106 ✗ return tr("%1 — name and signatures").arg(key.section(QLatin1Char('|'), 2));
107
1/2
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 66 taken 17 times.
17 if (name == QLatin1String("templates"))
108 ✗ return tr("Template");
109
2/2
✓ Branch 68 → 69 taken 14 times.
✓ Branch 68 → 71 taken 3 times.
17 if (key == QLatin1String("defaultView"))
110
1/1
✓ Branch 69 → 70 taken 14 times.
14 return tr("Reading mode");
111
1/2
✓ Branch 73 → 74 taken 3 times.
✗ Branch 73 → 76 not taken.
3 if (key == QLatin1String("language"))
112
1/1
✓ Branch 74 → 75 taken 3 times.
3 return tr("Language");
113 ✗ return key;
114 51 }
115
2/2
✓ Branch 81 → 82 taken 181 times.
✓ Branch 81 → 96 taken 871 times.
1052 if (plan.domain == QLatin1String("sieve")) {
116
2/2
✓ Branch 82 → 83 taken 12 times.
✓ Branch 82 → 85 taken 169 times.
181 if (item.kind == Merge::Kind::Order)
117
1/1
✓ Branch 83 → 84 taken 12 times.
12 return tr("Order of the rules");
118
2/2
✓ Branch 87 → 88 taken 18 times.
✓ Branch 87 → 90 taken 151 times.
169 if (item.context == QLatin1String("vacation"))
119
1/1
✓ Branch 88 → 89 taken 18 times.
18 return tr("Out of office");
120
2/2
✓ Branch 92 → 93 taken 6 times.
✓ Branch 92 → 95 taken 145 times.
151 if (item.id == QLatin1String("raw"))
121
1/1
✓ Branch 93 → 94 taken 6 times.
6 return tr("Script");
122 145 return item.name;
123 }
124
2/2
✓ Branch 98 → 99 taken 23 times.
✓ Branch 98 → 106 taken 848 times.
871 if (item.id == QLatin1String("raw"))
125
4/4
✓ Branch 101 → 102 taken 9 times.
✓ Branch 101 → 103 taken 14 times.
✓ Branch 102 → 104 taken 9 times.
✓ Branch 103 → 104 taken 14 times.
23 return plan.domain == QLatin1String("vcard") ? tr("The whole contact") : tr("The whole entry");
126 static const QHash<QString, const char *> labels{
127 8 {QStringLiteral("SUMMARY"), QT_TR_NOOP("Title")},
128 8 {QStringLiteral("LOCATION"), QT_TR_NOOP("Location")},
129 8 {QStringLiteral("DESCRIPTION"), QT_TR_NOOP("Notes")},
130 8 {QStringLiteral("COMMENT"), QT_TR_NOOP("Comment")},
131 8 {QStringLiteral("DTSTART"), QT_TR_NOOP("Start")},
132 8 {QStringLiteral("DTEND"), QT_TR_NOOP("End")},
133 8 {QStringLiteral("DUE"), QT_TR_NOOP("Due")},
134 8 {QStringLiteral("DURATION"), QT_TR_NOOP("Duration")},
135 8 {QStringLiteral("RRULE"), QT_TR_NOOP("Repeats")},
136 8 {QStringLiteral("EXDATE"), QT_TR_NOOP("Left out of the series")},
137 8 {QStringLiteral("RDATE"), QT_TR_NOOP("Extra dates")},
138 8 {QStringLiteral("ATTENDEE"), QT_TR_NOOP("Attendees")},
139 8 {QStringLiteral("ORGANIZER"), QT_TR_NOOP("Organizer")},
140 8 {QStringLiteral("CATEGORIES"), QT_TR_NOOP("Tags")},
141 8 {QStringLiteral("BEGIN:VALARM"), QT_TR_NOOP("Reminders")},
142 8 {QStringLiteral("STATUS"), QT_TR_NOOP("Status")},
143 8 {QStringLiteral("PERCENT-COMPLETE"), QT_TR_NOOP("Progress")},
144 8 {QStringLiteral("COMPLETED"), QT_TR_NOOP("Completed on")},
145 8 {QStringLiteral("PRIORITY"), QT_TR_NOOP("Priority")},
146 8 {QStringLiteral("RELATED-TO"), QT_TR_NOOP("Belongs to")},
147 8 {QStringLiteral("CONTACT"), QT_TR_NOOP("People")},
148 8 {QStringLiteral("ATTACH"), QT_TR_NOOP("Attachments")},
149 8 {QStringLiteral("CLASS"), QT_TR_NOOP("Visibility")},
150 8 {QStringLiteral("TRANSP"), QT_TR_NOOP("Shown as")},
151 8 {QStringLiteral("URL"), QT_TR_NOOP("Link")},
152 8 {QStringLiteral("FN"), QT_TR_NOOP("Name")},
153 8 {QStringLiteral("N"), QT_TR_NOOP("Name parts")},
154 8 {QStringLiteral("NICKNAME"), QT_TR_NOOP("Nickname")},
155 8 {QStringLiteral("ORG"), QT_TR_NOOP("Organization")},
156 8 {QStringLiteral("TITLE"), QT_TR_NOOP("Job title")},
157 8 {QStringLiteral("ROLE"), QT_TR_NOOP("Role")},
158 8 {QStringLiteral("NOTE"), QT_TR_NOOP("Note")},
159 8 {QStringLiteral("BDAY"), QT_TR_NOOP("Birthday")},
160 8 {QStringLiteral("ANNIVERSARY"), QT_TR_NOOP("Anniversary")},
161 8 {QStringLiteral("PHOTO"), QT_TR_NOOP("Photo")},
162 8 {QStringLiteral("EMAIL"), QT_TR_NOOP("E-mail addresses")},
163 8 {QStringLiteral("TEL"), QT_TR_NOOP("Phone numbers")},
164 8 {QStringLiteral("ADR"), QT_TR_NOOP("Addresses")},
165 8 {QStringLiteral("IMPP"), QT_TR_NOOP("Chat")},
166 8 {QStringLiteral("RELATED"), QT_TR_NOOP("Relationships")},
167 8 {QStringLiteral("MEMBER"), QT_TR_NOOP("Members")},
168 8 {QStringLiteral("GENDER"), QT_TR_NOOP("Gender")},
169 8 {QStringLiteral("KIND"), QT_TR_NOOP("Kind")},
170
5/10
✓ Branch 106 → 107 taken 4 times.
✓ Branch 106 → 374 taken 844 times.
✓ Branch 108 → 109 taken 4 times.
✗ Branch 108 → 374 not taken.
✓ Branch 285 → 286 taken 172 times.
✓ Branch 285 → 287 taken 4 times.
✗ Branch 413 → 414 not taken.
✗ Branch 413 → 415 not taken.
✗ Branch 680 → 681 not taken.
✗ Branch 680 → 682 not taken.
1028 };
171
2/2
✓ Branch 375 → 376 taken 828 times.
✓ Branch 375 → 378 taken 20 times.
848 if (const char *text = labels.value(name, nullptr))
172
1/1
✓ Branch 376 → 377 taken 828 times.
828 return tr(text);
173
2/4
✓ Branch 379 → 380 taken 20 times.
✗ Branch 380 → 381 not taken.
✓ Branch 380 → 382 taken 20 times.
✗ Branch 381 → 383 not taken.
20 return name.startsWith(QLatin1String("BEGIN:")) ? name.mid(6) : name;
174 1279 }
175
176 594 QString ConflictValueText::absent(const Merge::Item &item) {
177
4/4
✓ Branch 2 → 3 taken 399 times.
✓ Branch 2 → 4 taken 195 times.
✓ Branch 3 → 4 taken 24 times.
✓ Branch 3 → 14 taken 375 times.
594 if (item.kind == Merge::Kind::Component || item.kind == Merge::Kind::Deletion) {
178
6/6
✓ Branch 5 → 6 taken 39 times.
✓ Branch 5 → 10 taken 180 times.
✓ Branch 8 → 9 taken 21 times.
✓ Branch 8 → 10 taken 18 times.
✓ Branch 11 → 12 taken 21 times.
✓ Branch 11 → 13 taken 198 times.
219 if (!item.context.isEmpty() && item.context != QLatin1String("vacation"))
179 21 return tr("Left out of the series");
180 198 return tr("Deleted");
181 }
182 375 return tr("(none)");
183 }
184
185 4098 QString ConflictValueText::source(const Merge::Item &item, Side side) {
186 4098 const Merge::Value &value = valueOf(item, side);
187
2/2
✓ Branch 3 → 4 taken 3139 times.
✓ Branch 3 → 5 taken 959 times.
4098 return value.present ? value.text : QString();
188 }
189
190 509 QString ConflictValueText::dateTimeText(const QString &contentLine, const Context &context) {
191
1/1
✓ Branch 2 → 3 taken 509 times.
509 const ICal::Property property = propertyOf(contentLine);
192
2/2
✓ Branch 4 → 5 taken 1 time.
✓ Branch 4 → 6 taken 508 times.
509 if (property.name.isEmpty())
193 1 return {};
194
1/1
✓ Branch 7 → 8 taken 508 times.
508 const ICalTime::Value value = ICalTime::parseProperty(property, ICalTime::ZoneResolver());
195
2/3
✓ Branch 9 → 10 taken 508 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 13 taken 508 times.
508 if (!value.valid())
196 ✗ return ICal::unescapeText(property.value);
197
1/1
✓ Branch 13 → 14 taken 508 times.
508 const QLocale locale;
198
2/2
✓ Branch 14 → 15 taken 62 times.
✓ Branch 14 → 24 taken 446 times.
508 if (value.dateOnly)
199
2/2
✓ Branch 18 → 19 taken 62 times.
✓ Branch 19 → 20 taken 62 times.
62 return locale.toString(value.dateTime.date(), QStringLiteral("ddd d MMM yyyy"));
200
3/3
✓ Branch 24 → 25 taken 28 times.
✓ Branch 24 → 26 taken 418 times.
✓ Branch 26 → 27 taken 418 times.
446 QDateTime shown = value.floating ? value.dateTime : value.dateTime.toTimeZone(context.zone);
201
3/3
✓ Branch 37 → 38 taken 446 times.
✓ Branch 38 → 39 taken 446 times.
✓ Branch 39 → 40 taken 446 times.
1338 QString text = locale.toString(shown.date(), QStringLiteral("ddd d MMM yyyy")) + QLatin1Char(' ') +
202
3/3
✓ Branch 30 → 31 taken 446 times.
✓ Branch 31 → 32 taken 446 times.
✓ Branch 40 → 41 taken 446 times.
1338 locale.toString(shown.time(), QStringLiteral("HH:mm"));
203 // Another zone than the user's: the time there, too ("09:00 (11:00 Europe/Berlin)").
204
10/14
✓ Branch 48 → 49 taken 418 times.
✓ Branch 48 → 55 taken 28 times.
✓ Branch 49 → 50 taken 418 times.
✓ Branch 50 → 51 taken 418 times.
✗ Branch 50 → 55 not taken.
✓ Branch 51 → 52 taken 418 times.
✓ Branch 53 → 54 taken 418 times.
✗ Branch 53 → 55 not taken.
✓ Branch 56 → 57 taken 418 times.
✓ Branch 56 → 58 taken 28 times.
✓ Branch 58 → 59 taken 418 times.
✓ Branch 58 → 82 taken 28 times.
✗ Branch 122 → 123 not taken.
✗ Branch 122 → 124 not taken.
446 if (!value.floating && value.dateTime.timeSpec() == Qt::TimeZone && value.dateTime.timeZone() != context.zone)
205 836 text += QStringLiteral(" (%1 %2)")
206
3/3
✓ Branch 68 → 69 taken 418 times.
✓ Branch 69 → 70 taken 418 times.
✓ Branch 70 → 71 taken 418 times.
1254 .arg(locale.toString(value.dateTime.time(), QStringLiteral("HH:mm")),
207
4/4
✓ Branch 62 → 63 taken 418 times.
✓ Branch 63 → 64 taken 418 times.
✓ Branch 64 → 65 taken 418 times.
✓ Branch 71 → 72 taken 418 times.
1254 QString::fromUtf8(value.dateTime.timeZone().id()));
208 446 return text;
209 509 }
210
211 676 QString ConflictValueText::groupValue(const Merge::Plan &plan, const QList<const Merge::Item *> &members, Side side,
212 const Context &context) {
213 676 QHash<QString, QString> lines;
214
2/2
✓ Branch 13 → 4 taken 1562 times.
✓ Branch 13 → 14 taken 676 times.
2238 for (const Merge::Item *item : members) {
215 1562 const Merge::Value &value = valueOf(*item, side);
216
2/2
✓ Branch 6 → 7 taken 1151 times.
✓ Branch 6 → 11 taken 411 times.
1562 if (value.present)
217
2/2
✓ Branch 7 → 8 taken 1151 times.
✓ Branch 8 → 9 taken 1151 times.
1151 lines.insert(item->name, firstLine(value.text));
218 }
219
11/14
✓ Branch 18 → 19 taken 413 times.
✓ Branch 18 → 24 taken 263 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 413 times.
✓ Branch 26 → 27 taken 413 times.
✓ Branch 26 → 28 taken 263 times.
✓ Branch 28 → 29 taken 413 times.
✓ Branch 28 → 30 taken 263 times.
✓ Branch 30 → 31 taken 676 times.
✗ Branch 30 → 32 not taken.
✓ Branch 32 → 33 taken 676 times.
✗ Branch 32 → 34 not taken.
✓ Branch 34 → 35 taken 263 times.
✓ Branch 34 → 314 taken 413 times.
1765 if (lines.contains(QStringLiteral("DTSTART")) || lines.contains(QStringLiteral("DUE"))) {
220 263 const QString start = lines.value(QStringLiteral("DTSTART"));
221
2/2
✓ Branch 60 → 61 taken 257 times.
✓ Branch 60 → 62 taken 6 times.
783 const QString end = lines.contains(QStringLiteral("DTEND")) ? lines.value(QStringLiteral("DTEND"))
222
8/8
✓ Branch 45 → 46 taken 257 times.
✓ Branch 45 → 50 taken 6 times.
✓ Branch 54 → 55 taken 6 times.
✓ Branch 54 → 56 taken 257 times.
✓ Branch 56 → 57 taken 6 times.
✓ Branch 56 → 58 taken 257 times.
✓ Branch 58 → 59 taken 257 times.
✓ Branch 58 → 60 taken 6 times.
526 : lines.value(QStringLiteral("DUE"));
223
1/1
✓ Branch 64 → 65 taken 263 times.
263 const QLocale locale;
224
1/1
✓ Branch 66 → 67 taken 263 times.
263 const ICalTime::ZoneResolver zones = zonesOf(sideText(plan, side));
225
4/12
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 72 taken 263 times.
✓ Branch 72 → 73 taken 263 times.
✓ Branch 73 → 74 taken 263 times.
✓ Branch 74 → 75 taken 263 times.
✗ Branch 74 → 76 not taken.
✗ Branch 348 → 349 not taken.
✗ Branch 348 → 350 not taken.
✗ Branch 352 → 353 not taken.
✗ Branch 352 → 355 not taken.
✗ Branch 353 → 354 not taken.
✗ Branch 353 → 355 not taken.
263 const ICalTime::Value from = start.isEmpty() ? ICalTime::Value{} : ICalTime::parseProperty(propertyOf(start), zones);
226
6/12
✓ Branch 77 → 78 taken 3 times.
✓ Branch 77 → 80 taken 260 times.
✓ Branch 80 → 81 taken 260 times.
✓ Branch 81 → 82 taken 260 times.
✓ Branch 82 → 83 taken 260 times.
✓ Branch 82 → 84 taken 3 times.
✗ Branch 356 → 357 not taken.
✗ Branch 356 → 358 not taken.
✗ Branch 360 → 361 not taken.
✗ Branch 360 → 363 not taken.
✗ Branch 361 → 362 not taken.
✗ Branch 361 → 363 not taken.
263 ICalTime::Value to = end.isEmpty() ? ICalTime::Value{} : ICalTime::parseProperty(propertyOf(end), zones);
227
12/18
✓ Branch 84 → 85 taken 263 times.
✓ Branch 85 → 86 taken 3 times.
✓ Branch 85 → 94 taken 260 times.
✓ Branch 86 → 87 taken 3 times.
✓ Branch 87 → 88 taken 3 times.
✗ Branch 87 → 94 not taken.
✓ Branch 92 → 93 taken 3 times.
✗ Branch 92 → 94 not taken.
✓ Branch 95 → 96 taken 3 times.
✓ Branch 95 → 97 taken 260 times.
✓ Branch 97 → 98 taken 3 times.
✓ Branch 97 → 99 taken 260 times.
✓ Branch 99 → 100 taken 3 times.
✓ Branch 99 → 116 taken 260 times.
✗ Branch 364 → 365 not taken.
✗ Branch 364 → 366 not taken.
✗ Branch 368 → 369 not taken.
✗ Branch 368 → 370 not taken.
266 if (!to.valid() && from.valid() && lines.contains(QStringLiteral("DURATION"))) {
228 3 bool ok = false;
229
2/2
✓ Branch 104 → 105 taken 3 times.
✓ Branch 105 → 106 taken 3 times.
3 const int minutes = durationMinutes(propertyOf(lines.value(QStringLiteral("DURATION"))).value, &ok);
230
1/2
✓ Branch 110 → 111 taken 3 times.
✗ Branch 110 → 115 not taken.
3 if (ok)
231 3 to = {from.dateTime.addSecs(qint64(minutes) * 60), from.dateOnly, from.floating};
232 }
233 526 const auto local = [&context](const ICalTime::Value &value) {
234
4/4
✓ Branch 2 → 3 taken 520 times.
✓ Branch 2 → 4 taken 6 times.
✓ Branch 3 → 4 taken 9 times.
✓ Branch 3 → 5 taken 511 times.
526 return value.floating || value.dateOnly ? value.dateTime : value.dateTime.toTimeZone(context.zone);
235 263 };
236
5/8
✓ Branch 116 → 117 taken 263 times.
✓ Branch 117 → 118 taken 263 times.
✗ Branch 117 → 121 not taken.
✓ Branch 118 → 119 taken 263 times.
✓ Branch 119 → 120 taken 263 times.
✗ Branch 119 → 121 not taken.
✓ Branch 122 → 123 taken 263 times.
✗ Branch 122 → 268 not taken.
263 if (from.valid() && to.valid()) {
237
2/2
✓ Branch 123 → 124 taken 263 times.
✓ Branch 124 → 125 taken 263 times.
263 const QDateTime a = local(from), b = local(to);
238
2/2
✓ Branch 125 → 126 taken 6 times.
✓ Branch 125 → 174 taken 257 times.
263 if (from.dateOnly) {
239
2/2
✓ Branch 126 → 127 taken 6 times.
✓ Branch 127 → 128 taken 6 times.
6 const QDate last = b.date().addDays(-1);
240
4/18
✓ Branch 128 → 129 taken 6 times.
✗ Branch 132 → 133 not taken.
✗ Branch 136 → 137 not taken.
✗ Branch 137 → 138 not taken.
✗ Branch 167 → 168 not taken.
✓ Branch 167 → 169 taken 6 times.
✗ Branch 169 → 170 not taken.
✓ Branch 169 → 171 taken 6 times.
✗ Branch 171 → 172 not taken.
✓ Branch 171 → 173 taken 6 times.
✗ Branch 415 → 416 not taken.
✗ Branch 415 → 417 not taken.
✗ Branch 419 → 420 not taken.
✗ Branch 419 → 421 not taken.
✗ Branch 423 → 424 not taken.
✗ Branch 423 → 425 not taken.
✗ Branch 427 → 428 not taken.
✗ Branch 427 → 429 not taken.
12 return last <= a.date() ? locale.toString(a.date(), QStringLiteral("ddd d MMM yyyy")) + tr(", all day")
241
2/5
✓ Branch 139 → 140 taken 6 times.
✗ Branch 165 → 166 not taken.
✓ Branch 165 → 167 taken 6 times.
✗ Branch 411 → 412 not taken.
✗ Branch 411 → 413 not taken.
12 : tr("%1 – %2, all day")
242
5/14
✓ Branch 147 → 148 taken 6 times.
✓ Branch 148 → 149 taken 6 times.
✓ Branch 151 → 152 taken 6 times.
✗ Branch 151 → 153 not taken.
✓ Branch 153 → 154 taken 6 times.
✗ Branch 153 → 155 not taken.
✓ Branch 155 → 156 taken 6 times.
✗ Branch 155 → 157 not taken.
✗ Branch 387 → 388 not taken.
✗ Branch 387 → 389 not taken.
✗ Branch 391 → 392 not taken.
✗ Branch 391 → 393 not taken.
✗ Branch 395 → 396 not taken.
✗ Branch 395 → 397 not taken.
12 .arg(locale.toString(a.date(), QStringLiteral("ddd d MMM")),
243
7/19
✗ Branch 131 → 132 not taken.
✓ Branch 131 → 139 taken 6 times.
✗ Branch 138 → 150 not taken.
✓ Branch 143 → 144 taken 6 times.
✓ Branch 149 → 150 taken 6 times.
✓ Branch 157 → 158 taken 6 times.
✗ Branch 157 → 159 not taken.
✓ Branch 159 → 160 taken 6 times.
✗ Branch 159 → 161 not taken.
✓ Branch 161 → 162 taken 6 times.
✗ Branch 161 → 163 not taken.
✓ Branch 163 → 164 taken 6 times.
✗ Branch 163 → 165 not taken.
✗ Branch 399 → 400 not taken.
✗ Branch 399 → 401 not taken.
✗ Branch 403 → 404 not taken.
✗ Branch 403 → 405 not taken.
✗ Branch 407 → 408 not taken.
✗ Branch 407 → 409 not taken.
30 locale.toString(last, QStringLiteral("ddd d MMM yyyy")));
244 }
245 // Times are the user's; another original zone adds its own times
246 // (§4.3): "09:00–10:00 (11:00–12:00 Europe/Berlin)".
247 257 QString zone;
248
10/14
✓ Branch 174 → 175 taken 254 times.
✓ Branch 174 → 181 taken 3 times.
✓ Branch 175 → 176 taken 254 times.
✓ Branch 176 → 177 taken 254 times.
✗ Branch 176 → 181 not taken.
✓ Branch 177 → 178 taken 254 times.
✓ Branch 179 → 180 taken 254 times.
✗ Branch 179 → 181 not taken.
✓ Branch 182 → 183 taken 254 times.
✓ Branch 182 → 184 taken 3 times.
✓ Branch 184 → 185 taken 254 times.
✓ Branch 184 → 220 taken 3 times.
✗ Branch 433 → 434 not taken.
✗ Branch 433 → 435 not taken.
257 if (!from.floating && from.dateTime.timeSpec() == Qt::TimeZone && from.dateTime.timeZone() != context.zone)
249 508 zone = QStringLiteral(" (%1–%2 %3)")
250
3/3
✓ Branch 201 → 202 taken 254 times.
✓ Branch 202 → 203 taken 254 times.
✓ Branch 203 → 204 taken 254 times.
762 .arg(locale.toString(from.dateTime.time(), QStringLiteral("HH:mm")),
251
4/4
✓ Branch 194 → 195 taken 254 times.
✓ Branch 195 → 196 taken 254 times.
✓ Branch 196 → 197 taken 254 times.
✓ Branch 197 → 198 taken 254 times.
508 locale.toString(to.dateTime.toTimeZone(from.dateTime.timeZone()).time(), QStringLiteral("HH:mm")),
252
3/3
✓ Branch 188 → 189 taken 254 times.
✓ Branch 189 → 190 taken 254 times.
✓ Branch 190 → 191 taken 254 times.
762 QString::fromUtf8(from.dateTime.timeZone().id()));
253
3/4
✓ Branch 220 → 221 taken 257 times.
✓ Branch 221 → 222 taken 257 times.
✓ Branch 223 → 224 taken 257 times.
✗ Branch 223 → 255 not taken.
257 if (a.date() == b.date())
254
1/1
✓ Branch 224 → 225 taken 257 times.
257 return tr("%1 %2–%3")
255
3/3
✓ Branch 238 → 239 taken 257 times.
✓ Branch 239 → 240 taken 257 times.
✓ Branch 240 → 241 taken 257 times.
771 .arg(locale.toString(a.date(), QStringLiteral("ddd d MMM yyyy")),
256
4/4
✓ Branch 228 → 229 taken 257 times.
✓ Branch 229 → 230 taken 257 times.
✓ Branch 233 → 234 taken 257 times.
✓ Branch 234 → 235 taken 257 times.
771 locale.toString(a.time(), QStringLiteral("HH:mm")), locale.toString(b.time(), QStringLiteral("HH:mm"))) +
257
1/1
✓ Branch 241 → 242 taken 257 times.
257 zone;
258 ✗ return tr("%1 – %2").arg(dateTimeText(start, context), dateTimeText(end, context));
259 263 }
260 ✗ if (from.valid())
261 ✗ return tr("Starts %1").arg(dateTimeText(start, context));
262 ✗ if (to.valid())
263 ✗ return tr("Due %1").arg(dateTimeText(end, context));
264 1578 }
265 413 QStringList parts;
266
2/2
✓ Branch 329 → 316 taken 1036 times.
✓ Branch 329 → 330 taken 413 times.
1449 for (const Merge::Item *item : members) {
267
1/1
✓ Branch 317 → 318 taken 1036 times.
1036 const QString text = value(plan, *item, side, context);
268
6/6
✓ Branch 319 → 320 taken 625 times.
✓ Branch 319 → 323 taken 411 times.
✓ Branch 321 → 322 taken 592 times.
✓ Branch 321 → 323 taken 33 times.
✓ Branch 324 → 325 taken 592 times.
✓ Branch 324 → 326 taken 444 times.
1036 if (!text.isEmpty() && !parts.contains(text))
269
1/1
✓ Branch 325 → 326 taken 592 times.
592 parts.append(text);
270 1036 }
271
1/1
✓ Branch 333 → 334 taken 413 times.
413 return parts.join(QStringLiteral(" · "));
272 679 }
273
274 304 QString ConflictValueText::componentLabel(const Merge::Plan &plan, const Merge::Item &item, const Context &context) {
275
6/6
✓ Branch 4 → 5 taken 147 times.
✓ Branch 4 → 8 taken 157 times.
✓ Branch 7 → 8 taken 12 times.
✓ Branch 7 → 9 taken 135 times.
✓ Branch 10 → 11 taken 169 times.
✓ Branch 10 → 12 taken 135 times.
304 if (plan.domain == QLatin1String("sieve") || plan.domain == QLatin1String("settings"))
276 169 return label(plan, item);
277
2/2
✓ Branch 13 → 14 taken 50 times.
✓ Branch 13 → 39 taken 85 times.
135 if (!item.context.isEmpty()) {
278
2/2
✓ Branch 17 → 18 taken 50 times.
✓ Branch 21 → 22 taken 50 times.
150 const QString date = dateTimeText(QStringLiteral("RECURRENCE-ID:") + item.context.section(QLatin1Char(':'), -1),
279
1/1
✓ Branch 22 → 23 taken 50 times.
50 context);
280
3/3
✓ Branch 27 → 28 taken 50 times.
✓ Branch 32 → 33 taken 50 times.
✓ Branch 33 → 34 taken 50 times.
100 return tr("Occurrence %1").arg(date.section(QLatin1Char(' '), 0, 3));
281 50 }
282
2/4
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 85 times.
✗ Branch 42 → 44 not taken.
✓ Branch 43 → 44 taken 85 times.
85 return item.name == QLatin1String("VTODO") ? tr("Task") : tr("Appointment");
283 }
284
285 4388 QString ConflictValueText::value(const Merge::Plan &plan, const Merge::Item &item, Side side, const Context &context) {
286 4388 const Merge::Value &v = valueOf(item, side);
287
2/2
✓ Branch 3 → 4 taken 510 times.
✓ Branch 3 → 5 taken 3878 times.
4388 if (!v.present)
288 510 return {};
289 // ─── settings ───
290
2/2
✓ Branch 7 → 8 taken 137 times.
✓ Branch 7 → 313 taken 3741 times.
3878 if (plan.domain == QLatin1String("settings")) {
291
2/2
✓ Branch 10 → 11 taken 11 times.
✓ Branch 10 → 16 taken 126 times.
137 if (item.name == QLatin1String("hiddenFolders"))
292
2/2
✓ Branch 11 → 12 taken 11 times.
✓ Branch 13 → 14 taken 11 times.
22 return tr("Hidden: %1").arg(item.context);
293
2/2
✓ Branch 18 → 19 taken 15 times.
✓ Branch 18 → 131 taken 111 times.
126 if (item.name == QLatin1String("davAccounts")) {
294
2/2
✓ Branch 19 → 20 taken 15 times.
✓ Branch 20 → 21 taken 15 times.
15 const QJsonDocument json = QJsonDocument::fromJson(v.text.toUtf8());
295
3/3
✓ Branch 22 → 23 taken 15 times.
✓ Branch 23 → 24 taken 6 times.
✓ Branch 23 → 57 taken 9 times.
15 if (json.isArray()) {
296 6 QStringList names;
297
6/6
✓ Branch 24 → 25 taken 6 times.
✓ Branch 25 → 26 taken 6 times.
✓ Branch 26 → 27 taken 6 times.
✓ Branch 29 → 30 taken 6 times.
✓ Branch 41 → 28 taken 6 times.
✓ Branch 41 → 42 taken 6 times.
12 for (const QJsonValue &entry : json.array())
298
3/3
✓ Branch 30 → 31 taken 6 times.
✓ Branch 34 → 35 taken 6 times.
✓ Branch 35 → 36 taken 6 times.
18 names.append(entry.toString().section(QLatin1Char('/'), -2, -2));
299
4/12
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 46 taken 6 times.
✗ Branch 45 → 50 not taken.
✓ Branch 49 → 50 taken 6 times.
✓ Branch 51 → 52 taken 6 times.
✗ Branch 51 → 53 not taken.
✓ Branch 53 → 54 taken 6 times.
✗ Branch 53 → 55 not taken.
✗ Branch 949 → 950 not taken.
✗ Branch 949 → 951 not taken.
✗ Branch 953 → 954 not taken.
✗ Branch 953 → 955 not taken.
12 return names.isEmpty() ? tr("None") : names.join(QStringLiteral(", "));
300 6 }
301
1/1
✓ Branch 57 → 58 taken 9 times.
9 const QJsonObject object = json.object();
302
3/3
✓ Branch 61 → 62 taken 9 times.
✓ Branch 64 → 65 taken 6 times.
✓ Branch 64 → 105 taken 3 times.
9 if (object.contains(QStringLiteral("selected"))) {
303 6 QStringList names;
304
7/7
✓ Branch 68 → 69 taken 6 times.
✓ Branch 69 → 70 taken 6 times.
✓ Branch 73 → 74 taken 6 times.
✓ Branch 74 → 75 taken 6 times.
✓ Branch 77 → 78 taken 6 times.
✓ Branch 89 → 76 taken 6 times.
✓ Branch 89 → 90 taken 6 times.
12 for (const QJsonValue &entry : object.value(QStringLiteral("selected")).toArray())
305
3/3
✓ Branch 78 → 79 taken 6 times.
✓ Branch 82 → 83 taken 6 times.
✓ Branch 83 → 84 taken 6 times.
18 names.append(entry.toString().section(QLatin1Char('/'), -2, -2));
306
4/12
✗ Branch 92 → 93 not taken.
✓ Branch 92 → 94 taken 6 times.
✗ Branch 93 → 98 not taken.
✓ Branch 97 → 98 taken 6 times.
✓ Branch 99 → 100 taken 6 times.
✗ Branch 99 → 101 not taken.
✓ Branch 101 → 102 taken 6 times.
✗ Branch 101 → 103 not taken.
✗ Branch 991 → 992 not taken.
✗ Branch 991 → 993 not taken.
✗ Branch 995 → 996 not taken.
✗ Branch 995 → 997 not taken.
12 return names.isEmpty() ? tr("None") : names.join(QStringLiteral(", "));
307 6 }
308
3/3
✓ Branch 105 → 106 taken 3 times.
✓ Branch 114 → 115 taken 3 times.
✓ Branch 115 → 116 taken 3 times.
12 return tr("%1 at %2").arg(object.value(QStringLiteral("username")).toString(),
309
3/3
✓ Branch 109 → 110 taken 3 times.
✓ Branch 110 → 111 taken 3 times.
✓ Branch 116 → 117 taken 3 times.
9 object.value(QStringLiteral("serverUrl")).toString());
310 15 }
311
2/2
✓ Branch 133 → 134 taken 50 times.
✓ Branch 133 → 145 taken 61 times.
111 if (item.context == QLatin1String("defaultView"))
312
2/2
✓ Branch 136 → 137 taken 2 times.
✓ Branch 136 → 138 taken 48 times.
50 return v.text == QLatin1String("html") ? tr("Original layout")
313
2/2
✓ Branch 140 → 141 taken 24 times.
✓ Branch 140 → 142 taken 24 times.
98 : v.text == QLatin1String("light") ? tr("Simple layout")
314
3/3
✓ Branch 137 → 143 taken 2 times.
✓ Branch 141 → 143 taken 24 times.
✓ Branch 142 → 143 taken 24 times.
50 : tr("Plain text");
315
2/2
✓ Branch 147 → 148 taken 6 times.
✓ Branch 147 → 167 taken 55 times.
61 if (item.context == QLatin1String("language"))
316
0/2
✗ Branch 1041 → 1042 not taken.
✗ Branch 1041 → 1043 not taken.
12 return v.text == QLatin1String("de") ? QStringLiteral("Deutsch")
317
6/8
✓ Branch 156 → 157 taken 2 times.
✓ Branch 156 → 160 taken 2 times.
✓ Branch 162 → 163 taken 2 times.
✓ Branch 162 → 164 taken 4 times.
✓ Branch 164 → 165 taken 2 times.
✓ Branch 164 → 166 taken 4 times.
✗ Branch 1036 → 1037 not taken.
✗ Branch 1036 → 1038 not taken.
10 : v.text == QLatin1String("en") ? QStringLiteral("English")
318
3/3
✓ Branch 150 → 151 taken 2 times.
✓ Branch 150 → 154 taken 4 times.
✓ Branch 160 → 161 taken 2 times.
12 : tr("System language");
319 // Sprint 108: an address's name and signatures, a template's name,
320 // subject and beginning — in words, not JSON.
321
3/6
✓ Branch 169 → 170 taken 55 times.
✗ Branch 169 → 173 not taken.
✗ Branch 172 → 173 not taken.
✓ Branch 172 → 174 taken 55 times.
✗ Branch 175 → 176 not taken.
✓ Branch 175 → 304 taken 55 times.
55 if (item.name == QLatin1String("identities") || item.name == QLatin1String("templates")) {
322 ✗ const QJsonObject object = QJsonDocument::fromJson(v.text.toUtf8()).object();
323 ✗ if (item.name == QLatin1String("templates"))
324 ✗ return tr("%1 · %2 · %3")
325 ✗ .arg(object.value(QStringLiteral("name")).toString(), object.value(QStringLiteral("subject")).toString(),
326 ✗ shortText(object.value(QStringLiteral("text")).toString(), 120));
327 ✗ QStringList signatures;
328 ✗ for (const QJsonValue &entry : object.value(QStringLiteral("signatures")).toArray()) {
329 ✗ const QJsonObject signature = entry.toObject();
330 ✗ signatures.append(tr("%1: %2").arg(signature.value(QStringLiteral("name")).toString(),
331 ✗ shortText(signature.value(QStringLiteral("text")).toString(), 80)));
332 ✗ }
333 ✗ return tr("Name “%1”").arg(object.value(QStringLiteral("name")).toString()) +
334 ✗ (signatures.isEmpty() ? tr(" · no signature") : QStringLiteral(" · ") + signatures.join(QStringLiteral(" · ")));
335 ✗ }
336
2/2
✓ Branch 306 → 307 taken 41 times.
✓ Branch 306 → 312 taken 14 times.
55 if (item.name == QLatin1String("folderIcons"))
337
2/2
✓ Branch 307 → 308 taken 41 times.
✓ Branch 309 → 310 taken 41 times.
82 return tr("Icon “%1”").arg(v.text);
338 14 return v.text;
339 }
340 // ─── Sieve ───
341
2/2
✓ Branch 315 → 316 taken 419 times.
✓ Branch 315 → 390 taken 3322 times.
3741 if (plan.domain == QLatin1String("sieve")) {
342
2/2
✓ Branch 316 → 317 taken 42 times.
✓ Branch 316 → 354 taken 377 times.
419 if (item.kind == Merge::Kind::Order) {
343 42 QStringList names;
344
5/5
✓ Branch 320 → 321 taken 42 times.
✓ Branch 321 → 322 taken 42 times.
✓ Branch 322 → 323 taken 42 times.
✓ Branch 343 → 324 taken 168 times.
✓ Branch 343 → 344 taken 42 times.
210 for (const QString &key : v.text.split(QLatin1Char('\n'), Qt::SkipEmptyParts)) {
345
2/2
✓ Branch 328 → 329 taken 168 times.
✓ Branch 332 → 333 taken 168 times.
336 const QString name = key.section(QLatin1Char(':'), 2).section(QLatin1Char('#'), 0, 0);
346
4/4
✓ Branch 335 → 336 taken 42 times.
✓ Branch 335 → 337 taken 126 times.
✓ Branch 336 → 338 taken 42 times.
✓ Branch 338 → 339 taken 168 times.
168 names.append(name.isEmpty() ? tr("(unnamed)") : name);
347 210 }
348
1/1
✓ Branch 348 → 349 taken 42 times.
42 return names.join(QStringLiteral(" → "));
349 42 }
350
1/2
✗ Branch 354 → 355 not taken.
✓ Branch 354 → 360 taken 377 times.
377 if (item.kind == Merge::Kind::Text)
351 ✗ return shortText(v.text, 200);
352
2/2
✓ Branch 360 → 361 taken 377 times.
✓ Branch 361 → 362 taken 377 times.
377 const Sieve::Document document = Sieve::decode(v.text.toUtf8());
353
2/2
✓ Branch 381 → 365 taken 377 times.
✓ Branch 381 → 382 taken 12 times.
389 for (const Sieve::Block &block : document.blocks) {
354
2/2
✓ Branch 366 → 367 taken 329 times.
✓ Branch 366 → 376 taken 48 times.
377 if (block.kind == Sieve::BlockKind::Rule)
355
3/5
✓ Branch 367 → 368 taken 329 times.
✓ Branch 368 → 369 taken 329 times.
✗ Branch 368 → 370 not taken.
✗ Branch 370 → 371 not taken.
✓ Branch 371 → 372 taken 329 times.
329 return (block.rule.enabled ? QString() : tr("Off · ")) + RuleSentence::sentence(block.rule);
356
2/2
✓ Branch 376 → 377 taken 36 times.
✓ Branch 376 → 379 taken 12 times.
48 if (block.kind == Sieve::BlockKind::Vacation)
357
1/1
✓ Branch 377 → 378 taken 36 times.
36 return RuleSentence::vacationSummary(block.vacation);
358 }
359
2/2
✓ Branch 382 → 384 taken 12 times.
✓ Branch 384 → 385 taken 12 times.
12 return shortText(v.text.trimmed());
360 377 }
361 // ─── iCalendar / vCard ───
362
2/2
✓ Branch 392 → 393 taken 6 times.
✓ Branch 392 → 398 taken 3316 times.
3322 if (item.id == QLatin1String("raw"))
363
1/1
✓ Branch 394 → 395 taken 6 times.
6 return shortText(v.text, 200);
364
2/2
✓ Branch 398 → 399 taken 9 times.
✓ Branch 398 → 410 taken 3307 times.
3316 if (item.kind == Merge::Kind::Text)
365
5/5
✓ Branch 399 → 400 taken 3 times.
✓ Branch 399 → 401 taken 6 times.
✓ Branch 401 → 402 taken 3 times.
✓ Branch 401 → 403 taken 3 times.
✓ Branch 406 → 407 taken 9 times.
9 return shortText(side == Side::Local ? item.localPlain : side == Side::Server ? item.serverPlain : item.basePlain);
366
4/4
✓ Branch 410 → 411 taken 3286 times.
✓ Branch 410 → 412 taken 21 times.
✓ Branch 411 → 412 taken 12 times.
✓ Branch 411 → 490 taken 3274 times.
3307 if (item.kind == Merge::Kind::Component || item.kind == Merge::Kind::Deletion) {
367
1/1
✓ Branch 412 → 413 taken 33 times.
33 const ICal::Component component = ICal::parseFirst(v.text, item.name);
368
2/2
✓ Branch 416 → 417 taken 33 times.
✓ Branch 417 → 418 taken 33 times.
33 const QString summary = ICal::unescapeText(component.value(QStringLiteral("SUMMARY")));
369
1/1
✓ Branch 424 → 425 taken 33 times.
33 const ICal::Property *start = component.property(QStringLiteral("DTSTART"));
370
1/1
✓ Branch 430 → 431 taken 33 times.
33 const ICal::Property *end = component.property(QStringLiteral("DTEND"));
371 33 QString when;
372
2/4
✓ Branch 433 → 434 taken 33 times.
✗ Branch 433 → 461 not taken.
✓ Branch 434 → 435 taken 33 times.
✗ Branch 434 → 461 not taken.
33 if (start && end) {
373 33 Merge::Item s, e;
374 33 s.name = QStringLiteral("DTSTART");
375 33 s.local = {true, start->contentLine()};
376 33 e.name = QStringLiteral("DTEND");
377 33 e.local = {true, end->contentLine()};
378
2/2
✓ Branch 453 → 454 taken 33 times.
✓ Branch 454 → 455 taken 33 times.
33 when = groupValue(plan, {&s, &e}, Side::Local, context);
379
0/2
✗ Branch 461 → 462 not taken.
✗ Branch 461 → 468 not taken.
33 } else if (start) {
380 ✗ when = dateTimeText(start->contentLine(), context);
381 }
382
7/18
✗ Branch 469 → 470 not taken.
✓ Branch 469 → 471 taken 33 times.
✗ Branch 472 → 473 not taken.
✓ Branch 472 → 474 taken 33 times.
✓ Branch 477 → 478 taken 33 times.
✓ Branch 478 → 479 taken 33 times.
✓ Branch 480 → 481 taken 33 times.
✗ Branch 480 → 482 not taken.
✓ Branch 482 → 483 taken 33 times.
✗ Branch 482 → 484 not taken.
✓ Branch 484 → 485 taken 33 times.
✗ Branch 484 → 486 not taken.
✗ Branch 1288 → 1289 not taken.
✗ Branch 1288 → 1290 not taken.
✗ Branch 1292 → 1293 not taken.
✗ Branch 1292 → 1294 not taken.
✗ Branch 1296 → 1297 not taken.
✗ Branch 1296 → 1298 not taken.
66 return when.isEmpty() ? summary : summary.isEmpty() ? when : summary + QStringLiteral(" · ") + when;
383 33 }
384 3274 const QString name = item.name;
385
2/2
✓ Branch 493 → 494 taken 88 times.
✓ Branch 493 → 550 taken 3186 times.
3274 if (name == QLatin1String("BEGIN:VALARM")) {
386
1/1
✓ Branch 497 → 498 taken 88 times.
88 const ICal::Component alarm = ICal::parseFirst(v.text, QStringLiteral("VALARM"));
387
1/1
✓ Branch 503 → 504 taken 88 times.
88 const ICal::Property *trigger = alarm.property(QStringLiteral("TRIGGER"));
388 88 bool ok = false;
389
2/3
✓ Branch 506 → 507 taken 88 times.
✗ Branch 506 → 509 not taken.
✓ Branch 507 → 508 taken 88 times.
88 const int minutes = trigger ? durationMinutes(trigger->value, &ok) : 0;
390
1/2
✗ Branch 510 → 511 not taken.
✓ Branch 510 → 513 taken 88 times.
88 if (!trigger)
391 ✗ return tr("Reminder");
392
2/2
✓ Branch 513 → 514 taken 4 times.
✓ Branch 513 → 524 taken 84 times.
88 if (!ok)
393
4/4
✓ Branch 514 → 515 taken 4 times.
✓ Branch 516 → 517 taken 4 times.
✓ Branch 517 → 518 taken 4 times.
✓ Branch 518 → 519 taken 4 times.
8 return tr("Reminder at %1").arg(dateTimeText(trigger->contentLine(), context));
394 84 const int before = -minutes;
395
2/2
✓ Branch 524 → 525 taken 3 times.
✓ Branch 524 → 527 taken 81 times.
84 if (before == 0)
396
1/1
✓ Branch 525 → 526 taken 3 times.
3 return tr("At the start");
397 // English has no catalogue: the singular is its own source text.
398
4/4
✓ Branch 527 → 528 taken 77 times.
✓ Branch 527 → 533 taken 4 times.
✓ Branch 528 → 529 taken 3 times.
✓ Branch 528 → 533 taken 74 times.
81 if (before > 0 && before % (24 * 60) == 0)
399
2/4
✓ Branch 529 → 530 taken 3 times.
✗ Branch 529 → 531 not taken.
✓ Branch 530 → 532 taken 3 times.
✗ Branch 531 → 532 not taken.
3 return before == 24 * 60 ? tr("1 day before") : tr("%n days before", "", before / (24 * 60));
400
4/4
✓ Branch 533 → 534 taken 74 times.
✓ Branch 533 → 539 taken 4 times.
✓ Branch 534 → 535 taken 22 times.
✓ Branch 534 → 539 taken 52 times.
78 if (before > 0 && before % 60 == 0)
401
4/4
✓ Branch 535 → 536 taken 18 times.
✓ Branch 535 → 537 taken 4 times.
✓ Branch 536 → 538 taken 18 times.
✓ Branch 537 → 538 taken 4 times.
22 return before == 60 ? tr("1 hour before") : tr("%n hours before", "", before / 60);
402
2/2
✓ Branch 539 → 540 taken 52 times.
✓ Branch 539 → 544 taken 4 times.
56 if (before > 0)
403
2/4
✗ Branch 540 → 541 not taken.
✓ Branch 540 → 542 taken 52 times.
✗ Branch 541 → 543 not taken.
✓ Branch 542 → 543 taken 52 times.
52 return before == 1 ? tr("1 minute before") : tr("%n minutes before", "", before);
404
2/4
✗ Branch 544 → 545 not taken.
✓ Branch 544 → 546 taken 4 times.
✗ Branch 545 → 547 not taken.
✓ Branch 546 → 547 taken 4 times.
4 return before == -1 ? tr("1 minute after") : tr("%n minutes after", "", -before);
405 88 }
406
2/2
✓ Branch 550 → 551 taken 3186 times.
✓ Branch 551 → 552 taken 3186 times.
3186 const ICal::Property property = propertyOf(firstLine(v.text));
407
2/2
✓ Branch 554 → 555 taken 125 times.
✓ Branch 554 → 560 taken 3061 times.
3186 if (property.name.isEmpty())
408
1/1
✓ Branch 556 → 557 taken 125 times.
125 return shortText(v.text);
409
1/1
✓ Branch 560 → 561 taken 3061 times.
3061 const QString base = VCardCodec::baseName(property);
410
1/1
✓ Branch 561 → 562 taken 3061 times.
3061 const QString raw = ICal::unescapeText(property.value);
411
6/6
✓ Branch 567 → 568 taken 2748 times.
✓ Branch 567 → 580 taken 143 times.
✓ Branch 570 → 571 taken 2691 times.
✓ Branch 570 → 580 taken 57 times.
✓ Branch 573 → 574 taken 2671 times.
✓ Branch 573 → 580 taken 20 times.
8643 if (base == QLatin1String("DTSTART") || base == QLatin1String("DTEND") || base == QLatin1String("DUE") ||
412
8/8
✓ Branch 564 → 565 taken 2891 times.
✓ Branch 564 → 580 taken 170 times.
✓ Branch 576 → 577 taken 2653 times.
✓ Branch 576 → 580 taken 18 times.
✓ Branch 579 → 580 taken 44 times.
✓ Branch 579 → 581 taken 2609 times.
✓ Branch 582 → 583 taken 452 times.
✓ Branch 582 → 588 taken 2609 times.
8643 base == QLatin1String("COMPLETED") || base == QLatin1String("RDATE") || base == QLatin1String("EXDATE"))
413
2/2
✓ Branch 583 → 584 taken 452 times.
✓ Branch 584 → 585 taken 452 times.
452 return dateTimeText(firstLine(v.text), context);
414
2/2
✓ Branch 590 → 591 taken 24 times.
✓ Branch 590 → 603 taken 2585 times.
2609 if (base == QLatin1String("RRULE")) {
415
1/1
✓ Branch 591 → 592 taken 24 times.
24 const RecurrenceRule rule = RecurrenceRule::parse(property.value);
416
1/1
✓ Branch 593 → 594 taken 24 times.
24 const QString described = describeRecurrence(rule, QDateTime());
417
1/2
✗ Branch 596 → 597 not taken.
✓ Branch 596 → 598 taken 24 times.
24 return described.isEmpty() ? raw : described;
418 24 }
419
2/2
✓ Branch 605 → 606 taken 3 times.
✓ Branch 605 → 614 taken 2582 times.
2585 if (base == QLatin1String("DURATION")) {
420 3 bool ok = false;
421
1/1
✓ Branch 606 → 607 taken 3 times.
3 const int minutes = durationMinutes(property.value, &ok);
422
3/6
✗ Branch 607 → 608 not taken.
✓ Branch 607 → 609 taken 3 times.
✗ Branch 609 → 610 not taken.
✓ Branch 609 → 611 taken 3 times.
✗ Branch 610 → 612 not taken.
✓ Branch 611 → 612 taken 3 times.
3 return !ok ? raw : minutes == 1 ? tr("1 minute") : tr("%n minutes", "", minutes);
423 }
424
6/6
✓ Branch 616 → 617 taken 2419 times.
✓ Branch 616 → 620 taken 163 times.
✓ Branch 619 → 620 taken 6 times.
✓ Branch 619 → 621 taken 2413 times.
✓ Branch 622 → 623 taken 169 times.
✓ Branch 622 → 678 taken 2413 times.
2582 if (base == QLatin1String("ATTENDEE") || base == QLatin1String("ORGANIZER")) {
425
2/7
✓ Branch 626 → 627 taken 169 times.
✓ Branch 638 → 639 taken 169 times.
✗ Branch 638 → 640 not taken.
✗ Branch 1351 → 1352 not taken.
✗ Branch 1351 → 1353 not taken.
✗ Branch 1355 → 1356 not taken.
✗ Branch 1355 → 1357 not taken.
507 const QString who = property.hasParameter(QStringLiteral("CN")) ? property.parameter(QStringLiteral("CN"))
426
3/6
✓ Branch 627 → 628 taken 169 times.
✗ Branch 627 → 632 not taken.
✓ Branch 631 → 636 taken 169 times.
✗ Branch 635 → 636 not taken.
✓ Branch 636 → 637 taken 169 times.
✗ Branch 636 → 638 not taken.
338 : raw.section(QLatin1Char(':'), 1);
427
2/2
✓ Branch 645 → 646 taken 169 times.
✓ Branch 646 → 647 taken 169 times.
169 const QString partstat = property.parameter(QStringLiteral("PARTSTAT")).toUpper();
428
2/2
✓ Branch 652 → 653 taken 75 times.
✓ Branch 652 → 654 taken 94 times.
169 const QString answer = partstat == QLatin1String("ACCEPTED") ? tr("accepted")
429
2/2
✓ Branch 656 → 657 taken 8 times.
✓ Branch 656 → 658 taken 86 times.
94 : partstat == QLatin1String("DECLINED") ? tr("declined")
430
2/2
✓ Branch 660 → 661 taken 2 times.
✓ Branch 660 → 662 taken 84 times.
86 : partstat == QLatin1String("TENTATIVE") ? tr("maybe")
431
2/2
✓ Branch 663 → 664 taken 6 times.
✓ Branch 663 → 665 taken 78 times.
84 : partstat.isEmpty() ? QString()
432
4/4
✓ Branch 653 → 666 taken 75 times.
✓ Branch 657 → 666 taken 8 times.
✓ Branch 661 → 666 taken 2 times.
✓ Branch 665 → 666 taken 78 times.
169 : tr("no answer yet");
433
6/8
✓ Branch 667 → 668 taken 6 times.
✓ Branch 667 → 669 taken 163 times.
✓ Branch 669 → 670 taken 163 times.
✓ Branch 670 → 671 taken 163 times.
✓ Branch 672 → 673 taken 163 times.
✓ Branch 672 → 674 taken 6 times.
✗ Branch 1377 → 1378 not taken.
✗ Branch 1377 → 1379 not taken.
169 return answer.isEmpty() ? who : tr("%1 (%2)").arg(who, answer);
434 169 }
435
2/2
✓ Branch 680 → 681 taken 78 times.
✓ Branch 680 → 710 taken 2335 times.
2413 if (base == QLatin1String("STATUS")) {
436
1/1
✓ Branch 681 → 682 taken 78 times.
78 const QString status = raw.toUpper();
437
2/2
✓ Branch 684 → 685 taken 20 times.
✓ Branch 684 → 686 taken 58 times.
78 return status == QLatin1String("COMPLETED") ? tr("Done")
438
2/2
✓ Branch 688 → 689 taken 20 times.
✓ Branch 688 → 690 taken 38 times.
58 : status == QLatin1String("IN-PROCESS") ? tr("In progress")
439
2/2
✓ Branch 692 → 693 taken 2 times.
✓ Branch 692 → 694 taken 36 times.
38 : status == QLatin1String("CANCELLED") ? tr("Cancelled")
440
2/2
✓ Branch 696 → 697 taken 32 times.
✓ Branch 696 → 698 taken 4 times.
36 : status == QLatin1String("NEEDS-ACTION") ? tr("Open")
441
2/2
✓ Branch 700 → 701 taken 2 times.
✓ Branch 700 → 702 taken 2 times.
4 : status == QLatin1String("CONFIRMED") ? tr("Confirmed")
442
1/2
✓ Branch 704 → 705 taken 2 times.
✗ Branch 704 → 706 not taken.
2 : status == QLatin1String("TENTATIVE") ? tr("Tentative")
443
6/6
✓ Branch 685 → 707 taken 20 times.
✓ Branch 689 → 707 taken 20 times.
✓ Branch 693 → 707 taken 2 times.
✓ Branch 697 → 707 taken 32 times.
✓ Branch 701 → 707 taken 2 times.
✓ Branch 705 → 707 taken 2 times.
78 : raw;
444 78 }
445
2/2
✓ Branch 712 → 713 taken 30 times.
✓ Branch 712 → 719 taken 2305 times.
2335 if (base == QLatin1String("PERCENT-COMPLETE"))
446
3/3
✓ Branch 713 → 714 taken 30 times.
✓ Branch 715 → 716 taken 30 times.
✓ Branch 716 → 717 taken 30 times.
60 return tr("%1 %").arg(raw.toInt());
447
2/2
✓ Branch 721 → 722 taken 30 times.
✓ Branch 721 → 731 taken 2275 times.
2305 if (base == QLatin1String("PRIORITY")) {
448
1/1
✓ Branch 722 → 723 taken 30 times.
30 const int priority = raw.toInt();
449
8/10
✗ Branch 723 → 724 not taken.
✓ Branch 723 → 725 taken 30 times.
✗ Branch 724 → 730 not taken.
✓ Branch 725 → 726 taken 10 times.
✓ Branch 725 → 727 taken 20 times.
✓ Branch 726 → 730 taken 10 times.
✓ Branch 727 → 728 taken 10 times.
✓ Branch 727 → 729 taken 10 times.
✓ Branch 728 → 730 taken 10 times.
✓ Branch 729 → 730 taken 10 times.
30 return priority == 0 ? tr("None") : priority <= 4 ? tr("High") : priority == 5 ? tr("Normal") : tr("Low");
450 }
451
2/2
✓ Branch 733 → 734 taken 47 times.
✓ Branch 733 → 748 taken 2228 times.
2275 if (base == QLatin1String("RELATED-TO")) {
452
6/8
✓ Branch 735 → 736 taken 11 times.
✓ Branch 735 → 738 taken 36 times.
✓ Branch 736 → 737 taken 11 times.
✓ Branch 737 → 739 taken 11 times.
✓ Branch 739 → 740 taken 11 times.
✓ Branch 739 → 741 taken 36 times.
✗ Branch 1401 → 1402 not taken.
✗ Branch 1401 → 1403 not taken.
47 const QString title = context.taskTitle ? context.taskTitle(raw.trimmed()) : QString();
453
2/2
✓ Branch 742 → 743 taken 43 times.
✓ Branch 742 → 744 taken 4 times.
47 return title.isEmpty() ? raw : title;
454 47 }
455
2/2
✓ Branch 750 → 751 taken 47 times.
✓ Branch 750 → 785 taken 2181 times.
2228 if (base == QLatin1String("RELATED")) {
456
6/8
✓ Branch 752 → 753 taken 11 times.
✓ Branch 752 → 755 taken 36 times.
✓ Branch 753 → 754 taken 11 times.
✓ Branch 754 → 756 taken 11 times.
✓ Branch 756 → 757 taken 11 times.
✓ Branch 756 → 758 taken 36 times.
✗ Branch 1406 → 1407 not taken.
✗ Branch 1406 → 1408 not taken.
47 const QString who = context.contactName ? context.contactName(raw.trimmed()) : QString();
457
1/1
✓ Branch 761 → 762 taken 47 times.
47 const QString type = property.parameter(QStringLiteral("TYPE"));
458
7/14
✓ Branch 765 → 766 taken 43 times.
✓ Branch 765 → 767 taken 4 times.
✗ Branch 769 → 770 not taken.
✓ Branch 769 → 771 taken 47 times.
✓ Branch 774 → 775 taken 47 times.
✓ Branch 775 → 776 taken 47 times.
✓ Branch 778 → 779 taken 47 times.
✗ Branch 778 → 780 not taken.
✓ Branch 780 → 781 taken 47 times.
✗ Branch 780 → 782 not taken.
✗ Branch 1418 → 1419 not taken.
✗ Branch 1418 → 1420 not taken.
✗ Branch 1422 → 1423 not taken.
✗ Branch 1422 → 1424 not taken.
94 return (type.isEmpty() ? QString() : type + QStringLiteral(": ")) + (who.isEmpty() ? raw : who);
459 47 }
460
2/2
✓ Branch 787 → 788 taken 62 times.
✓ Branch 787 → 798 taken 2119 times.
2181 if (base == QLatin1String("PHOTO"))
461
2/4
✓ Branch 789 → 790 taken 62 times.
✓ Branch 791 → 792 taken 14 times.
✗ Branch 1433 → 1434 not taken.
✗ Branch 1433 → 1435 not taken.
138 return property.value.startsWith(QLatin1String("http"), Qt::CaseInsensitive) ? tr("Picture at %1").arg(property.value)
462
6/6
✓ Branch 790 → 791 taken 14 times.
✓ Branch 790 → 794 taken 48 times.
✓ Branch 793 → 795 taken 14 times.
✓ Branch 794 → 795 taken 48 times.
✓ Branch 795 → 796 taken 14 times.
✓ Branch 795 → 797 taken 48 times.
76 : tr("Picture");
463
2/2
✓ Branch 800 → 801 taken 48 times.
✓ Branch 800 → 831 taken 2071 times.
2119 if (base == QLatin1String("N")) {
464
1/1
✓ Branch 804 → 805 taken 48 times.
48 const QStringList parts = raw.split(QLatin1Char(';'));
465
2/4
✓ Branch 827 → 828 taken 240 times.
✓ Branch 827 → 829 taken 48 times.
✗ Branch 1458 → 1459 not taken.
✗ Branch 1458 → 1460 not taken.
288 return QStringList{parts.value(3), parts.value(1), parts.value(2), parts.value(0), parts.value(4)}
466
2/2
✓ Branch 815 → 816 taken 48 times.
✓ Branch 816 → 817 taken 48 times.
96 .filter(QRegularExpression(QStringLiteral("\\S")))
467
1/1
✓ Branch 819 → 820 taken 48 times.
48 .join(QLatin1Char(' '));
468 48 }
469
2/2
✓ Branch 833 → 834 taken 41 times.
✓ Branch 833 → 850 taken 2030 times.
2071 if (base == QLatin1String("ADR")) {
470
1/1
✓ Branch 837 → 838 taken 41 times.
41 QStringList parts = raw.split(QLatin1Char(';'));
471
1/1
✓ Branch 839 → 840 taken 41 times.
41 parts.removeAll(QString());
472
1/1
✓ Branch 844 → 845 taken 41 times.
41 return parts.join(QStringLiteral(", "));
473 41 }
474
8/8
✓ Branch 852 → 853 taken 1875 times.
✓ Branch 852 → 862 taken 155 times.
✓ Branch 855 → 856 taken 1708 times.
✓ Branch 855 → 862 taken 167 times.
✓ Branch 858 → 859 taken 1655 times.
✓ Branch 858 → 862 taken 53 times.
✓ Branch 861 → 862 taken 29 times.
✓ Branch 861 → 863 taken 1626 times.
3685 if (base == QLatin1String("TEL") || base == QLatin1String("EMAIL") || base == QLatin1String("URL") ||
475
2/2
✓ Branch 864 → 865 taken 404 times.
✓ Branch 864 → 883 taken 1626 times.
3685 base == QLatin1String("IMPP")) {
476
2/2
✓ Branch 868 → 869 taken 404 times.
✓ Branch 869 → 870 taken 404 times.
404 const QString type = property.parameter(QStringLiteral("TYPE")).toLower();
477
6/8
✓ Branch 874 → 875 taken 82 times.
✓ Branch 874 → 876 taken 322 times.
✓ Branch 876 → 877 taken 322 times.
✓ Branch 877 → 878 taken 322 times.
✓ Branch 879 → 880 taken 322 times.
✓ Branch 879 → 881 taken 82 times.
✗ Branch 1496 → 1497 not taken.
✗ Branch 1496 → 1498 not taken.
404 return type.isEmpty() ? raw : tr("%1 (%2)").arg(raw, type);
478 404 }
479
2/2
✓ Branch 885 → 886 taken 143 times.
✓ Branch 885 → 896 taken 1483 times.
1626 if (base == QLatin1String("CATEGORIES"))
480
2/2
✓ Branch 886 → 887 taken 143 times.
✓ Branch 890 → 891 taken 143 times.
286 return ICal::splitValues(property.value).join(QStringLiteral(", "));
481
2/2
✓ Branch 898 → 899 taken 6 times.
✓ Branch 898 → 915 taken 1477 times.
1483 if (base == QLatin1String("CLASS"))
482
10/12
✓ Branch 900 → 901 taken 6 times.
✓ Branch 902 → 903 taken 2 times.
✓ Branch 902 → 904 taken 4 times.
✓ Branch 903 → 910 taken 2 times.
✓ Branch 905 → 906 taken 4 times.
✓ Branch 907 → 908 taken 2 times.
✓ Branch 907 → 909 taken 2 times.
✓ Branch 908 → 910 taken 2 times.
✓ Branch 911 → 912 taken 4 times.
✓ Branch 911 → 913 taken 2 times.
✗ Branch 1512 → 1513 not taken.
✗ Branch 1512 → 1514 not taken.
6 return raw.toUpper() == QLatin1String("PRIVATE") ? tr("Private") : raw.toUpper() == QLatin1String("PUBLIC") ? tr("Public") : raw;
483
1/1
✓ Branch 916 → 917 taken 1477 times.
1477 return shortText(raw);
484 3388 }
485
486 17 QString ConflictValueText::problemText(const QString &rule) {
487
2/2
✓ Branch 4 → 5 taken 6 times.
✓ Branch 4 → 6 taken 11 times.
17 if (rule == QLatin1String("end-before-start"))
488 6 return tr("The end is before the start.");
489
2/2
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 10 taken 10 times.
11 if (rule == QLatin1String("due-before-start"))
490 1 return tr("The task is due before it starts.");
491
2/2
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 14 taken 9 times.
10 if (rule == QLatin1String("end-and-duration"))
492 1 return tr("An end and a duration cannot both be kept.");
493
2/2
✓ Branch 16 → 17 taken 1 time.
✓ Branch 16 → 18 taken 8 times.
9 if (rule == QLatin1String("task-completion"))
494 1 return tr("Done, progress and completion date do not agree.");
495
2/2
✓ Branch 20 → 21 taken 1 time.
✓ Branch 20 → 22 taken 7 times.
8 if (rule == QLatin1String("exdate-without-recurrence"))
496 1 return tr("Dates are left out of a series that no longer repeats.");
497
2/2
✓ Branch 24 → 25 taken 1 time.
✓ Branch 24 → 26 taken 6 times.
7 if (rule == QLatin1String("occurrence-moved-and-cancelled"))
498 1 return tr("An occurrence would be both changed and left out of the series.");
499
2/2
✓ Branch 28 → 29 taken 1 time.
✓ Branch 28 → 30 taken 5 times.
6 if (rule == QLatin1String("contact-without-name"))
500 1 return tr("A contact needs a name.");
501
2/2
✓ Branch 32 → 33 taken 1 time.
✓ Branch 32 → 34 taken 4 times.
5 if (rule == QLatin1String("unreadable-result"))
502 1 return tr("The result cannot be read. Check the text.");
503
2/2
✓ Branch 36 → 37 taken 1 time.
✓ Branch 36 → 38 taken 3 times.
4 if (rule == QLatin1String("uid-changed"))
504 1 return tr("The result must keep its UID line.");
505
2/2
✓ Branch 40 → 41 taken 1 time.
✓ Branch 40 → 42 taken 2 times.
3 if (rule == QLatin1String("script-does-not-parse"))
506 1 return tr("The combined rules are not a valid script.");
507
2/2
✓ Branch 44 → 45 taken 1 time.
✓ Branch 44 → 46 taken 1 time.
2 if (rule == QLatin1String("calendars-without-account"))
508 1 return tr("Calendars of an account that is not kept.");
509 1 return rule;
510 }
511