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.5% 260 / 0 / 275
Functions: 91.7% 11 / 0 / 12
Branches: 77.3% 381 / 0 / 493

presentation/RuleEditorFields.cpp
Line Branch Exec Source
1 #include "RuleEditorFields.h"
2
3 namespace RuleEditorFields {
4
5 namespace {
6
7 using Sieve::Action;
8 using Sieve::Condition;
9
10 3224 QStringList lowered(const QStringList &values) {
11 3224 QStringList result;
12
2/2
✓ Branch 10 → 4 taken 3330 times.
✓ Branch 10 → 11 taken 3224 times.
6554 for (const QString &value : values)
13
2/2
✓ Branch 5 → 6 taken 3330 times.
✓ Branch 6 → 7 taken 3330 times.
3330 result.append(value.toLower());
14 3224 return result;
15 ✗ }
16
17 3268 QString fieldFor(const Condition &condition) {
18
2/2
✓ Branch 2 → 3 taken 39 times.
✓ Branch 2 → 8 taken 3229 times.
3268 if (condition.kind == Condition::Kind::Size)
19 39 return QStringLiteral("size");
20
2/2
✓ Branch 8 → 9 taken 5 times.
✓ Branch 8 → 14 taken 3224 times.
3229 if (condition.kind == Condition::Kind::Body)
21 5 return QStringLiteral("body");
22
1/1
✓ Branch 14 → 15 taken 3224 times.
3224 const QStringList headers = lowered(condition.headers);
23
2/2
✓ Branch 15 → 16 taken 646 times.
✓ Branch 15 → 99 taken 2578 times.
3224 if (condition.kind == Condition::Kind::Address) {
24
5/7
✓ Branch 20 → 21 taken 646 times.
✓ Branch 23 → 24 taken 646 times.
✓ Branch 23 → 25 taken 646 times.
✓ Branch 26 → 27 taken 559 times.
✓ Branch 26 → 50 taken 87 times.
✗ Branch 142 → 143 not taken.
✗ Branch 142 → 144 not taken.
1292 if (headers == QStringList{QStringLiteral("from")})
25 1118 return condition.addressPart == QLatin1String("domain") ? QStringLiteral("senderDomain")
26
3/4
✓ Branch 35 → 36 taken 479 times.
✗ Branch 35 → 39 not taken.
✓ Branch 47 → 48 taken 80 times.
✓ Branch 47 → 49 taken 479 times.
1038 : condition.addressPart == QLatin1String("all") ? QStringLiteral("from")
27
5/6
✓ Branch 29 → 30 taken 80 times.
✓ Branch 29 → 33 taken 479 times.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 559 times.
✓ Branch 45 → 46 taken 479 times.
✓ Branch 45 → 47 taken 80 times.
1677 : QStringLiteral("address");
28
1/2
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 58 taken 87 times.
87 if (condition.addressPart != QLatin1String("all"))
29 ✗ return QStringLiteral("address");
30
5/7
✓ Branch 62 → 63 taken 87 times.
✓ Branch 65 → 66 taken 87 times.
✓ Branch 65 → 67 taken 87 times.
✓ Branch 68 → 69 taken 42 times.
✓ Branch 68 → 74 taken 45 times.
✗ Branch 158 → 159 not taken.
✗ Branch 158 → 160 not taken.
174 if (headers == QStringList{QStringLiteral("to")})
31 42 return QStringLiteral("to");
32
5/7
✓ Branch 81 → 82 taken 45 times.
✓ Branch 84 → 85 taken 90 times.
✓ Branch 84 → 86 taken 45 times.
✓ Branch 88 → 89 taken 1 time.
✓ Branch 88 → 94 taken 44 times.
✗ Branch 174 → 175 not taken.
✗ Branch 174 → 176 not taken.
135 if (headers == QStringList{QStringLiteral("to"), QStringLiteral("cc")})
33 1 return QStringLiteral("toOrCc");
34 44 return QStringLiteral("address");
35 }
36
5/7
✓ Branch 103 → 104 taken 2578 times.
✓ Branch 106 → 107 taken 2578 times.
✓ Branch 106 → 108 taken 2578 times.
✓ Branch 109 → 110 taken 2067 times.
✓ Branch 109 → 115 taken 511 times.
✗ Branch 193 → 194 not taken.
✗ Branch 193 → 195 not taken.
5156 if (headers == QStringList{QStringLiteral("subject")})
37 2067 return QStringLiteral("subject");
38
5/7
✓ Branch 119 → 120 taken 511 times.
✓ Branch 122 → 123 taken 511 times.
✓ Branch 122 → 124 taken 511 times.
✓ Branch 125 → 126 taken 193 times.
✓ Branch 125 → 131 taken 318 times.
✗ Branch 209 → 210 not taken.
✗ Branch 209 → 211 not taken.
1022 if (headers == QStringList{QStringLiteral("list-id")})
39 193 return QStringLiteral("list");
40 318 return QStringLiteral("header");
41 11003 }
42
43 // :matches "abc*" / "*abc" without other wildcards read as starts/ends with.
44 13 QString patternOperator(const QStringList &values, QStringList *plain) {
45 13 bool allStart = true;
46 13 bool allEnd = true;
47 13 QStringList starts;
48 13 QStringList ends;
49
2/2
✓ Branch 46 → 4 taken 13 times.
✓ Branch 46 → 47 taken 13 times.
26 for (const QString &value : values) {
50 13 bool wildcard = false;
51
8/10
✓ Branch 6 → 7 taken 13 times.
✗ Branch 6 → 15 not taken.
✓ Branch 9 → 10 taken 13 times.
✓ Branch 10 → 11 taken 11 times.
✓ Branch 10 → 15 taken 2 times.
✓ Branch 12 → 13 taken 11 times.
✓ Branch 13 → 14 taken 11 times.
✗ Branch 13 → 15 not taken.
✓ Branch 16 → 17 taken 11 times.
✓ Branch 16 → 25 taken 2 times.
13 if (value.size() > 1 && value.endsWith(QLatin1Char('*')) && !value.endsWith(QLatin1String("\\*"))) {
52
2/2
✓ Branch 17 → 18 taken 11 times.
✓ Branch 18 → 19 taken 11 times.
11 const QString literal = unescapeWildcards(value.chopped(1), &wildcard);
53
2/2
✓ Branch 20 → 21 taken 3 times.
✓ Branch 20 → 22 taken 8 times.
11 if (wildcard)
54 3 allStart = false;
55
1/1
✓ Branch 22 → 23 taken 11 times.
11 starts.append(literal);
56 11 } else {
57 2 allStart = false;
58 }
59
6/7
✓ Branch 27 → 28 taken 13 times.
✗ Branch 27 → 33 not taken.
✓ Branch 30 → 31 taken 13 times.
✓ Branch 31 → 32 taken 1 time.
✓ Branch 31 → 33 taken 12 times.
✓ Branch 34 → 35 taken 1 time.
✓ Branch 34 → 43 taken 12 times.
13 if (value.size() > 1 && value.startsWith(QLatin1Char('*'))) {
60
2/2
✓ Branch 35 → 36 taken 1 time.
✓ Branch 36 → 37 taken 1 time.
1 const QString literal = unescapeWildcards(value.mid(1), &wildcard);
61
1/2
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 1 time.
1 if (wildcard)
62 ✗ allEnd = false;
63
1/1
✓ Branch 40 → 41 taken 1 time.
1 ends.append(literal);
64 1 } else {
65 12 allEnd = false;
66 }
67 }
68
5/6
✓ Branch 47 → 48 taken 8 times.
✓ Branch 47 → 51 taken 5 times.
✓ Branch 49 → 50 taken 8 times.
✗ Branch 49 → 51 not taken.
✓ Branch 52 → 53 taken 8 times.
✓ Branch 52 → 59 taken 5 times.
13 if (allStart && !values.isEmpty()) {
69 8 *plain = starts;
70 8 return QStringLiteral("startsWith");
71 }
72
5/6
✓ Branch 59 → 60 taken 1 time.
✓ Branch 59 → 63 taken 4 times.
✓ Branch 61 → 62 taken 1 time.
✗ Branch 61 → 63 not taken.
✓ Branch 64 → 65 taken 1 time.
✓ Branch 64 → 71 taken 4 times.
5 if (allEnd && !values.isEmpty()) {
73 1 *plain = ends;
74 1 return QStringLiteral("endsWith");
75 }
76 4 *plain = values;
77 4 return QStringLiteral("matches");
78 13 }
79
80 } // namespace
81
82 ✗ QStringList labelKeywords() {
83 ✗ return {QStringLiteral("$label1"), QStringLiteral("$label2"), QStringLiteral("$label3"),
84 ✗ QStringLiteral("$label4"), QStringLiteral("$label5")};
85 ✗ }
86
87 4 QString escapeWildcards(const QString &value) {
88 4 QString out;
89
2/2
✓ Branch 25 → 4 taken 34 times.
✓ Branch 25 → 26 taken 4 times.
38 for (const QChar c : value) {
90
7/8
✓ Branch 7 → 8 taken 30 times.
✓ Branch 7 → 16 taken 4 times.
✓ Branch 11 → 12 taken 28 times.
✓ Branch 11 → 16 taken 2 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 28 times.
✓ Branch 18 → 19 taken 6 times.
✓ Branch 18 → 23 taken 28 times.
34 if (c == QLatin1Char('*') || c == QLatin1Char('?') || c == QLatin1Char('\\'))
91
1/1
✓ Branch 21 → 22 taken 6 times.
6 out.append(QLatin1Char('\\'));
92
1/1
✓ Branch 23 → 24 taken 34 times.
34 out.append(c);
93 }
94 4 return out;
95 ✗ }
96
97 12 QString unescapeWildcards(const QString &pattern, bool *hasWildcard) {
98 12 QString out;
99 12 *hasWildcard = false;
100
2/2
✓ Branch 32 → 3 taken 91 times.
✓ Branch 32 → 33 taken 12 times.
103 for (int i = 0; i < pattern.size(); ++i) {
101 91 const QChar c = pattern.at(i);
102
5/6
✓ Branch 7 → 8 taken 6 times.
✓ Branch 7 → 11 taken 85 times.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 11 not taken.
✓ Branch 12 → 13 taken 6 times.
✓ Branch 12 → 16 taken 85 times.
91 if (c == QLatin1Char('\\') && i + 1 < pattern.size()) {
103
1/1
✓ Branch 14 → 15 taken 6 times.
6 out.append(pattern.at(++i));
104 6 continue;
105 }
106
5/6
✓ Branch 19 → 20 taken 82 times.
✓ Branch 19 → 24 taken 3 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 82 times.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 26 → 28 taken 82 times.
85 if (c == QLatin1Char('*') || c == QLatin1Char('?'))
107 3 *hasWildcard = true;
108
1/1
✓ Branch 28 → 29 taken 85 times.
85 out.append(c);
109 }
110 12 return out;
111 ✗ }
112
113 3268 QVariantMap fromCondition(const Condition &condition) {
114 3268 QVariantMap fields;
115
2/2
✓ Branch 2 → 3 taken 3268 times.
✓ Branch 7 → 8 taken 3268 times.
6536 fields.insert(QStringLiteral("field"), fieldFor(condition));
116
1/1
✓ Branch 16 → 17 taken 3268 times.
6536 fields.insert(QStringLiteral("negated"), condition.negated);
117
2/2
✓ Branch 20 → 21 taken 39 times.
✓ Branch 20 → 60 taken 3229 times.
3268 if (condition.kind == Condition::Kind::Size) {
118
7/11
✓ Branch 21 → 22 taken 32 times.
✓ Branch 21 → 25 taken 7 times.
✓ Branch 32 → 33 taken 39 times.
✓ Branch 37 → 38 taken 7 times.
✓ Branch 37 → 39 taken 32 times.
✓ Branch 39 → 40 taken 32 times.
✓ Branch 39 → 41 taken 7 times.
✗ Branch 144 → 145 not taken.
✗ Branch 144 → 146 not taken.
✗ Branch 148 → 149 not taken.
✗ Branch 148 → 150 not taken.
117 fields.insert(QStringLiteral("op"), condition.sizeOver ? QStringLiteral("over") : QStringLiteral("under"));
119
1/1
✓ Branch 45 → 46 taken 39 times.
78 fields.insert(QStringLiteral("size"), static_cast<qulonglong>(condition.sizeLimit));
120
1/1
✓ Branch 54 → 55 taken 39 times.
78 fields.insert(QStringLiteral("values"), QStringList{});
121 39 return fields;
122 }
123 3229 QStringList values = condition.values;
124 3229 QString op = condition.matchType;
125
2/2
✓ Branch 64 → 65 taken 13 times.
✓ Branch 64 → 69 taken 3216 times.
3229 if (op == QLatin1String("matches"))
126
1/1
✓ Branch 65 → 66 taken 13 times.
13 op = patternOperator(condition.values, &values);
127
1/1
✓ Branch 73 → 74 taken 3229 times.
6458 fields.insert(QStringLiteral("op"), op);
128
1/1
✓ Branch 81 → 82 taken 3229 times.
6458 fields.insert(QStringLiteral("values"), values);
129
1/1
✓ Branch 89 → 90 taken 3229 times.
6458 fields.insert(QStringLiteral("headers"), condition.headers);
130
1/1
✓ Branch 97 → 98 taken 3229 times.
6458 fields.insert(QStringLiteral("addressPart"), condition.addressPart);
131
1/1
✓ Branch 105 → 106 taken 3229 times.
6458 fields.insert(QStringLiteral("comparator"), condition.comparator);
132 3229 return fields;
133 3229 }
134
135 491 Condition toCondition(const QVariantMap &fields) {
136
1/1
✓ Branch 2 → 3 taken 491 times.
491 Condition condition;
137
2/2
✓ Branch 7 → 8 taken 491 times.
✓ Branch 8 → 9 taken 491 times.
982 const QString field = fields.value(QStringLiteral("field")).toString();
138
2/2
✓ Branch 17 → 18 taken 491 times.
✓ Branch 18 → 19 taken 491 times.
982 const QString op = fields.value(QStringLiteral("op")).toString();
139
2/2
✓ Branch 27 → 28 taken 491 times.
✓ Branch 28 → 29 taken 491 times.
982 condition.negated = fields.value(QStringLiteral("negated")).toBool();
140
2/2
✓ Branch 35 → 36 taken 17 times.
✓ Branch 35 → 49 taken 474 times.
491 if (field == QLatin1String("size")) {
141 17 condition.kind = Condition::Kind::Size;
142 17 condition.sizeOver = op != QLatin1String("under");
143
2/2
✓ Branch 42 → 43 taken 17 times.
✓ Branch 43 → 44 taken 17 times.
34 condition.sizeLimit = fields.value(QStringLiteral("size")).toULongLong();
144 17 return condition;
145 }
146
2/2
✓ Branch 53 → 54 taken 474 times.
✓ Branch 54 → 55 taken 474 times.
948 QStringList headers = fields.value(QStringLiteral("headers")).toStringList();
147
2/2
✓ Branch 63 → 64 taken 474 times.
✓ Branch 64 → 65 taken 474 times.
948 condition.comparator = fields.value(QStringLiteral("comparator")).toString();
148
6/6
✓ Branch 73 → 74 taken 317 times.
✓ Branch 73 → 77 taken 157 times.
✓ Branch 76 → 77 taken 3 times.
✓ Branch 76 → 78 taken 314 times.
✓ Branch 79 → 80 taken 160 times.
✓ Branch 79 → 107 taken 314 times.
474 if (field == QLatin1String("from") || field == QLatin1String("senderDomain")) {
149 160 condition.kind = Condition::Kind::Address;
150
2/2
✓ Branch 81 → 82 taken 97 times.
✓ Branch 81 → 91 taken 63 times.
160 if (headers.isEmpty())
151
2/4
✓ Branch 87 → 88 taken 97 times.
✓ Branch 87 → 89 taken 97 times.
✗ Branch 350 → 351 not taken.
✗ Branch 350 → 352 not taken.
194 headers = {QStringLiteral("from")};
152
2/2
✓ Branch 93 → 94 taken 3 times.
✓ Branch 93 → 97 taken 157 times.
640 condition.addressPart = field == QLatin1String("senderDomain") ? QStringLiteral("domain")
153
4/4
✓ Branch 102 → 103 taken 157 times.
✓ Branch 102 → 104 taken 3 times.
✓ Branch 104 → 105 taken 3 times.
✓ Branch 104 → 106 taken 157 times.
320 : QStringLiteral("all");
154
5/6
✓ Branch 109 → 110 taken 302 times.
✓ Branch 109 → 113 taken 12 times.
✗ Branch 112 → 113 not taken.
✓ Branch 112 → 114 taken 302 times.
✓ Branch 115 → 116 taken 12 times.
✓ Branch 115 → 150 taken 302 times.
314 } else if (field == QLatin1String("to") || field == QLatin1String("toOrCc")) {
155 12 condition.kind = Condition::Kind::Address;
156
1/2
✗ Branch 117 → 118 not taken.
✓ Branch 117 → 209 taken 12 times.
12 if (headers.isEmpty())
157 ✗ headers = field == QLatin1String("to") ? QStringList{QStringLiteral("to")}
158 ✗ : QStringList{QStringLiteral("to"), QStringLiteral("cc")};
159
2/2
✓ Branch 152 → 153 taken 12 times.
✓ Branch 152 → 171 taken 290 times.
302 } else if (field == QLatin1String("address")) {
160 12 condition.kind = Condition::Kind::Address;
161
2/2
✓ Branch 160 → 161 taken 12 times.
✓ Branch 161 → 162 taken 12 times.
24 condition.addressPart = fields.value(QStringLiteral("addressPart"), QStringLiteral("all")).toString();
162
2/2
✓ Branch 173 → 174 taken 3 times.
✓ Branch 173 → 175 taken 287 times.
290 } else if (field == QLatin1String("body")) {
163 3 condition.kind = Condition::Kind::Body;
164 } else {
165 287 condition.kind = Condition::Kind::Header;
166
6/6
✓ Branch 176 → 177 taken 60 times.
✓ Branch 176 → 181 taken 227 times.
✓ Branch 179 → 180 taken 48 times.
✓ Branch 179 → 181 taken 12 times.
✓ Branch 182 → 183 taken 48 times.
✓ Branch 182 → 192 taken 239 times.
287 if (headers.isEmpty() && field == QLatin1String("subject"))
167
2/4
✓ Branch 188 → 189 taken 48 times.
✓ Branch 188 → 190 taken 48 times.
✗ Branch 421 → 422 not taken.
✗ Branch 421 → 423 not taken.
96 headers = {QStringLiteral("subject")};
168
5/6
✓ Branch 193 → 194 taken 12 times.
✓ Branch 193 → 198 taken 275 times.
✓ Branch 196 → 197 taken 12 times.
✗ Branch 196 → 198 not taken.
✓ Branch 199 → 200 taken 12 times.
✓ Branch 199 → 209 taken 275 times.
287 if (headers.isEmpty() && field == QLatin1String("list"))
169
2/4
✓ Branch 205 → 206 taken 12 times.
✓ Branch 205 → 207 taken 12 times.
✗ Branch 434 → 435 not taken.
✗ Branch 434 → 436 not taken.
24 headers = {QStringLiteral("list-id")};
170 }
171 474 condition.headers = headers;
172
2/2
✓ Branch 214 → 215 taken 474 times.
✓ Branch 215 → 216 taken 474 times.
948 const QStringList values = fields.value(QStringLiteral("values")).toStringList();
173
5/6
✓ Branch 222 → 223 taken 470 times.
✓ Branch 222 → 226 taken 4 times.
✗ Branch 225 → 226 not taken.
✓ Branch 225 → 227 taken 470 times.
✓ Branch 228 → 229 taken 4 times.
✓ Branch 228 → 259 taken 470 times.
474 if (op == QLatin1String("startsWith") || op == QLatin1String("endsWith")) {
174 4 condition.matchType = QStringLiteral("matches");
175
2/2
✓ Branch 257 → 237 taken 4 times.
✓ Branch 257 → 258 taken 4 times.
8 for (const QString &value : values)
176
1/1
✓ Branch 249 → 250 taken 4 times.
8 condition.values.append(op == QLatin1String("startsWith")
177
3/7
✓ Branch 240 → 241 taken 4 times.
✗ Branch 240 → 245 not taken.
✓ Branch 243 → 244 taken 4 times.
✓ Branch 244 → 249 taken 4 times.
✗ Branch 248 → 249 not taken.
✗ Branch 466 → 467 not taken.
✗ Branch 466 → 468 not taken.
12 ? escapeWildcards(value) + QLatin1Char('*')
178
2/7
✗ Branch 245 → 246 not taken.
✗ Branch 251 → 252 not taken.
✓ Branch 251 → 253 taken 4 times.
✓ Branch 253 → 254 taken 4 times.
✗ Branch 253 → 255 not taken.
✗ Branch 462 → 463 not taken.
✗ Branch 462 → 464 not taken.
4 : QLatin1Char('*') + escapeWildcards(value));
179 } else {
180
2/4
✗ Branch 260 → 261 not taken.
✓ Branch 260 → 264 taken 470 times.
✗ Branch 267 → 268 not taken.
✓ Branch 267 → 269 taken 470 times.
470 condition.matchType = op.isEmpty() ? QStringLiteral("contains") : op;
181 470 condition.values = values;
182 }
183 474 return condition;
184 805 }
185
186 3314 QVariantMap fromAction(const Action &action) {
187 3314 QVariantMap fields;
188 3314 QString kind;
189
8/9
✓ Branch 2 → 3 taken 2962 times.
✓ Branch 2 → 65 taken 37 times.
✓ Branch 2 → 79 taken 203 times.
✓ Branch 2 → 145 taken 13 times.
✓ Branch 2 → 169 taken 37 times.
✓ Branch 2 → 176 taken 27 times.
✓ Branch 2 → 183 taken 10 times.
✓ Branch 2 → 190 taken 25 times.
✗ Branch 2 → 197 not taken.
3314 switch (action.kind) {
190 2962 case Action::Kind::FileInto:
191
2/2
✓ Branch 5 → 6 taken 8 times.
✓ Branch 5 → 13 taken 2954 times.
2962 if (action.specialUse.compare(QLatin1String("\\Junk"), Qt::CaseInsensitive) == 0)
192 8 kind = QStringLiteral("junk");
193
1/2
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 23 taken 2954 times.
2954 else if (action.specialUse.compare(QLatin1String("\\Trash"), Qt::CaseInsensitive) == 0)
194 ✗ kind = QStringLiteral("trash");
195 else
196
6/6
✓ Branch 23 → 24 taken 10 times.
✓ Branch 23 → 27 taken 2944 times.
✓ Branch 32 → 33 taken 2944 times.
✓ Branch 32 → 34 taken 10 times.
✓ Branch 34 → 35 taken 10 times.
✓ Branch 34 → 36 taken 2944 times.
5908 kind = action.copy ? QStringLiteral("copy") : QStringLiteral("move");
197
1/1
✓ Branch 41 → 42 taken 2962 times.
5924 fields.insert(QStringLiteral("create"), action.create);
198
1/1
✓ Branch 49 → 50 taken 2962 times.
5924 fields.insert(QStringLiteral("specialUse"), action.specialUse);
199
2/2
✓ Branch 54 → 55 taken 8 times.
✓ Branch 54 → 64 taken 2954 times.
2962 if (!action.specialUse.isEmpty())
200
1/1
✓ Branch 59 → 60 taken 8 times.
16 fields.insert(QStringLiteral("copy"), action.copy);
201 2962 break;
202 37 case Action::Kind::Redirect:
203
6/6
✓ Branch 65 → 66 taken 30 times.
✓ Branch 65 → 69 taken 7 times.
✓ Branch 74 → 75 taken 7 times.
✓ Branch 74 → 76 taken 30 times.
✓ Branch 76 → 77 taken 30 times.
✓ Branch 76 → 78 taken 7 times.
74 kind = action.copy ? QStringLiteral("forwardCopy") : QStringLiteral("forward");
204 37 break;
205 203 case Action::Kind::AddFlag:
206
5/7
✓ Branch 83 → 84 taken 203 times.
✓ Branch 86 → 87 taken 203 times.
✓ Branch 86 → 88 taken 203 times.
✓ Branch 89 → 90 taken 163 times.
✓ Branch 89 → 97 taken 40 times.
✗ Branch 254 → 255 not taken.
✗ Branch 254 → 256 not taken.
406 if (action.flags == QStringList{QStringLiteral("\\Seen")})
207 163 kind = QStringLiteral("read");
208
5/7
✓ Branch 101 → 102 taken 40 times.
✓ Branch 104 → 105 taken 40 times.
✓ Branch 104 → 106 taken 40 times.
✓ Branch 107 → 108 taken 19 times.
✓ Branch 107 → 115 taken 21 times.
✗ Branch 270 → 271 not taken.
✗ Branch 270 → 272 not taken.
80 else if (action.flags == QStringList{QStringLiteral("\\Flagged")})
209 19 kind = QStringLiteral("important");
210
4/5
✓ Branch 116 → 117 taken 4 times.
✓ Branch 116 → 128 taken 17 times.
✓ Branch 120 → 121 taken 4 times.
✓ Branch 121 → 122 taken 4 times.
✗ Branch 121 → 128 not taken.
25 else if (action.flags.size() == 1 && !action.flags.first().startsWith(QLatin1Char('\\')) &&
211
4/5
✓ Branch 125 → 126 taken 4 times.
✓ Branch 126 → 127 taken 4 times.
✗ Branch 126 → 128 not taken.
✓ Branch 129 → 130 taken 4 times.
✓ Branch 129 → 137 taken 17 times.
25 !action.flags.first().contains(QLatin1Char(' ')))
212 4 kind = QStringLiteral("label");
213 else
214 17 kind = QStringLiteral("addFlags");
215 203 break;
216 13 case Action::Kind::RemoveFlag:
217
4/7
✓ Branch 149 → 150 taken 13 times.
✓ Branch 150 → 151 taken 13 times.
✗ Branch 150 → 154 not taken.
✓ Branch 165 → 166 taken 13 times.
✓ Branch 165 → 167 taken 13 times.
✗ Branch 290 → 291 not taken.
✗ Branch 290 → 292 not taken.
65 kind = action.flags == QStringList{QStringLiteral("\\Seen")} ? QStringLiteral("unread")
218
2/4
✗ Branch 159 → 160 not taken.
✓ Branch 159 → 161 taken 13 times.
✓ Branch 161 → 162 taken 13 times.
✗ Branch 161 → 163 not taken.
26 : QStringLiteral("removeFlags");
219 13 break;
220 74 case Action::Kind::SetFlag: kind = QStringLiteral("setFlags"); break;
221 54 case Action::Kind::Keep: kind = QStringLiteral("keep"); break;
222 20 case Action::Kind::Discard: kind = QStringLiteral("discard"); break;
223 50 case Action::Kind::Reject: kind = QStringLiteral("reject"); break;
224 }
225
1/1
✓ Branch 201 → 202 taken 3314 times.
6628 fields.insert(QStringLiteral("kind"), kind);
226
1/1
✓ Branch 209 → 210 taken 3314 times.
6628 fields.insert(QStringLiteral("target"), action.target);
227
1/1
✓ Branch 217 → 218 taken 3314 times.
6628 fields.insert(QStringLiteral("flags"), action.flags);
228 3314 return fields;
229 3826 }
230
231 510 Action toAction(const QVariantMap &fields) {
232 510 Action action;
233
2/2
✓ Branch 6 → 7 taken 510 times.
✓ Branch 7 → 8 taken 510 times.
1020 const QString kind = fields.value(QStringLiteral("kind")).toString();
234
2/2
✓ Branch 16 → 17 taken 510 times.
✓ Branch 17 → 18 taken 510 times.
1020 action.target = fields.value(QStringLiteral("target")).toString();
235
2/2
✓ Branch 28 → 29 taken 510 times.
✓ Branch 29 → 30 taken 510 times.
1020 action.flags = fields.value(QStringLiteral("flags")).toStringList();
236
6/6
✓ Branch 38 → 39 taken 166 times.
✓ Branch 38 → 42 taken 344 times.
✓ Branch 41 → 42 taken 6 times.
✓ Branch 41 → 43 taken 160 times.
✓ Branch 44 → 45 taken 350 times.
✓ Branch 44 → 58 taken 160 times.
510 if (kind == QLatin1String("move") || kind == QLatin1String("copy")) {
237 350 action.kind = Action::Kind::FileInto;
238 350 action.copy = kind == QLatin1String("copy");
239
2/2
✓ Branch 51 → 52 taken 350 times.
✓ Branch 52 → 53 taken 350 times.
700 action.create = fields.value(QStringLiteral("create")).toBool();
240
6/6
✓ Branch 60 → 61 taken 151 times.
✓ Branch 60 → 64 taken 9 times.
✓ Branch 63 → 64 taken 1 time.
✓ Branch 63 → 65 taken 150 times.
✓ Branch 66 → 67 taken 10 times.
✓ Branch 66 → 118 taken 150 times.
160 } else if (kind == QLatin1String("junk") || kind == QLatin1String("trash")) {
241 10 action.kind = Action::Kind::FileInto;
242
2/2
✓ Branch 71 → 72 taken 10 times.
✓ Branch 72 → 73 taken 10 times.
20 action.specialUse = fields.value(QStringLiteral("specialUse")).toString();
243
2/2
✓ Branch 80 → 81 taken 7 times.
✓ Branch 80 → 97 taken 3 times.
10 if (action.specialUse.isEmpty())
244
6/6
✓ Branch 83 → 84 taken 6 times.
✓ Branch 83 → 87 taken 1 time.
✓ Branch 92 → 93 taken 1 time.
✓ Branch 92 → 94 taken 6 times.
✓ Branch 94 → 95 taken 6 times.
✓ Branch 94 → 96 taken 1 time.
14 action.specialUse = kind == QLatin1String("junk") ? QStringLiteral("\\Junk") : QStringLiteral("\\Trash");
245
2/2
✓ Branch 101 → 102 taken 10 times.
✓ Branch 102 → 103 taken 10 times.
20 action.copy = fields.value(QStringLiteral("copy")).toBool();
246
2/2
✓ Branch 111 → 112 taken 10 times.
✓ Branch 112 → 113 taken 10 times.
20 action.create = fields.value(QStringLiteral("create")).toBool();
247
6/6
✓ Branch 120 → 121 taken 140 times.
✓ Branch 120 → 124 taken 10 times.
✓ Branch 123 → 124 taken 23 times.
✓ Branch 123 → 125 taken 117 times.
✓ Branch 126 → 127 taken 33 times.
✓ Branch 126 → 130 taken 117 times.
150 } else if (kind == QLatin1String("forward") || kind == QLatin1String("forwardCopy")) {
248 33 action.kind = Action::Kind::Redirect;
249 33 action.copy = kind == QLatin1String("forwardCopy");
250
2/2
✓ Branch 132 → 133 taken 52 times.
✓ Branch 132 → 142 taken 65 times.
117 } else if (kind == QLatin1String("read")) {
251 52 action.kind = Action::Kind::AddFlag;
252
2/4
✓ Branch 138 → 139 taken 52 times.
✓ Branch 138 → 140 taken 52 times.
✗ Branch 308 → 309 not taken.
✗ Branch 308 → 310 not taken.
104 action.flags = {QStringLiteral("\\Seen")};
253
2/2
✓ Branch 144 → 145 taken 4 times.
✓ Branch 144 → 154 taken 61 times.
65 } else if (kind == QLatin1String("important")) {
254 4 action.kind = Action::Kind::AddFlag;
255
2/4
✓ Branch 150 → 151 taken 4 times.
✓ Branch 150 → 152 taken 4 times.
✗ Branch 321 → 322 not taken.
✗ Branch 321 → 323 not taken.
8 action.flags = {QStringLiteral("\\Flagged")};
256
2/2
✓ Branch 156 → 157 taken 5 times.
✓ Branch 156 → 166 taken 56 times.
61 } else if (kind == QLatin1String("unread")) {
257 5 action.kind = Action::Kind::RemoveFlag;
258
2/4
✓ Branch 162 → 163 taken 5 times.
✓ Branch 162 → 164 taken 5 times.
✗ Branch 334 → 335 not taken.
✗ Branch 334 → 336 not taken.
10 action.flags = {QStringLiteral("\\Seen")};
259
2/2
✓ Branch 168 → 169 taken 2 times.
✓ Branch 168 → 183 taken 54 times.
56 } else if (kind == QLatin1String("label")) {
260 2 action.kind = Action::Kind::AddFlag;
261
2/6
✗ Branch 170 → 171 not taken.
✓ Branch 170 → 174 taken 2 times.
✗ Branch 172 → 173 not taken.
✗ Branch 172 → 174 not taken.
✗ Branch 175 → 176 not taken.
✓ Branch 175 → 182 taken 2 times.
2 if (action.flags.isEmpty() && !action.target.isEmpty())
262 ✗ action.flags = {action.target};
263 2 action.target.clear();
264
2/2
✓ Branch 185 → 186 taken 6 times.
✓ Branch 185 → 187 taken 48 times.
54 } else if (kind == QLatin1String("addFlags")) {
265 6 action.kind = Action::Kind::AddFlag;
266
2/2
✓ Branch 189 → 190 taken 13 times.
✓ Branch 189 → 191 taken 35 times.
48 } else if (kind == QLatin1String("setFlags")) {
267 13 action.kind = Action::Kind::SetFlag;
268
1/2
✗ Branch 193 → 194 not taken.
✓ Branch 193 → 195 taken 35 times.
35 } else if (kind == QLatin1String("removeFlags")) {
269 ✗ action.kind = Action::Kind::RemoveFlag;
270
2/2
✓ Branch 197 → 198 taken 18 times.
✓ Branch 197 → 199 taken 17 times.
35 } else if (kind == QLatin1String("keep")) {
271 18 action.kind = Action::Kind::Keep;
272
2/2
✓ Branch 201 → 202 taken 7 times.
✓ Branch 201 → 203 taken 10 times.
17 } else if (kind == QLatin1String("discard")) {
273 7 action.kind = Action::Kind::Discard;
274
1/2
✓ Branch 205 → 206 taken 10 times.
✗ Branch 205 → 207 not taken.
10 } else if (kind == QLatin1String("reject")) {
275 10 action.kind = Action::Kind::Reject;
276 }
277
4/4
✓ Branch 207 → 208 taken 446 times.
✓ Branch 207 → 212 taken 64 times.
✓ Branch 208 → 209 taken 433 times.
✓ Branch 208 → 212 taken 13 times.
510 if (action.kind == Action::Kind::AddFlag || action.kind == Action::Kind::SetFlag ||
278
4/4
✓ Branch 209 → 210 taken 428 times.
✓ Branch 209 → 212 taken 5 times.
✓ Branch 210 → 211 taken 410 times.
✓ Branch 210 → 212 taken 18 times.
433 action.kind == Action::Kind::RemoveFlag || action.kind == Action::Kind::Keep ||
279
2/2
✓ Branch 211 → 212 taken 7 times.
✓ Branch 211 → 213 taken 403 times.
410 action.kind == Action::Kind::Discard)
280 107 action.target.clear();
281
4/4
✓ Branch 213 → 214 taken 446 times.
✓ Branch 213 → 217 taken 64 times.
✓ Branch 214 → 215 taken 433 times.
✓ Branch 214 → 217 taken 13 times.
510 if (action.kind != Action::Kind::AddFlag && action.kind != Action::Kind::SetFlag &&
282
2/2
✓ Branch 215 → 216 taken 428 times.
✓ Branch 215 → 217 taken 5 times.
433 action.kind != Action::Kind::RemoveFlag)
283
1/1
✓ Branch 216 → 217 taken 428 times.
428 action.flags.clear();
284 510 return action;
285 632 }
286
287 300 QVariantMap fromRule(const Sieve::Rule &rule) {
288 300 QVariantList conditions;
289
2/2
✓ Branch 12 → 4 taken 318 times.
✓ Branch 12 → 13 taken 300 times.
618 for (const Condition &condition : rule.conditions)
290
2/2
✓ Branch 5 → 6 taken 318 times.
✓ Branch 7 → 8 taken 318 times.
318 conditions.append(fromCondition(condition));
291 300 QVariantList actions;
292
2/2
✓ Branch 23 → 15 taken 346 times.
✓ Branch 23 → 24 taken 300 times.
646 for (const Action &action : rule.actions)
293
2/2
✓ Branch 16 → 17 taken 346 times.
✓ Branch 18 → 19 taken 346 times.
346 actions.append(fromAction(action));
294 600 return {{QStringLiteral("name"), rule.name},
295 600 {QStringLiteral("enabled"), rule.enabled},
296 600 {QStringLiteral("matchAll"), rule.matchAll},
297 600 {QStringLiteral("explicitList"), rule.explicitList},
298 600 {QStringLiteral("stop"), rule.stop},
299 600 {QStringLiteral("conditions"), conditions},
300
2/4
✓ Branch 54 → 55 taken 2100 times.
✓ Branch 54 → 56 taken 300 times.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
3000 {QStringLiteral("actions"), actions}};
301 2700 }
302
303 455 Sieve::Rule toRule(const QVariantMap &draft) {
304 455 Sieve::Rule rule;
305
3/3
✓ Branch 6 → 7 taken 455 times.
✓ Branch 7 → 8 taken 455 times.
✓ Branch 8 → 9 taken 455 times.
910 rule.name = draft.value(QStringLiteral("name")).toString().trimmed();
306
2/2
✓ Branch 20 → 21 taken 455 times.
✓ Branch 21 → 22 taken 455 times.
910 rule.enabled = draft.value(QStringLiteral("enabled"), true).toBool();
307
2/2
✓ Branch 30 → 31 taken 455 times.
✓ Branch 31 → 32 taken 455 times.
910 rule.matchAll = draft.value(QStringLiteral("matchAll"), true).toBool();
308
2/2
✓ Branch 40 → 41 taken 455 times.
✓ Branch 41 → 42 taken 455 times.
910 rule.explicitList = draft.value(QStringLiteral("explicitList")).toBool();
309
2/2
✓ Branch 50 → 51 taken 455 times.
✓ Branch 51 → 52 taken 455 times.
910 rule.stop = draft.value(QStringLiteral("stop")).toBool();
310
6/6
✓ Branch 60 → 61 taken 455 times.
✓ Branch 61 → 62 taken 455 times.
✓ Branch 66 → 67 taken 455 times.
✓ Branch 67 → 68 taken 455 times.
✓ Branch 77 → 69 taken 486 times.
✓ Branch 77 → 78 taken 455 times.
1396 for (const QVariant &entry : draft.value(QStringLiteral("conditions")).toList())
311
3/3
✓ Branch 70 → 71 taken 486 times.
✓ Branch 71 → 72 taken 486 times.
✓ Branch 72 → 73 taken 486 times.
941 rule.conditions.append(toCondition(entry.toMap()));
312
6/6
✓ Branch 83 → 84 taken 455 times.
✓ Branch 84 → 85 taken 455 times.
✓ Branch 89 → 90 taken 455 times.
✓ Branch 90 → 91 taken 455 times.
✓ Branch 100 → 92 taken 510 times.
✓ Branch 100 → 101 taken 455 times.
1420 for (const QVariant &entry : draft.value(QStringLiteral("actions")).toList())
313
3/3
✓ Branch 93 → 94 taken 510 times.
✓ Branch 94 → 95 taken 510 times.
✓ Branch 95 → 96 taken 510 times.
965 rule.actions.append(toAction(entry.toMap()));
314
2/2
✓ Branch 103 → 104 taken 94 times.
✓ Branch 103 → 105 taken 361 times.
455 if (rule.conditions.size() != 1)
315 94 rule.explicitList = false;
316 455 return rule;
317 ✗ }
318
319 } // namespace RuleEditorFields
320