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: 95.2% 60 / 0 / 63
Functions: 100.0% 4 / 0 / 4
Branches: 92.2% 71 / 0 / 77

data/RelationGraphFamilies.cpp
Line Branch Exec Source
1 #include "RelationGraphFamilies.h"
2
3 #include <QHash>
4 #include <algorithm>
5
6 namespace RelationGraph::Families {
7
8 103999 bool isMembership(const StoredEdge &e) {
9
4/4
✓ Branch 4 → 5 taken 101714 times.
✓ Branch 4 → 12 taken 2285 times.
✓ Branch 7 → 8 taken 101220 times.
✓ Branch 7 → 11 taken 494 times.
306933 return e.role == QLatin1String("relation") &&
10
2/2
✓ Branch 10 → 11 taken 11 times.
✓ Branch 10 → 12 taken 101209 times.
306933 (e.type == QLatin1String("member") || e.type == QLatin1String("member-of"));
11 }
12
13 // F103-10: family card → its members (from "member" lines on the family
14 // card and "member-of" lines on a member's card).
15 163 QHash<qint64, QList<qint64>> of(const Input &input) {
16 163 QHash<qint64, QList<qint64>> families;
17
2/2
✓ Branch 28 → 4 taken 70114 times.
✓ Branch 28 → 29 taken 163 times.
70277 for (const StoredEdge &e : input.edges) {
18
5/6
✓ Branch 6 → 7 taken 451 times.
✓ Branch 6 → 8 taken 69663 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 451 times.
✓ Branch 10 → 11 taken 69663 times.
✓ Branch 10 → 12 taken 451 times.
70114 if (!isMembership(e) || e.toCardId <= 0) // 0: a name that is no family stand-in
19 69663 continue;
20 451 const bool onFamily = e.type == QLatin1String("member");
21
2/2
✓ Branch 14 → 15 taken 443 times.
✓ Branch 14 → 16 taken 8 times.
451 const qint64 family = onFamily ? e.fromCardId : e.toCardId;
22
2/2
✓ Branch 17 → 18 taken 443 times.
✓ Branch 17 → 19 taken 8 times.
451 const qint64 member = onFamily ? e.toCardId : e.fromCardId;
23
2/3
✓ Branch 20 → 21 taken 451 times.
✓ Branch 22 → 23 taken 451 times.
✗ Branch 22 → 25 not taken.
451 if (!families[family].contains(member))
24
2/2
✓ Branch 23 → 24 taken 451 times.
✓ Branch 24 → 25 taken 451 times.
451 families[family].append(member);
25 }
26 163 return families;
27 ✗ }
28
29 48 void addNamedFamilies(Input *input) {
30 48 QHash<QString, qint64> ids;
31
4/4
✓ Branch 2 → 3 taken 48 times.
✓ Branch 3 → 4 taken 48 times.
✓ Branch 47 → 5 taken 1056 times.
✓ Branch 47 → 48 taken 48 times.
1104 for (StoredEdge &e : input->edges) {
32
7/8
✓ Branch 6 → 7 taken 22 times.
✓ Branch 6 → 13 taken 1034 times.
✓ Branch 9 → 10 taken 22 times.
✗ Branch 9 → 13 not taken.
✓ Branch 12 → 13 taken 20 times.
✓ Branch 12 → 14 taken 2 times.
✓ Branch 15 → 16 taken 1054 times.
✓ Branch 15 → 17 taken 2 times.
1056 if (e.toCardId != 0 || e.role != QLatin1String("relation") || e.type != QLatin1String("member-of"))
33 1054 continue;
34
1/1
✓ Branch 17 → 18 taken 2 times.
2 const QString name = e.toName.simplified();
35
1/2
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 2 times.
2 if (name.isEmpty())
36 ✗ continue;
37
1/1
✓ Branch 21 → 22 taken 2 times.
2 const QString folded = name.toCaseFolded();
38 2 qint64 id = ids.value(folded);
39
2/2
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 38 taken 1 time.
2 if (id == 0) {
40 1 id = NamedFamilyBase + ids.size();
41
1/1
✓ Branch 25 → 26 taken 1 time.
1 ids.insert(folded, id);
42 1 Person family;
43 1 family.cardId = id;
44
1/1
✓ Branch 29 → 30 taken 1 time.
1 family.key = QStringLiteral("family:") + folded;
45 1 family.name = name;
46
1/1
✓ Branch 35 → 36 taken 1 time.
1 input->people.append(family);
47 1 }
48 2 e.toCardId = id;
49 2 }
50 48 }
51
52 // The areas of `graph`: every family with at least one shown member.
53 163 void addAreas(const Input &input, const QHash<qint64, QList<qint64>> &families, qint64 centerCardId, Graph *graph) {
54 163 QHash<qint64, const Person *> people;
55
2/2
✓ Branch 8 → 4 taken 43482 times.
✓ Branch 8 → 9 taken 163 times.
43645 for (const Person &p : input.people)
56
1/1
✓ Branch 5 → 6 taken 43482 times.
43482 people.insert(p.cardId, &p);
57
1/1
✓ Branch 9 → 10 taken 163 times.
163 QList<qint64> ids = families.keys();
58
3/3
✓ Branch 10 → 11 taken 163 times.
✓ Branch 11 → 12 taken 163 times.
✓ Branch 12 → 13 taken 163 times.
163 std::sort(ids.begin(), ids.end());
59
2/2
✓ Branch 51 → 16 taken 159 times.
✓ Branch 51 → 52 taken 163 times.
322 for (qint64 family : std::as_const(ids)) {
60 159 const Person *card = people.value(family);
61
1/2
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 159 times.
159 if (!card)
62 ✗ continue;
63 159 Area area;
64 159 area.familyCardId = family;
65 159 area.key = card->key;
66 159 area.name = card->name;
67 // F103-13/F103-16: a family is its area. Only as the centre is its card a
68 // visible node inside the area; elsewhere (the overview) the node stays
69 // for the layout, hidden and not part of the outline.
70
3/3
✓ Branch 22 → 23 taken 159 times.
✓ Branch 23 → 24 taken 20 times.
✓ Branch 23 → 28 taken 139 times.
159 if (const int self = graph->indexOf(family); self >= 0) {
71
2/2
✓ Branch 24 → 25 taken 4 times.
✓ Branch 24 → 26 taken 16 times.
20 if (family == centerCardId)
72
1/1
✓ Branch 25 → 28 taken 4 times.
4 area.members.append(self);
73 else
74
1/1
✓ Branch 26 → 27 taken 16 times.
16 graph->nodes[self].family = true;
75 }
76
4/4
✓ Branch 29 → 30 taken 159 times.
✓ Branch 30 → 31 taken 159 times.
✓ Branch 38 → 32 taken 451 times.
✓ Branch 38 → 39 taken 159 times.
610 for (qint64 member : families.value(family))
77
3/3
✓ Branch 33 → 34 taken 451 times.
✓ Branch 34 → 35 taken 279 times.
✓ Branch 34 → 36 taken 172 times.
451 if (const int index = graph->indexOf(member); index >= 0)
78
1/1
✓ Branch 35 → 36 taken 279 times.
438 area.members.append(index);
79 // F103-33: one shown member is enough — a family of one is still a family.
80
2/2
✓ Branch 41 → 42 taken 4 times.
✓ Branch 41 → 43 taken 155 times.
159 const int shownMembers = int(area.members.size()) - (family == centerCardId ? 1 : 0);
81
3/4
✓ Branch 44 → 45 taken 34 times.
✓ Branch 44 → 46 taken 125 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 47 taken 34 times.
159 if (shownMembers >= 1 || family == centerCardId)
82
1/1
✓ Branch 46 → 47 taken 125 times.
125 graph->areas.append(area);
83 159 }
84 163 }
85
86 } // namespace RelationGraph::Families
87