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: 99.2% 126 / 0 / 127
Functions: 100.0% 11 / 0 / 11
Branches: 96.5% 138 / 0 / 143

presentation/ConflictItemModel.cpp
Line Branch Exec Source
1 #include "ConflictItemModel.h"
2
3 #include <QCoreApplication>
4 #include <QVariantMap>
5
6 833 ConflictItemModel::ConflictItemModel(QObject *parent) : QAbstractListModel(parent) {}
7
8
2/2
✓ Branch 3 → 4 taken 4 times.
✓ Branch 3 → 5 taken 9591 times.
9595 int ConflictItemModel::rowCount(const QModelIndex &parent) const { return parent.isValid() ? 0 : int(m_rows.size()); }
9
10 // One insert per line: gcov attributes a braced initializer list to its
11 // last line, so the list form never shows as executed.
12 62 QHash<int, QByteArray> ConflictItemModel::roleNames() const {
13 62 QHash<int, QByteArray> names;
14
2/2
✓ Branch 2 → 3 taken 62 times.
✓ Branch 3 → 4 taken 62 times.
62 names.insert(IdRole, "rowId");
15
2/2
✓ Branch 5 → 6 taken 62 times.
✓ Branch 6 → 7 taken 62 times.
62 names.insert(KindRole, "kind");
16
2/2
✓ Branch 8 → 9 taken 62 times.
✓ Branch 9 → 10 taken 62 times.
62 names.insert(LabelRole, "label");
17
2/2
✓ Branch 11 → 12 taken 62 times.
✓ Branch 12 → 13 taken 62 times.
62 names.insert(SectionRole, "section");
18
2/2
✓ Branch 14 → 15 taken 62 times.
✓ Branch 15 → 16 taken 62 times.
62 names.insert(ConflictRole, "conflict");
19
2/2
✓ Branch 17 → 18 taken 62 times.
✓ Branch 18 → 19 taken 62 times.
62 names.insert(StateRole, "rowState");
20
2/2
✓ Branch 20 → 21 taken 62 times.
✓ Branch 21 → 22 taken 62 times.
62 names.insert(ChoiceRole, "choice");
21
2/2
✓ Branch 23 → 24 taken 62 times.
✓ Branch 24 → 25 taken 62 times.
62 names.insert(LocalTextRole, "localText");
22
2/2
✓ Branch 26 → 27 taken 62 times.
✓ Branch 27 → 28 taken 62 times.
62 names.insert(ServerTextRole, "serverText");
23
2/2
✓ Branch 29 → 30 taken 62 times.
✓ Branch 30 → 31 taken 62 times.
62 names.insert(BaseTextRole, "baseText");
24
2/2
✓ Branch 32 → 33 taken 62 times.
✓ Branch 33 → 34 taken 62 times.
62 names.insert(ResultTextRole, "resultText");
25
2/2
✓ Branch 35 → 36 taken 62 times.
✓ Branch 36 → 37 taken 62 times.
62 names.insert(LocalPresentRole, "localPresent");
26
2/2
✓ Branch 38 → 39 taken 62 times.
✓ Branch 39 → 40 taken 62 times.
62 names.insert(ServerPresentRole, "serverPresent");
27
2/2
✓ Branch 41 → 42 taken 62 times.
✓ Branch 42 → 43 taken 62 times.
62 names.insert(BasePresentRole, "basePresent");
28
2/2
✓ Branch 44 → 45 taken 62 times.
✓ Branch 45 → 46 taken 62 times.
62 names.insert(ResultPresentRole, "resultPresent");
29
2/2
✓ Branch 47 → 48 taken 62 times.
✓ Branch 48 → 49 taken 62 times.
62 names.insert(GroupRole, "group");
30
2/2
✓ Branch 50 → 51 taken 62 times.
✓ Branch 51 → 52 taken 62 times.
62 names.insert(SeparableRole, "separable");
31
2/2
✓ Branch 53 → 54 taken 62 times.
✓ Branch 54 → 55 taken 62 times.
62 names.insert(ValuesRole, "values");
32
2/2
✓ Branch 56 → 57 taken 62 times.
✓ Branch 57 → 58 taken 62 times.
62 names.insert(HunksRole, "hunks");
33
2/2
✓ Branch 59 → 60 taken 62 times.
✓ Branch 60 → 61 taken 62 times.
62 names.insert(SummaryRole, "summary");
34
2/2
✓ Branch 62 → 63 taken 62 times.
✓ Branch 63 → 64 taken 62 times.
62 names.insert(OverlappingRole, "overlapping");
35
2/2
✓ Branch 65 → 66 taken 62 times.
✓ Branch 66 → 67 taken 62 times.
62 names.insert(LocalSourceRole, "localSource");
36
2/2
✓ Branch 68 → 69 taken 62 times.
✓ Branch 69 → 70 taken 62 times.
62 names.insert(ServerSourceRole, "serverSource");
37
2/2
✓ Branch 71 → 72 taken 62 times.
✓ Branch 72 → 73 taken 62 times.
62 names.insert(BaseSourceRole, "baseSource");
38
2/2
✓ Branch 74 → 75 taken 62 times.
✓ Branch 75 → 76 taken 62 times.
62 names.insert(InvalidRole, "invalid");
39
2/2
✓ Branch 77 → 78 taken 62 times.
✓ Branch 78 → 79 taken 62 times.
62 names.insert(ChangedAgainRole, "changedAgain");
40
2/2
✓ Branch 80 → 81 taken 62 times.
✓ Branch 81 → 82 taken 62 times.
62 names.insert(AccessibleNameRole, "accessibleName");
41 62 return names;
42 ✗ }
43
44 186 QString ConflictItemModel::accessibleName(const ConflictRows::Row &row) {
45 186 const auto translate = [](const char *text) { return QCoreApplication::translate("ConflictItemModel", text); };
46 186 QString chosen;
47
2/2
✓ Branch 4 → 5 taken 45 times.
✓ Branch 4 → 9 taken 141 times.
186 if (row.choice == QLatin1String("local"))
48
1/1
✓ Branch 5 → 6 taken 45 times.
45 chosen = translate("chosen: on this computer");
49
2/2
✓ Branch 11 → 12 taken 77 times.
✓ Branch 11 → 16 taken 64 times.
141 else if (row.choice == QLatin1String("server"))
50
1/1
✓ Branch 12 → 13 taken 77 times.
77 chosen = translate("chosen: on the server");
51
2/2
✓ Branch 18 → 19 taken 55 times.
✓ Branch 18 → 23 taken 9 times.
64 else if (row.state == QLatin1String("open"))
52
1/1
✓ Branch 19 → 20 taken 55 times.
55 chosen = translate("open conflict");
53 else
54
1/1
✓ Branch 23 → 24 taken 9 times.
9 chosen = translate("combined");
55
1/1
✓ Branch 27 → 28 taken 186 times.
372 return QCoreApplication::translate("ConflictItemModel", "%1: on this computer %2, on the server %3, %4")
56
1/1
✓ Branch 28 → 29 taken 186 times.
372 .arg(row.label, row.localText, row.serverText, chosen);
57 186 }
58
59 7621 QVariant ConflictItemModel::data(const QModelIndex &index, int role) const {
60
6/8
✓ Branch 3 → 4 taken 7619 times.
✓ Branch 3 → 9 taken 2 times.
✓ Branch 5 → 6 taken 7619 times.
✗ Branch 5 → 9 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 7619 times.
✓ Branch 11 → 12 taken 2 times.
✓ Branch 11 → 13 taken 7619 times.
7621 if (!index.isValid() || index.row() < 0 || index.row() >= m_rows.size())
61 2 return {};
62 7619 return valueOf(m_rows.at(index.row()), role);
63 }
64
65 1 QVariantMap ConflictItemModel::empty() const {
66 1 QVariantMap map;
67
1/1
✓ Branch 2 → 3 taken 1 time.
1 const QHash<int, QByteArray> names = roleNames();
68
2/2
✓ Branch 15 → 4 taken 27 times.
✓ Branch 15 → 16 taken 1 time.
28 for (auto it = names.begin(); it != names.end(); ++it)
69
3/3
✓ Branch 5 → 6 taken 27 times.
✓ Branch 7 → 8 taken 27 times.
✓ Branch 8 → 9 taken 27 times.
27 map.insert(QString::fromLatin1(it.value()), valueOf(ConflictRows::Row{}, it.key()));
70 1 return map;
71 1 }
72
73 7646 QVariant ConflictItemModel::valueOf(const ConflictRows::Row &row, int role) {
74
28/28
✓ Branch 2 → 3 taken 880 times.
✓ Branch 2 → 4 taken 741 times.
✓ Branch 2 → 5 taken 205 times.
✓ Branch 2 → 6 taken 583 times.
✓ Branch 2 → 7 taken 43 times.
✓ Branch 2 → 8 taken 1085 times.
✓ Branch 2 → 9 taken 846 times.
✓ Branch 2 → 10 taken 183 times.
✓ Branch 2 → 11 taken 183 times.
✓ Branch 2 → 12 taken 183 times.
✓ Branch 2 → 13 taken 156 times.
✓ Branch 2 → 14 taken 183 times.
✓ Branch 2 → 15 taken 183 times.
✓ Branch 2 → 16 taken 183 times.
✓ Branch 2 → 17 taken 153 times.
✓ Branch 2 → 18 taken 164 times.
✓ Branch 2 → 19 taken 170 times.
✓ Branch 2 → 20 taken 13 times.
✓ Branch 2 → 79 taken 186 times.
✓ Branch 2 → 80 taken 20 times.
✓ Branch 2 → 81 taken 25 times.
✓ Branch 2 → 82 taken 186 times.
✓ Branch 2 → 83 taken 186 times.
✓ Branch 2 → 84 taken 109 times.
✓ Branch 2 → 85 taken 186 times.
✓ Branch 2 → 86 taken 399 times.
✓ Branch 2 → 87 taken 186 times.
✓ Branch 2 → 91 taken 26 times.
7646 switch (role) {
75 880 case IdRole: return row.id;
76 741 case KindRole: return row.kind;
77 205 case LabelRole: return row.label;
78 583 case SectionRole: return row.section;
79 43 case ConflictRole: return row.conflict;
80 1085 case StateRole: return row.state;
81 846 case ChoiceRole: return row.choice;
82 183 case LocalTextRole: return row.localText;
83 183 case ServerTextRole: return row.serverText;
84 183 case BaseTextRole: return row.baseText;
85 156 case ResultTextRole: return row.resultText;
86 183 case LocalPresentRole: return row.localPresent;
87 183 case ServerPresentRole: return row.serverPresent;
88 183 case BasePresentRole: return row.basePresent;
89 153 case ResultPresentRole: return row.resultPresent;
90 164 case GroupRole: return row.group;
91 170 case SeparableRole: return row.separable;
92 13 case ValuesRole: {
93 13 QVariantList values;
94
2/2
✓ Branch 75 → 22 taken 12 times.
✓ Branch 75 → 76 taken 13 times.
25 for (const ConflictRows::Value &value : row.values)
95
1/1
✓ Branch 53 → 54 taken 12 times.
36 values.append(QVariantMap{{QStringLiteral("id"), value.id},
96 24 {QStringLiteral("text"), value.text},
97 24 {QStringLiteral("local"), value.local},
98 24 {QStringLiteral("server"), value.server},
99 24 {QStringLiteral("base"), value.base},
100 24 {QStringLiteral("included"), value.included},
101
2/4
✓ Branch 57 → 58 taken 84 times.
✓ Branch 57 → 59 taken 12 times.
✗ Branch 98 → 99 not taken.
✗ Branch 98 → 100 not taken.
120 {QStringLiteral("state"), value.state}});
102 13 return values;
103 13 }
104 186 case HunksRole: return row.hunks;
105 20 case SummaryRole: return row.summary;
106 25 case OverlappingRole: return row.overlapping;
107 186 case LocalSourceRole: return row.localSource;
108 186 case ServerSourceRole: return row.serverSource;
109 109 case BaseSourceRole: return row.baseSource;
110 186 case InvalidRole: return row.invalid;
111 399 case ChangedAgainRole: return row.changedAgain;
112
1/1
✓ Branch 87 → 88 taken 186 times.
186 case AccessibleNameRole: return accessibleName(row);
113 26 default: return {};
114 }
115 96 }
116
117 552 void ConflictItemModel::setRows(const QList<ConflictRows::Row> &rows) {
118 552 bool sameIds = rows.size() == m_rows.size();
119
6/6
✓ Branch 9 → 10 taken 1041 times.
✓ Branch 9 → 13 taken 153 times.
✓ Branch 11 → 12 taken 642 times.
✓ Branch 11 → 13 taken 399 times.
✓ Branch 14 → 5 taken 642 times.
✓ Branch 14 → 15 taken 552 times.
1194 for (int i = 0; sameIds && i < rows.size(); ++i)
120 642 sameIds = rows.at(i).id == m_rows.at(i).id;
121
2/2
✓ Branch 15 → 16 taken 153 times.
✓ Branch 15 → 21 taken 399 times.
552 if (!sameIds) {
122 153 beginResetModel();
123 153 m_rows = rows;
124 153 endResetModel();
125 153 emit countChanged();
126 153 return;
127 }
128 399 m_rows = rows;
129
2/2
✓ Branch 23 → 24 taken 385 times.
✓ Branch 23 → 33 taken 14 times.
399 if (!m_rows.isEmpty())
130
3/3
✓ Branch 27 → 28 taken 385 times.
✓ Branch 29 → 30 taken 385 times.
✓ Branch 30 → 31 taken 385 times.
385 emit dataChanged(index(0), index(int(m_rows.size()) - 1));
131 }
132
133 2 int ConflictItemModel::indexOf(const QString &id) const {
134
2/2
✓ Branch 9 → 3 taken 2 times.
✓ Branch 9 → 10 taken 1 time.
3 for (int i = 0; i < m_rows.size(); ++i)
135
2/2
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 1 time.
2 if (m_rows.at(i).id == id)
136 1 return i;
137 1 return -1;
138 }
139
140 77 int ConflictItemModel::nextOpen(int fromRow, int direction) const {
141 77 const int count = int(m_rows.size());
142
2/2
✓ Branch 3 → 4 taken 6 times.
✓ Branch 3 → 5 taken 71 times.
77 if (count == 0)
143 6 return -1;
144
1/2
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 71 times.
71 const int step = direction < 0 ? -1 : 1;
145
2/2
✓ Branch 15 → 9 taken 105 times.
✓ Branch 15 → 16 taken 28 times.
133 for (int offset = 1; offset <= count; ++offset) {
146 105 const int row = ((fromRow + step * offset) % count + count) % count;
147
2/2
✓ Branch 12 → 13 taken 43 times.
✓ Branch 12 → 14 taken 62 times.
105 if (m_rows.at(row).state == QLatin1String("open"))
148 43 return row;
149 }
150 28 return -1;
151 }
152