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: 86.4% 51 / 0 / 59
Functions: 100.0% 10 / 0 / 10
Branches: 63.2% 74 / 0 / 117

presentation/MapTileStyles.cpp
Line Branch Exec Source
1 #include "MapTileStyles.h"
2
3 #include <QFile>
4 #include <QJsonArray>
5 #include <QJsonDocument>
6 #include <QJsonObject>
7 #include <QLoggingCategory>
8 #include <algorithm>
9
10 Q_DECLARE_LOGGING_CATEGORY(lcMapTiles)
11
12 namespace MapTileStyles {
13 namespace {
14
15 44 QJsonObject catalog() {
16
1/1
✓ Branch 5 → 6 taken 44 times.
44 QFile file(QStringLiteral(":/contacts/map-styles.json"));
17
2/3
✓ Branch 9 → 10 taken 44 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 13 taken 44 times.
44 if (!file.open(QIODevice::ReadOnly))
18 ✗ return {};
19
3/3
✓ Branch 13 → 14 taken 44 times.
✓ Branch 14 → 15 taken 44 times.
✓ Branch 15 → 16 taken 44 times.
44 return QJsonDocument::fromJson(file.readAll()).object();
20 44 }
21
22 } // namespace
23
24 1508 const QList<Provider> &providers() {
25 22 static const QList<Provider> catalogProviders = [] {
26 22 QList<Provider> loaded;
27
8/8
✓ Branch 2 → 3 taken 22 times.
✓ Branch 6 → 7 taken 22 times.
✓ Branch 7 → 8 taken 22 times.
✓ Branch 12 → 13 taken 22 times.
✓ Branch 13 → 14 taken 22 times.
✓ Branch 16 → 17 taken 110 times.
✓ Branch 50 → 15 taken 110 times.
✓ Branch 50 → 51 taken 22 times.
154 for (const QJsonValue &item : catalog().value(QStringLiteral("providers")).toArray()) {
28
1/1
✓ Branch 17 → 18 taken 110 times.
110 const QJsonObject object = item.toObject();
29
2/2
✓ Branch 21 → 22 taken 110 times.
✓ Branch 26 → 27 taken 110 times.
330 Provider provider{object.value(QStringLiteral("id")).toString(), object.value(QStringLiteral("name")).toString(),
30
4/8
✓ Branch 22 → 23 taken 110 times.
✓ Branch 27 → 28 taken 110 times.
✓ Branch 31 → 32 taken 110 times.
✓ Branch 32 → 33 taken 110 times.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 103 not taken.
330 object.value(QStringLiteral("keyUrl")).toString()};
31
1/2
✓ Branch 43 → 44 taken 110 times.
✗ Branch 43 → 45 not taken.
110 if (!provider.id.isEmpty())
32
1/1
✓ Branch 44 → 45 taken 110 times.
110 loaded.append(provider);
33 132 }
34
1/2
✗ Branch 53 → 54 not taken.
✓ Branch 53 → 65 taken 22 times.
22 if (loaded.isEmpty())
35 ✗ loaded.append(Provider{QStringLiteral("osm"), QStringLiteral("OpenStreetMap"), QString()});
36 22 return loaded;
37
4/7
✓ Branch 2 → 3 taken 22 times.
✓ Branch 2 → 9 taken 1486 times.
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 22 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
1508 }();
38 1508 return catalogProviders;
39 }
40
41 12 const Provider &providerById(const QString &id) {
42
2/3
✓ Branch 2 → 3 taken 12 times.
✓ Branch 11 → 5 taken 28 times.
✗ Branch 11 → 12 not taken.
28 for (const Provider &provider : providers())
43
2/2
✓ Branch 7 → 8 taken 12 times.
✓ Branch 7 → 9 taken 16 times.
28 if (provider.id == id)
44 12 return provider;
45 ✗ return providers().first();
46 }
47
48 3709 const QList<Style> &all() {
49 22 static const QList<Style> styles = [] {
50 22 QList<Style> loaded;
51
8/8
✓ Branch 2 → 3 taken 22 times.
✓ Branch 6 → 7 taken 22 times.
✓ Branch 7 → 8 taken 22 times.
✓ Branch 12 → 13 taken 22 times.
✓ Branch 13 → 14 taken 22 times.
✓ Branch 16 → 17 taken 638 times.
✓ Branch 105 → 15 taken 638 times.
✓ Branch 105 → 106 taken 22 times.
682 for (const QJsonValue &item : catalog().value(QStringLiteral("styles")).toArray()) {
52
1/1
✓ Branch 17 → 18 taken 638 times.
638 const QJsonObject object = item.toObject();
53 638 Style style;
54
2/2
✓ Branch 21 → 22 taken 638 times.
✓ Branch 22 → 23 taken 638 times.
638 style.id = object.value(QStringLiteral("id")).toString();
55
2/2
✓ Branch 31 → 32 taken 638 times.
✓ Branch 32 → 33 taken 638 times.
638 style.provider = object.value(QStringLiteral("provider")).toString();
56
2/2
✓ Branch 41 → 42 taken 638 times.
✓ Branch 42 → 43 taken 638 times.
638 style.name = object.value(QStringLiteral("name")).toString();
57
2/2
✓ Branch 51 → 52 taken 638 times.
✓ Branch 52 → 53 taken 638 times.
638 style.templateUrl = object.value(QStringLiteral("template")).toString();
58
2/2
✓ Branch 61 → 62 taken 638 times.
✓ Branch 62 → 63 taken 638 times.
638 style.attribution = object.value(QStringLiteral("attribution")).toString();
59
3/3
✓ Branch 71 → 72 taken 638 times.
✓ Branch 72 → 73 taken 638 times.
✓ Branch 73 → 74 taken 638 times.
1276 style.maxZoom = qBound(1, object.value(QStringLiteral("maxZoom")).toInt(19), 19);
60
3/3
✓ Branch 80 → 81 taken 638 times.
✓ Branch 81 → 82 taken 638 times.
✓ Branch 82 → 83 taken 638 times.
1276 style.parallel = qBound(1, object.value(QStringLiteral("parallel")).toInt(2), 4);
61 // A style of an unknown provider is left out: its key could not be asked for.
62
3/3
✓ Branch 86 → 87 taken 638 times.
✓ Branch 88 → 89 taken 638 times.
✓ Branch 90 → 91 taken 638 times.
638 const bool known = std::any_of(providers().cbegin(), providers().cend(),
63 1958 [&style](const Provider &provider) { return provider.id == style.provider; });
64
4/8
✓ Branch 92 → 93 taken 638 times.
✗ Branch 92 → 97 not taken.
✓ Branch 94 → 95 taken 638 times.
✗ Branch 94 → 97 not taken.
✓ Branch 95 → 96 taken 638 times.
✗ Branch 95 → 97 not taken.
✓ Branch 98 → 99 taken 638 times.
✗ Branch 98 → 100 not taken.
638 if (!style.id.isEmpty() && !style.templateUrl.isEmpty() && known)
65
1/1
✓ Branch 99 → 100 taken 638 times.
638 loaded.append(style);
66 660 }
67
1/2
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 141 taken 22 times.
22 if (loaded.isEmpty()) {
68 ✗ qCWarning(lcMapTiles) << "Map style catalog missing or empty; using OpenStreetMap";
69 ✗ loaded.append({QStringLiteral("osm"), providers().first().id, QStringLiteral("OpenStreetMap"),
70 ✗ QStringLiteral("https://tile.openstreetmap.org/{z}/{x}/{y}.png"),
71 ✗ QStringLiteral("© OpenStreetMap contributors"), 19, 2});
72 }
73 22 return loaded;
74
4/19
✓ Branch 2 → 3 taken 22 times.
✓ Branch 2 → 9 taken 3687 times.
✓ Branch 4 → 5 taken 22 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 22 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
✗ Branch 122 → 123 not taken.
✗ Branch 134 → 135 not taken.
✗ Branch 247 → 248 not taken.
✗ Branch 247 → 249 not taken.
✗ Branch 253 → 254 not taken.
✗ Branch 253 → 255 not taken.
✗ Branch 259 → 260 not taken.
✗ Branch 259 → 261 not taken.
✗ Branch 265 → 266 not taken.
✗ Branch 265 → 267 not taken.
✗ Branch 268 → 269 not taken.
✗ Branch 268 → 270 not taken.
3709 }();
75 3709 return styles;
76 }
77
78 1475 const Style &byId(const QString &id) {
79
2/3
✓ Branch 2 → 3 taken 1475 times.
✓ Branch 11 → 5 taken 3657 times.
✗ Branch 11 → 12 not taken.
3657 for (const Style &style : all())
80
2/2
✓ Branch 7 → 8 taken 1475 times.
✓ Branch 7 → 9 taken 2182 times.
3657 if (style.id == id)
81 1475 return style;
82 ✗ return all().first();
83 }
84
85 859 bool known(const QString &id) {
86 1968 return std::any_of(all().cbegin(), all().cend(), [&id](const Style &style) { return style.id == id; });
87 }
88
89 } // namespace MapTileStyles
90