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: 100.0% 48 / 0 / 48
Functions: 100.0% 4 / 0 / 4
Branches: 86.8% 99 / 0 / 114

app/MailtoUrl.cpp
Line Branch Exec Source
1 #include "MailtoUrl.h"
2
3 #include <QUrl>
4 #include <QUrlQuery>
5
6 39 static QString sanitizedHeaderValue(QString value) {
7 39 value.removeIf([](QChar ch) {
8
4/4
✓ Branch 3 → 4 taken 591 times.
✓ Branch 3 → 6 taken 8 times.
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 590 times.
599 return ch.unicode() < 0x20 || ch.unicode() == 0x7f;
9 });
10 39 return value.trimmed();
11 }
12
13 23 std::optional<MailtoRequest> MailtoRequest::parse(const QString &value) {
14
2/2
✓ Branch 2 → 3 taken 23 times.
✓ Branch 4 → 5 taken 23 times.
23 const QUrl url = QUrl::fromEncoded(value.toUtf8(), QUrl::StrictMode);
15
2/2
✓ Branch 13 → 14 taken 19 times.
✓ Branch 13 → 22 taken 3 times.
44 if (!url.isValid() ||
16
7/13
✓ Branch 8 → 9 taken 22 times.
✓ Branch 30 → 31 taken 22 times.
✓ Branch 30 → 32 taken 1 time.
✓ Branch 32 → 33 taken 22 times.
✓ Branch 32 → 34 taken 1 time.
✓ Branch 34 → 35 taken 5 times.
✓ Branch 34 → 36 taken 18 times.
✗ Branch 173 → 174 not taken.
✗ Branch 173 → 175 not taken.
✗ Branch 177 → 178 not taken.
✗ Branch 177 → 179 not taken.
✗ Branch 181 → 182 not taken.
✗ Branch 181 → 183 not taken.
67 url.scheme().compare(QStringLiteral("mailto"),
17 38 Qt::CaseInsensitive) != 0 ||
18
14/19
✓ Branch 6 → 7 taken 23 times.
✓ Branch 7 → 8 taken 22 times.
✓ Branch 7 → 22 taken 1 time.
✓ Branch 15 → 16 taken 19 times.
✓ Branch 17 → 18 taken 18 times.
✓ Branch 17 → 22 taken 1 time.
✓ Branch 19 → 20 taken 18 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 18 times.
✓ Branch 24 → 25 taken 18 times.
✓ Branch 24 → 26 taken 5 times.
✓ Branch 26 → 27 taken 19 times.
✓ Branch 26 → 28 taken 4 times.
✓ Branch 28 → 29 taken 22 times.
✓ Branch 28 → 30 taken 1 time.
✗ Branch 163 → 164 not taken.
✗ Branch 163 → 165 not taken.
✗ Branch 168 → 169 not taken.
✗ Branch 168 → 170 not taken.
63 !url.host().isEmpty() || !url.userInfo().isEmpty()) {
19 5 return std::nullopt;
20 }
21
22 18 MailtoRequest request;
23
2/2
✓ Branch 37 → 38 taken 18 times.
✓ Branch 38 → 39 taken 18 times.
18 request.to = sanitizedHeaderValue(url.path(QUrl::FullyDecoded));
24
25 18 bool hasSubject = false;
26 18 bool hasBody = false;
27 18 bool hasInReplyTo = false;
28 9 const auto appendRecipients = [](QString &field, const QString &value) {
29
1/1
✓ Branch 3 → 4 taken 9 times.
9 const QString recipient = sanitizedHeaderValue(value);
30
2/2
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 8 taken 8 times.
9 if (recipient.isEmpty()) return;
31
3/3
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 17 taken 5 times.
✓ Branch 13 → 14 taken 3 times.
11 if (!field.isEmpty()) field += QStringLiteral(", ");
32
1/1
✓ Branch 17 → 18 taken 8 times.
8 field += recipient;
33
2/2
✓ Branch 20 → 21 taken 8 times.
✓ Branch 20 → 23 taken 1 time.
9 };
34
1/1
✓ Branch 42 → 43 taken 18 times.
18 const QUrlQuery query(url);
35
5/5
✓ Branch 44 → 45 taken 18 times.
✓ Branch 45 → 46 taken 18 times.
✓ Branch 46 → 47 taken 18 times.
✓ Branch 151 → 48 taken 35 times.
✓ Branch 151 → 152 taken 18 times.
53 for (const auto &[key, value] : query.queryItems(QUrl::FullyDecoded)) {
36
2/2
✓ Branch 57 → 58 taken 4 times.
✓ Branch 57 → 59 taken 31 times.
35 if (key.compare(QStringLiteral("to"), Qt::CaseInsensitive) == 0) {
37
1/1
✓ Branch 58 → 149 taken 4 times.
4 appendRecipients(request.to, value);
38
2/2
✓ Branch 65 → 66 taken 3 times.
✓ Branch 65 → 67 taken 28 times.
31 } else if (key.compare(QStringLiteral("cc"), Qt::CaseInsensitive) == 0) {
39
1/1
✓ Branch 66 → 149 taken 3 times.
3 appendRecipients(request.cc, value);
40
2/2
✓ Branch 73 → 74 taken 2 times.
✓ Branch 73 → 75 taken 26 times.
28 } else if (key.compare(QStringLiteral("bcc"), Qt::CaseInsensitive) == 0) {
41
1/1
✓ Branch 74 → 149 taken 2 times.
2 appendRecipients(request.bcc, value);
42
4/4
✓ Branch 75 → 76 taken 25 times.
✓ Branch 75 → 82 taken 1 time.
✓ Branch 80 → 81 taken 2 times.
✓ Branch 80 → 82 taken 23 times.
51 } else if (!hasInReplyTo &&
43
6/6
✓ Branch 83 → 84 taken 25 times.
✓ Branch 83 → 85 taken 1 time.
✓ Branch 85 → 86 taken 25 times.
✓ Branch 85 → 87 taken 1 time.
✓ Branch 87 → 88 taken 2 times.
✓ Branch 87 → 115 taken 24 times.
51 key.compare(QStringLiteral("in-reply-to"), Qt::CaseInsensitive) == 0) {
44 // One message id in angle brackets; anything else is ignored.
45
1/1
✓ Branch 89 → 90 taken 2 times.
2 const QString id = sanitizedHeaderValue(value);
46
4/6
✓ Branch 95 → 96 taken 2 times.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 110 not taken.
✓ Branch 99 → 100 taken 2 times.
✓ Branch 100 → 101 taken 2 times.
✗ Branch 100 → 110 not taken.
4 if (id.size() <= 998 && id.startsWith(QLatin1Char('<')) && id.endsWith(QLatin1Char('>')) &&
47
8/10
✓ Branch 92 → 93 taken 2 times.
✗ Branch 92 → 110 not taken.
✓ Branch 103 → 104 taken 2 times.
✓ Branch 104 → 105 taken 1 time.
✓ Branch 104 → 110 taken 1 time.
✓ Branch 107 → 108 taken 1 time.
✓ Branch 108 → 109 taken 1 time.
✗ Branch 108 → 110 not taken.
✓ Branch 111 → 112 taken 1 time.
✓ Branch 111 → 113 taken 1 time.
4 id.count(QLatin1Char('<')) == 1 && !id.contains(QLatin1Char(' ')))
48 1 request.inReplyTo = id;
49 2 hasInReplyTo = true;
50
4/4
✓ Branch 115 → 116 taken 15 times.
✓ Branch 115 → 122 taken 9 times.
✓ Branch 120 → 121 taken 10 times.
✓ Branch 120 → 122 taken 5 times.
41 } else if (!hasSubject &&
51
6/6
✓ Branch 123 → 124 taken 15 times.
✓ Branch 123 → 125 taken 9 times.
✓ Branch 125 → 126 taken 15 times.
✓ Branch 125 → 127 taken 9 times.
✓ Branch 127 → 128 taken 10 times.
✓ Branch 127 → 134 taken 14 times.
39 key.compare(QStringLiteral("subject"),
52 Qt::CaseInsensitive) == 0) {
53
1/1
✓ Branch 129 → 130 taken 10 times.
10 request.subject = sanitizedHeaderValue(value);
54 10 hasSubject = true;
55
4/4
✓ Branch 134 → 135 taken 12 times.
✓ Branch 134 → 141 taken 2 times.
✓ Branch 139 → 140 taken 7 times.
✓ Branch 139 → 141 taken 5 times.
26 } else if (!hasBody &&
56
6/6
✓ Branch 142 → 143 taken 12 times.
✓ Branch 142 → 144 taken 2 times.
✓ Branch 144 → 145 taken 12 times.
✓ Branch 144 → 146 taken 2 times.
✓ Branch 146 → 147 taken 7 times.
✓ Branch 146 → 149 taken 7 times.
26 key.compare(QStringLiteral("body"),
57 Qt::CaseInsensitive) == 0) {
58 7 request.body = value;
59 7 hasBody = true;
60 }
61 18 }
62
63 18 return request;
64 23 }
65