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: 96.8% 152 / 0 / 157
Functions: 100.0% 12 / 0 / 12
Branches: 81.1% 270 / 0 / 333

data/RelationGraphRoutes.cpp
Line Branch Exec Source
1 #include "RelationGraphRoutes.h"
2
3 #include "RelationGraphRows.h"
4 #include "RelationVocabulary.h"
5
6 #include <QHash>
7 #include <QSet>
8 #include <cmath>
9 #include <numeric>
10 #include <vector>
11
12 namespace RelationGraphLayout {
13
14 namespace {
15
16
3/4
✓ Branch 2 → 3 taken 601496 times.
✓ Branch 2 → 5 taken 408 times.
✓ Branch 3 → 4 taken 601496 times.
✗ Branch 3 → 5 not taken.
601904 bool isDrawn(const RelationGraph::Node &node) { return !node.family && node.moreCount == 0; }
17
18 11840 bool isSibling(const RelationGraph::Edge &edge) {
19
6/6
✓ Branch 4 → 5 taken 2271 times.
✓ Branch 4 → 8 taken 9569 times.
✓ Branch 7 → 8 taken 1918 times.
✓ Branch 7 → 13 taken 353 times.
✓ Branch 11 → 12 taken 2146 times.
✓ Branch 11 → 13 taken 9341 times.
23327 return (edge.kind == QLatin1String("relation") || edge.kind == QLatin1String("inferred")) &&
20
3/5
✓ Branch 9 → 10 taken 11487 times.
✓ Branch 14 → 15 taken 11487 times.
✓ Branch 14 → 16 taken 353 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
23327 RelationVocabulary::canonical(edge.type) == QLatin1String("sibling");
21 }
22
23 7422 bool isStructural(const RelationGraph::Edge &edge) {
24
6/6
✓ Branch 3 → 4 taken 5538 times.
✓ Branch 3 → 8 taken 1884 times.
✓ Branch 5 → 6 taken 4660 times.
✓ Branch 5 → 8 taken 878 times.
✓ Branch 7 → 8 taken 1172 times.
✓ Branch 7 → 9 taken 3488 times.
7422 return isParentEdge(edge) || isPartnerEdge(edge) || isSibling(edge);
25 }
26
27 struct UnionFind {
28 std::vector<int> parent;
29
1/1
✓ Branch 4 → 5 taken 186 times.
558 explicit UnionFind(int n) : parent(size_t(n)) { std::iota(parent.begin(), parent.end(), 0); }
30 12088 int find(int i) {
31
2/2
✓ Branch 8 → 3 taken 9312 times.
✓ Branch 8 → 9 taken 12088 times.
21400 while (parent[size_t(i)] != i)
32 9312 i = parent[size_t(i)] = parent[size_t(parent[size_t(i)])];
33 12088 return i;
34 }
35 5494 void unite(int a, int b) { parent[size_t(find(a))] = find(b); }
36 };
37
38 38316 QPointF onCurve(QPointF a, QPointF control, QPointF b, double t) {
39 38316 return (1 - t) * (1 - t) * a + 2 * (1 - t) * t * control + t * t * b;
40 }
41
42 // The people (avatar and name below it) a line through `points` touches, ends excluded.
43 3008 int collisions(const RelationGraph::Graph &graph, const QList<QPointF> &positions, const QList<QPointF> &points,
44 int a, int b) {
45 3008 QSet<int> hit;
46 3008 double left = points.first().x(), right = left, top = points.first().y(), bottom = top;
47
2/2
✓ Branch 20 → 9 taken 39114 times.
✓ Branch 20 → 21 taken 3008 times.
42122 for (const QPointF &p : points) {
48 39114 left = std::min(left, p.x());
49 39114 right = std::max(right, p.x());
50 39114 top = std::min(top, p.y());
51 39114 bottom = std::max(bottom, p.y());
52 }
53
2/2
✓ Branch 78 → 22 taken 337671 times.
✓ Branch 78 → 79 taken 3008 times.
340679 for (int i = 0; i < graph.nodes.size(); ++i) {
54
1/1
✓ Branch 22 → 23 taken 337671 times.
337671 const QPointF centre = positions.value(i);
55
8/8
✓ Branch 24 → 25 taken 331655 times.
✓ Branch 24 → 36 taken 3008 times.
✓ Branch 27 → 28 taken 331307 times.
✓ Branch 27 → 36 taken 348 times.
✓ Branch 29 → 30 taken 233226 times.
✓ Branch 29 → 36 taken 98081 times.
✓ Branch 31 → 32 taken 113175 times.
✓ Branch 31 → 36 taken 120051 times.
334663 if (i == a || i == b || !isDrawn(graph.nodes.at(i)) || centre.x() < left - 50 || centre.x() > right + 50 ||
56
8/8
✓ Branch 23 → 24 taken 334663 times.
✓ Branch 23 → 36 taken 3008 times.
✓ Branch 33 → 34 taken 82141 times.
✓ Branch 33 → 36 taken 31034 times.
✓ Branch 35 → 36 taken 34675 times.
✓ Branch 35 → 37 taken 47466 times.
✓ Branch 38 → 39 taken 290205 times.
✓ Branch 38 → 40 taken 47466 times.
672334 centre.y() < top - 46 || centre.y() > bottom + 22)
57 290205 continue;
58
2/2
✓ Branch 74 → 41 taken 761828 times.
✓ Branch 74 → 75 taken 47466 times.
809294 for (int k = 0; k + 1 < points.size(); ++k) {
59 // Samples every 12 px along the segment.
60 761828 const QPointF from = points.at(k), to = points.at(k + 1);
61 761828 const int steps = std::max(1, int(std::hypot(to.x() - from.x(), to.y() - from.y()) / 12));
62
6/6
✓ Branch 66 → 67 taken 10156777 times.
✓ Branch 66 → 70 taken 719352 times.
✓ Branch 68 → 69 taken 10114301 times.
✓ Branch 68 → 70 taken 42476 times.
✓ Branch 71 → 49 taken 10114301 times.
✓ Branch 71 → 72 taken 761828 times.
10876129 for (int s = 0; s <= steps && !hit.contains(i); ++s) {
63 10114301 const QPointF d = from + (to - from) * (double(s) / steps) - centre;
64
8/8
✓ Branch 55 → 56 taken 535031 times.
✓ Branch 55 → 61 taken 9579270 times.
✓ Branch 57 → 58 taken 271790 times.
✓ Branch 57 → 61 taken 263241 times.
✓ Branch 59 → 60 taken 5130 times.
✓ Branch 59 → 61 taken 266660 times.
✓ Branch 62 → 63 taken 5130 times.
✓ Branch 62 → 65 taken 10109171 times.
10114301 if (std::abs(d.x()) < 50 && d.y() > -22 && d.y() < 46)
65
1/1
✓ Branch 63 → 64 taken 5130 times.
5130 hit.insert(i);
66 }
67 }
68 }
69 6016 return int(hit.size());
70 3008 }
71
72 2138 Route straightOrBent(const RelationGraph::Graph &graph, const QList<QPointF> &positions, int a, int b) {
73
2/2
✓ Branch 2 → 3 taken 2138 times.
✓ Branch 3 → 4 taken 2138 times.
2138 const QPointF pa = positions.value(a), pb = positions.value(b);
74
1/3
✓ Branch 7 → 8 taken 2138 times.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 54 not taken.
4276 Route best{QStringLiteral("line"), {pa, pb}};
75 // Large overviews keep straight lines (each bend costs a collision test).
76
2/2
✓ Branch 10 → 11 taken 872 times.
✓ Branch 10 → 12 taken 1266 times.
2138 if (graph.nodes.size() > 400)
77 872 return best;
78
1/1
✓ Branch 12 → 13 taken 1266 times.
1266 int bestHits = collisions(graph, positions, best.points, a, b);
79 1266 const QPointF d = pb - pa;
80 1266 const double length = std::hypot(d.x(), d.y());
81
3/4
✓ Branch 16 → 17 taken 584 times.
✓ Branch 16 → 18 taken 682 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 584 times.
1266 if (bestHits == 0 || length < 1)
82 682 return best;
83 584 const QPointF normal(-d.y() / length, d.x() / length);
84
2/2
✓ Branch 47 → 24 taken 1742 times.
✓ Branch 47 → 48 taken 318 times.
2060 for (const double bend : {0.25, -0.25, 0.5, -0.5}) {
85
1/3
✓ Branch 31 → 32 taken 1742 times.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 64 not taken.
3484 const Route curve{QStringLiteral("curve"), {pa, (pa + pb) / 2 + normal * (bend * length), pb}};
86
2/2
✓ Branch 33 → 34 taken 1742 times.
✓ Branch 34 → 35 taken 1742 times.
1742 const int hits = collisions(graph, positions, flatten(curve), a, b);
87
2/2
✓ Branch 36 → 37 taken 487 times.
✓ Branch 36 → 39 taken 1255 times.
1742 if (hits < bestHits) {
88 487 best = curve;
89 487 bestHits = hits;
90 }
91
2/2
✓ Branch 39 → 40 taken 266 times.
✓ Branch 39 → 41 taken 1476 times.
1742 if (bestHits == 0)
92 266 break;
93 1742 }
94 584 return best;
95 ✗ }
96
97 } // namespace
98
99 160 Route busRoute(QPointF from, QPointF to, double busY, double spineX) {
100
1/1
✓ Branch 7 → 8 taken 160 times.
160 QList<QPointF> points{from, {from.x(), busY}, {spineX, busY}, {spineX, to.y()}, to};
101 // Drop repeated corners (a person on the bus itself, a spine through the start).
102 160 QList<QPointF> simple;
103
4/4
✓ Branch 8 → 9 taken 160 times.
✓ Branch 9 → 10 taken 160 times.
✓ Branch 27 → 11 taken 800 times.
✓ Branch 27 → 28 taken 160 times.
960 for (const QPointF &p : points)
104
6/8
✓ Branch 13 → 14 taken 640 times.
✓ Branch 13 → 21 taken 160 times.
✓ Branch 15 → 16 taken 640 times.
✓ Branch 18 → 19 taken 640 times.
✓ Branch 20 → 21 taken 640 times.
✗ Branch 20 → 22 not taken.
✓ Branch 23 → 24 taken 800 times.
✗ Branch 23 → 25 not taken.
800 if (simple.isEmpty() || std::hypot(p.x() - simple.last().x(), p.y() - simple.last().y()) > 0.5)
105
1/1
✓ Branch 24 → 25 taken 800 times.
800 simple.append(p);
106
2/4
✓ Branch 38 → 39 taken 160 times.
✗ Branch 38 → 40 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 42 taken 160 times.
320 return {simple.size() == 2 ? QStringLiteral("line") : QStringLiteral("elbow"), simple};
107 480 }
108
109 8141 QList<QPointF> flatten(const Route &route) {
110
5/6
✓ Branch 4 → 5 taken 33 times.
✓ Branch 4 → 8 taken 8108 times.
✓ Branch 6 → 7 taken 33 times.
✗ Branch 6 → 8 not taken.
✓ Branch 9 → 10 taken 33 times.
✓ Branch 9 → 26 taken 8108 times.
8141 if (route.shape == QLatin1String("bundle") && route.points.size() == 6) {
111 33 const QList<QPointF> &p = route.points;
112 ✗ QList<QPointF> out; // the way into the trunk (0…10), then the way out (11…21)
113
2/2
✓ Branch 22 → 11 taken 726 times.
✓ Branch 22 → 23 taken 33 times.
759 for (int s = 0; s <= 21; ++s)
114
3/3
✓ Branch 11 → 12 taken 363 times.
✓ Branch 11 → 16 taken 363 times.
✓ Branch 20 → 21 taken 726 times.
726 out.append(s <= 10 ? onCurve(p.at(0), p.at(1), p.at(2), s / 10.0) : onCurve(p.at(3), p.at(4), p.at(5), (s - 11) / 10.0));
115
1/2
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 33 times.
33 return out;
116 ✗ }
117
5/6
✓ Branch 28 → 29 taken 1790 times.
✓ Branch 28 → 31 taken 6318 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 1790 times.
✓ Branch 33 → 34 taken 6318 times.
✓ Branch 33 → 36 taken 1790 times.
8108 if (route.shape != QLatin1String("curve") || route.points.size() != 3)
118 6318 return route.points;
119 1790 QList<QPointF> out;
120
2/2
✓ Branch 43 → 37 taken 37590 times.
✓ Branch 43 → 44 taken 1790 times.
39380 for (int s = 0; s <= 20; ++s)
121
1/1
✓ Branch 41 → 42 taken 37590 times.
37590 out.append(onCurve(route.points.at(0), route.points.at(1), route.points.at(2), s / 20.0));
122 1790 return out;
123 1790 }
124
125 93 QList<Route> routes(const RelationGraph::Graph &graph, const QList<QPointF> &positions) {
126 93 const int n = int(graph.nodes.size());
127 // Parents and partners as drawn: the parent is the one higher up.
128 93 QHash<int, QSet<int>> parentsOf, partnersOf;
129
2/2
✓ Branch 34 → 5 taken 4237 times.
✓ Branch 34 → 35 taken 93 times.
4330 for (const RelationGraph::Edge &e : graph.edges) {
130
3/6
✓ Branch 6 → 7 taken 4237 times.
✗ Branch 6 → 9 not taken.
✓ Branch 7 → 8 taken 4237 times.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 4237 times.
4237 if (e.from < 0 || e.to < 0 || e.from == e.to)
131 ✗ continue;
132
3/3
✓ Branch 10 → 11 taken 4237 times.
✓ Branch 11 → 12 taken 790 times.
✓ Branch 11 → 25 taken 3447 times.
4237 if (isParentEdge(e)) {
133
2/2
✓ Branch 12 → 13 taken 790 times.
✓ Branch 14 → 15 taken 790 times.
790 const bool fromAbove = positions.value(e.from).y() < positions.value(e.to).y();
134
6/6
✓ Branch 16 → 17 taken 38 times.
✓ Branch 16 → 18 taken 752 times.
✓ Branch 19 → 20 taken 790 times.
✓ Branch 20 → 21 taken 38 times.
✓ Branch 20 → 22 taken 752 times.
✓ Branch 23 → 24 taken 790 times.
790 parentsOf[fromAbove ? e.to : e.from].insert(fromAbove ? e.from : e.to);
135
3/3
✓ Branch 25 → 26 taken 3447 times.
✓ Branch 26 → 27 taken 439 times.
✓ Branch 26 → 32 taken 3008 times.
3447 } else if (isPartnerEdge(e)) {
136
2/2
✓ Branch 27 → 28 taken 439 times.
✓ Branch 28 → 29 taken 439 times.
439 partnersOf[e.from].insert(e.to);
137
2/2
✓ Branch 29 → 30 taken 439 times.
✓ Branch 30 → 31 taken 439 times.
439 partnersOf[e.to].insert(e.from);
138 }
139 }
140 // Who is connected by drawn lines without the relationships that only follow from others.
141
2/2
✓ Branch 35 → 36 taken 93 times.
✓ Branch 36 → 37 taken 93 times.
93 UnionFind connected(n), tree(n);
142
2/2
✓ Branch 65 → 39 taken 4237 times.
✓ Branch 65 → 66 taken 93 times.
4330 for (const RelationGraph::Edge &e : graph.edges) {
143
4/8
✓ Branch 40 → 41 taken 4237 times.
✗ Branch 40 → 44 not taken.
✓ Branch 41 → 42 taken 4237 times.
✗ Branch 41 → 44 not taken.
✓ Branch 42 → 43 taken 4237 times.
✗ Branch 42 → 44 not taken.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 4237 times.
4237 if (e.from < 0 || e.to < 0 || e.from >= n || e.to >= n)
144 ✗ continue;
145
4/4
✓ Branch 47 → 48 taken 4202 times.
✓ Branch 47 → 57 taken 35 times.
✓ Branch 50 → 51 taken 4195 times.
✓ Branch 50 → 57 taken 7 times.
8432 if (e.kind != QLatin1String("member") && e.kind != QLatin1String("suggestion") &&
146
7/7
✓ Branch 53 → 54 taken 668 times.
✓ Branch 53 → 56 taken 3527 times.
✓ Branch 54 → 55 taken 668 times.
✓ Branch 55 → 56 taken 185 times.
✓ Branch 55 → 57 taken 483 times.
✓ Branch 58 → 59 taken 3712 times.
✓ Branch 58 → 60 taken 525 times.
8432 (e.kind != QLatin1String("inferred") || isStructural(e)))
147 3712 connected.unite(e.from, e.to);
148
3/3
✓ Branch 60 → 61 taken 4237 times.
✓ Branch 61 → 62 taken 1782 times.
✓ Branch 61 → 63 taken 2455 times.
4237 if (isStructural(e)) // the family tree's own lines: parents, partners, siblings
149 1782 tree.unite(e.from, e.to);
150 }
151 93 QList<Route> out;
152
2/2
✓ Branch 295 → 68 taken 4237 times.
✓ Branch 295 → 296 taken 93 times.
4330 for (const RelationGraph::Edge &e : graph.edges) {
153 8474 const Route none{QStringLiteral("none"), {}};
154
6/10
✓ Branch 74 → 75 taken 4237 times.
✗ Branch 74 → 87 not taken.
✓ Branch 75 → 76 taken 4237 times.
✗ Branch 75 → 87 not taken.
✓ Branch 76 → 77 taken 4237 times.
✗ Branch 76 → 87 not taken.
✓ Branch 77 → 78 taken 4237 times.
✗ Branch 77 → 87 not taken.
✓ Branch 80 → 81 taken 4202 times.
✓ Branch 80 → 87 taken 35 times.
4237 if (e.from < 0 || e.to < 0 || e.from >= n || e.to >= n || e.from == e.to || e.kind == QLatin1String("member") ||
155
5/8
✓ Branch 73 → 74 taken 4237 times.
✗ Branch 73 → 87 not taken.
✓ Branch 83 → 84 taken 4202 times.
✗ Branch 83 → 87 not taken.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 88 taken 4202 times.
✓ Branch 89 → 90 taken 35 times.
✓ Branch 89 → 92 taken 4202 times.
8474 !isDrawn(graph.nodes.at(e.from)) || !isDrawn(graph.nodes.at(e.to))) {
156
1/1
✓ Branch 90 → 91 taken 35 times.
35 out.append(none);
157 35 continue;
158 }
159
8/9
✓ Branch 94 → 95 taken 668 times.
✓ Branch 94 → 101 taken 3534 times.
✓ Branch 95 → 96 taken 668 times.
✓ Branch 96 → 97 taken 483 times.
✓ Branch 96 → 101 taken 185 times.
✓ Branch 99 → 100 taken 483 times.
✗ Branch 99 → 101 not taken.
✓ Branch 102 → 103 taken 483 times.
✓ Branch 102 → 105 taken 3719 times.
4202 if (e.kind == QLatin1String("inferred") && !isStructural(e) && connected.find(e.from) == connected.find(e.to)) {
160
1/1
✓ Branch 103 → 104 taken 483 times.
483 out.append(none);
161 483 continue;
162 }
163 // Wider family (aunt, in-law, cousin, grandparent, …), stored or inferred: the tree
164 // already joins the two, so the line would only cross it; the person's
165 // role, the tooltip and the list still say it.
166
4/5
✓ Branch 108 → 109 taken 1849 times.
✓ Branch 109 → 110 taken 67 times.
✓ Branch 109 → 120 taken 1782 times.
✗ Branch 112 → 113 not taken.
✓ Branch 112 → 116 taken 67 times.
5635 if (e.category == QLatin1String("family") && !isStructural(e) &&
167
6/8
✓ Branch 107 → 108 taken 1849 times.
✓ Branch 107 → 120 taken 1870 times.
✗ Branch 115 → 116 not taken.
✗ Branch 115 → 120 not taken.
✓ Branch 118 → 119 taken 63 times.
✓ Branch 118 → 120 taken 4 times.
✓ Branch 121 → 122 taken 63 times.
✓ Branch 121 → 124 taken 3656 times.
5635 (e.kind == QLatin1String("relation") || e.kind == QLatin1String("inferred")) &&
168 67 tree.find(e.from) == tree.find(e.to)) {
169
1/1
✓ Branch 122 → 123 taken 63 times.
63 out.append(none);
170 63 continue;
171 }
172
12/16
✓ Branch 124 → 125 taken 3656 times.
✓ Branch 125 → 126 taken 553 times.
✓ Branch 125 → 131 taken 3103 times.
✓ Branch 128 → 129 taken 553 times.
✓ Branch 129 → 130 taken 132 times.
✓ Branch 129 → 131 taken 421 times.
✓ Branch 132 → 133 taken 553 times.
✓ Branch 132 → 134 taken 3103 times.
✓ Branch 134 → 135 taken 553 times.
✓ Branch 134 → 136 taken 3103 times.
✓ Branch 136 → 137 taken 132 times.
✓ Branch 136 → 139 taken 3524 times.
✗ Branch 316 → 317 not taken.
✗ Branch 316 → 318 not taken.
✗ Branch 320 → 321 not taken.
✗ Branch 320 → 322 not taken.
3656 if (isSibling(e) && parentsOf.value(e.from).intersects(parentsOf.value(e.to))) {
173
1/1
✓ Branch 137 → 138 taken 132 times.
132 out.append(none); // the tree shows them as children of one parent
174 132 continue;
175 }
176
2/2
✓ Branch 139 → 140 taken 3524 times.
✓ Branch 140 → 141 taken 3524 times.
3524 const QPointF pa = positions.value(e.from), pb = positions.value(e.to);
177
7/7
✓ Branch 141 → 142 taken 3524 times.
✓ Branch 142 → 143 taken 421 times.
✓ Branch 142 → 148 taken 3103 times.
✓ Branch 146 → 147 taken 404 times.
✓ Branch 146 → 148 taken 17 times.
✓ Branch 149 → 150 taken 404 times.
✓ Branch 149 → 163 taken 3120 times.
3524 if (isSibling(e) && std::abs(pa.y() - pb.y()) < 1) {
178 // Siblings without a shown parent hang from one bar above the row, as
179 // children hang from their parents' line; it passes above the avatars
180 // in between and never through a name.
181 404 const double barY = pa.y() - SiblingBarHeight;
182 404 out.append({QStringLiteral("elbow"), {pa, {pa.x(), barY}, {pb.x(), barY}, pb}});
183 404 continue;
184 404 }
185
7/7
✓ Branch 163 → 164 taken 3120 times.
✓ Branch 164 → 165 taken 790 times.
✓ Branch 164 → 171 taken 2330 times.
✓ Branch 169 → 170 taken 777 times.
✓ Branch 169 → 171 taken 13 times.
✓ Branch 172 → 173 taken 777 times.
✓ Branch 172 → 236 taken 2343 times.
3120 if (isParentEdge(e) && std::abs(std::abs(pa.y() - pb.y()) - TreeRowHeight) < 1) {
186
2/2
✓ Branch 175 → 176 taken 34 times.
✓ Branch 175 → 177 taken 743 times.
777 const int parent = pa.y() < pb.y() ? e.from : e.to;
187
2/2
✓ Branch 178 → 179 taken 34 times.
✓ Branch 178 → 180 taken 743 times.
777 const int child = parent == e.from ? e.to : e.from;
188
1/1
✓ Branch 181 → 182 taken 777 times.
777 QPointF start = positions.value(parent);
189
4/4
✓ Branch 183 → 184 taken 777 times.
✓ Branch 184 → 185 taken 777 times.
✓ Branch 206 → 186 taken 448 times.
✓ Branch 206 → 207 taken 491 times.
939 for (int partner : partnersOf.value(parent)) // a couple's children hang from the partner line
190
7/11
✓ Branch 189 → 190 taken 286 times.
✓ Branch 189 → 196 taken 162 times.
✓ Branch 190 → 191 taken 286 times.
✓ Branch 194 → 195 taken 286 times.
✗ Branch 194 → 196 not taken.
✓ Branch 197 → 198 taken 448 times.
✗ Branch 197 → 199 not taken.
✓ Branch 199 → 200 taken 286 times.
✓ Branch 199 → 204 taken 162 times.
✗ Branch 338 → 339 not taken.
✗ Branch 338 → 340 not taken.
448 if (parentsOf.value(child).contains(partner) && std::abs(positions.value(partner).y() - start.y()) < 1) {
191
1/1
✓ Branch 200 → 201 taken 286 times.
286 start = (start + positions.value(partner)) / 2;
192 286 break;
193 777 }
194
1/1
✓ Branch 208 → 209 taken 777 times.
777 const QPointF end = positions.value(child);
195 777 const double busY = end.y() - DescentBarHeight;
196
1/1
✓ Branch 228 → 229 taken 777 times.
1554 out.append(std::abs(start.x() - end.x()) < 0.5
197
3/13
✓ Branch 213 → 214 taken 318 times.
✓ Branch 213 → 219 taken 459 times.
✓ Branch 217 → 218 taken 318 times.
✗ Branch 362 → 363 not taken.
✗ Branch 362 → 365 not taken.
✗ Branch 363 → 364 not taken.
✗ Branch 363 → 365 not taken.
✗ Branch 367 → 368 not taken.
✗ Branch 367 → 370 not taken.
✗ Branch 368 → 369 not taken.
✗ Branch 368 → 370 not taken.
✗ Branch 371 → 372 not taken.
✗ Branch 371 → 373 not taken.
2190 ? Route{QStringLiteral("line"), {start, end}}
198
5/15
✓ Branch 226 → 227 taken 459 times.
✓ Branch 230 → 231 taken 459 times.
✓ Branch 230 → 232 taken 318 times.
✓ Branch 232 → 233 taken 318 times.
✓ Branch 232 → 234 taken 459 times.
✗ Branch 349 → 350 not taken.
✗ Branch 349 → 352 not taken.
✗ Branch 350 → 351 not taken.
✗ Branch 350 → 352 not taken.
✗ Branch 354 → 355 not taken.
✗ Branch 354 → 357 not taken.
✗ Branch 355 → 356 not taken.
✗ Branch 355 → 357 not taken.
✗ Branch 358 → 359 not taken.
✗ Branch 358 → 360 not taken.
1695 : Route{QStringLiteral("elbow"), {start, {start.x(), busY}, {end.x(), busY}, end}});
199 777 continue;
200 777 }
201
2/2
✓ Branch 239 → 240 taken 750 times.
✓ Branch 239 → 284 taken 1593 times.
2343 if (std::abs(pa.y() - pb.y()) < 1) {
202 // Same row: an arc over anyone standing between the two.
203 750 bool between = false;
204
4/4
✓ Branch 266 → 267 taken 263318 times.
✓ Branch 266 → 268 taken 545 times.
✓ Branch 267 → 241 taken 263113 times.
✓ Branch 267 → 268 taken 205 times.
263863 for (int i = 0; i < n && !between; ++i)
205
6/6
✓ Branch 242 → 243 taken 261845 times.
✓ Branch 242 → 264 taken 662 times.
✓ Branch 245 → 246 taken 261785 times.
✓ Branch 245 → 264 taken 60 times.
✓ Branch 250 → 251 taken 7484 times.
✓ Branch 250 → 264 taken 254301 times.
524292 between = i != e.from && i != e.to && isDrawn(graph.nodes.at(i)) &&
206
1/1
✓ Branch 246 → 247 taken 261785 times.
261785 std::abs(positions.value(i).y() - pa.y()) < 1 &&
207
8/8
✓ Branch 241 → 242 taken 262507 times.
✓ Branch 241 → 264 taken 606 times.
✓ Branch 251 → 252 taken 7484 times.
✓ Branch 256 → 257 taken 3903 times.
✓ Branch 256 → 264 taken 3581 times.
✓ Branch 257 → 258 taken 3903 times.
✓ Branch 262 → 263 taken 205 times.
✓ Branch 262 → 264 taken 3698 times.
525620 positions.value(i).x() > std::min(pa.x(), pb.x()) && positions.value(i).x() < std::max(pa.x(), pb.x());
208
2/2
✓ Branch 268 → 269 taken 205 times.
✓ Branch 268 → 284 taken 545 times.
750 if (between) {
209 205 const double lift = 44 + 0.12 * std::abs(pb.x() - pa.x());
210 410 out.append({QStringLiteral("curve"), {pa, QPointF((pa.x() + pb.x()) / 2, pa.y() - 2 * lift), pb}});
211 205 continue;
212 205 }
213 }
214
2/2
✓ Branch 284 → 285 taken 2138 times.
✓ Branch 285 → 286 taken 2138 times.
2138 out.append(straightOrBent(graph, positions, e.from, e.to));
215 4237 }
216 93 return out;
217 2125 }
218
219 } // namespace RelationGraphLayout
220