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: 90.5% 201 / 0 / 222
Functions: 93.8% 15 / 0 / 16
Branches: 78.6% 279 / 0 / 355

presentation/QuickRuleModel.cpp
Line Branch Exec Source
1 #include "QuickRuleModel.h"
2
3 #include "RuleSentence.h"
4
5 #include <QCryptographicHash>
6 #include <QSet>
7
8 383 bool QuickRuleModel::Row::operator==(const Row &other) const {
9
4/6
✓ Branch 4 → 5 taken 363 times.
✓ Branch 4 → 33 taken 20 times.
✓ Branch 6 → 7 taken 363 times.
✗ Branch 6 → 33 not taken.
✓ Branch 8 → 9 taken 363 times.
✗ Branch 8 → 33 not taken.
1129 return key == other.key && blockIndex == other.blockIndex && kind == other.kind &&
10
3/4
✓ Branch 9 → 10 taken 363 times.
✗ Branch 9 → 33 not taken.
✓ Branch 10 → 11 taken 351 times.
✓ Branch 10 → 33 taken 12 times.
726 name == other.name && named == other.named && enabled == other.enabled &&
11
4/6
✓ Branch 11 → 12 taken 351 times.
✗ Branch 11 → 33 not taken.
✓ Branch 13 → 14 taken 336 times.
✓ Branch 13 → 33 taken 15 times.
✓ Branch 15 → 16 taken 336 times.
✗ Branch 15 → 33 not taken.
351 position == other.position && sentence == other.sentence && target == other.target &&
12
3/6
✓ Branch 16 → 17 taken 336 times.
✗ Branch 16 → 33 not taken.
✓ Branch 17 → 18 taken 336 times.
✗ Branch 17 → 33 not taken.
✓ Branch 18 → 19 taken 336 times.
✗ Branch 18 → 33 not taken.
336 stop == other.stop && forward == other.forward && destructive == other.destructive &&
13
6/8
✓ Branch 20 → 21 taken 336 times.
✗ Branch 20 → 33 not taken.
✓ Branch 22 → 23 taken 336 times.
✗ Branch 22 → 33 not taken.
✓ Branch 23 → 24 taken 267 times.
✓ Branch 23 → 33 taken 69 times.
✓ Branch 25 → 26 taken 260 times.
✓ Branch 25 → 33 taken 7 times.
603 unsupported == other.unsupported && excerpt == other.excerpt && line == other.line &&
14
4/8
✓ Branch 3 → 4 taken 383 times.
✗ Branch 3 → 33 not taken.
✓ Branch 27 → 28 taken 260 times.
✗ Branch 27 → 33 not taken.
✓ Branch 29 → 30 taken 260 times.
✗ Branch 29 → 33 not taken.
✓ Branch 31 → 32 taken 260 times.
✗ Branch 31 → 33 not taken.
1033 health == other.health && healthFix == other.healthFix && healthAlternative == other.healthAlternative && matchCount == other.matchCount;
15 }
16
17 3953 int QuickRuleModel::rowCount(const QModelIndex &parent) const {
18
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 3953 times.
3953 return parent.isValid() ? 0 : m_rows.size();
19 }
20
21 38 QHash<int, QByteArray> QuickRuleModel::roleNames() const {
22 ✗ return {{KeyRole, "ruleKey"}, {BlockIndexRole, "blockIndex"},
23 ✗ {KindRole, "ruleKind"}, {NameRole, "ruleName"},
24 ✗ {NamedRole, "ruleNamed"}, {EnabledRole, "ruleEnabled"},
25 ✗ {PositionRole, "rulePosition"}, {SentenceRole, "ruleSentence"},
26 ✗ {PlainSentenceRole, "ruleSentencePlain"}, {TargetRole, "ruleTarget"},
27 ✗ {StopRole, "ruleStops"}, {ForwardRole, "ruleForwards"},
28 ✗ {DestructiveRole, "ruleDestructive"}, {UnsupportedRole, "ruleUnsupported"},
29 ✗ {ExcerptRole, "ruleExcerpt"}, {LineRole, "ruleLine"},
30 ✗ {HealthRole, "ruleHealth"}, {HealthFixRole, "ruleHealthFix"}, {HealthAlternativeRole, "ruleHealthAlternative"},
31
2/4
✓ Branch 25 → 26 taken 798 times.
✓ Branch 25 → 27 taken 38 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
836 {MatchCountRole, "ruleMatchCount"}, {AccessibleRole, "ruleAccessibleName"}};
32 38 }
33
34 2587 QVariant QuickRuleModel::data(const QModelIndex &index, int role) const {
35
5/6
✓ Branch 3 → 4 taken 2586 times.
✓ Branch 3 → 7 taken 1 time.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 2586 times.
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 11 taken 2586 times.
2587 if (!index.isValid() || index.row() >= m_rows.size())
36 1 return {};
37 2586 const Row &row = m_rows.at(index.row());
38
22/22
✓ Branch 13 → 14 taken 135 times.
✓ Branch 13 → 15 taken 135 times.
✓ Branch 13 → 16 taken 135 times.
✓ Branch 13 → 17 taken 137 times.
✓ Branch 13 → 18 taken 1 time.
✓ Branch 13 → 19 taken 135 times.
✓ Branch 13 → 20 taken 135 times.
✓ Branch 13 → 21 taken 136 times.
✓ Branch 13 → 22 taken 135 times.
✓ Branch 13 → 23 taken 136 times.
✓ Branch 13 → 24 taken 135 times.
✓ Branch 13 → 25 taken 135 times.
✓ Branch 13 → 26 taken 135 times.
✓ Branch 13 → 27 taken 136 times.
✓ Branch 13 → 28 taken 135 times.
✓ Branch 13 → 29 taken 1 time.
✓ Branch 13 → 30 taken 142 times.
✓ Branch 13 → 31 taken 138 times.
✓ Branch 13 → 32 taken 137 times.
✓ Branch 13 → 33 taken 135 times.
✓ Branch 13 → 34 taken 136 times.
✓ Branch 13 → 44 taken 1 time.
2586 switch (role) {
39 135 case KeyRole: return row.key;
40 135 case BlockIndexRole: return row.blockIndex;
41 135 case KindRole: return row.kind;
42 137 case NameRole: return row.name;
43 1 case NamedRole: return row.named;
44 135 case EnabledRole: return row.enabled;
45 135 case PositionRole: return row.position;
46 136 case SentenceRole: return row.sentence;
47 135 case PlainSentenceRole: return row.plainSentence;
48 136 case TargetRole: return row.target;
49 135 case StopRole: return row.stop;
50 135 case ForwardRole: return row.forward;
51 135 case DestructiveRole: return row.destructive;
52 136 case UnsupportedRole: return row.unsupported;
53 135 case ExcerptRole: return row.excerpt;
54 1 case LineRole: return row.line;
55 142 case HealthRole: return row.health;
56 138 case HealthFixRole: return row.healthFix;
57 137 case HealthAlternativeRole: return row.healthAlternative;
58 135 case MatchCountRole: return row.matchCount;
59 136 case AccessibleRole:
60 //: Accessible name of a rule row: name, on/off state, sentence.
61
1/1
✓ Branch 34 → 35 taken 136 times.
136 return tr("Rule %1, %2: %3")
62
5/5
✓ Branch 35 → 36 taken 108 times.
✓ Branch 35 → 37 taken 28 times.
✓ Branch 36 → 38 taken 108 times.
✓ Branch 37 → 38 taken 28 times.
✓ Branch 38 → 39 taken 136 times.
136 .arg(row.name, row.enabled ? tr("on") : tr("off"), row.plainSentence);
63 1 default: return {};
64 }
65 }
66
67 164 QList<QuickRuleModel::Row> QuickRuleModel::rowsFor(const Sieve::Document &document,
68 const QStringList &serverExtensions) {
69 164 QList<Row> rows;
70 164 QHash<QString, int> occurrences;
71 164 int position = 0;
72
2/2
✓ Branch 196 → 3 taken 1332 times.
✓ Branch 196 → 197 taken 164 times.
1496 for (int i = 0; i < document.blocks.size(); ++i) {
73 1332 const Sieve::Block &block = document.blocks.at(i);
74
4/4
✓ Branch 4 → 5 taken 262 times.
✓ Branch 4 → 8 taken 1070 times.
✓ Branch 5 → 6 taken 227 times.
✓ Branch 5 → 8 taken 35 times.
1332 if (block.kind != Sieve::BlockKind::Rule && block.kind != Sieve::BlockKind::Vacation &&
75
2/2
✓ Branch 6 → 7 taken 165 times.
✓ Branch 6 → 8 taken 62 times.
227 block.kind != Sieve::BlockKind::Advanced)
76 165 continue;
77 1167 Row row;
78 1167 row.blockIndex = i;
79 1167 row.line = block.line;
80 1167 row.named = block.named;
81
2/2
✓ Branch 8 → 9 taken 1070 times.
✓ Branch 8 → 74 taken 97 times.
1167 if (block.kind == Sieve::BlockKind::Rule) {
82 1070 row.kind = QStringLiteral("rule");
83 1070 row.position = ++position;
84 1070 const Sieve::Rule &rule = block.rule;
85
1/3
✓ Branch 15 → 16 taken 1070 times.
✗ Branch 15 → 17 not taken.
✗ Branch 17 → 18 not taken.
1070 row.name = block.named ? block.name : RuleSentence::generatedName(rule);
86 1070 row.enabled = rule.enabled;
87
1/1
✓ Branch 20 → 21 taken 1070 times.
1070 row.sentence = RuleSentence::sentence(rule, RuleSentence::rich);
88
1/1
✓ Branch 23 → 24 taken 1070 times.
1070 row.plainSentence = RuleSentence::sentence(rule);
89
1/1
✓ Branch 26 → 27 taken 1070 times.
1070 row.target = RuleSentence::target(rule);
90 1070 row.stop = rule.stop;
91
2/2
✓ Branch 43 → 31 taken 1136 times.
✓ Branch 43 → 44 taken 1070 times.
2206 for (const Sieve::Action &action : rule.actions) {
92
4/4
✓ Branch 32 → 33 taken 1135 times.
✓ Branch 32 → 34 taken 1 time.
✓ Branch 33 → 34 taken 7 times.
✓ Branch 33 → 35 taken 1128 times.
1136 row.forward = row.forward || action.kind == Sieve::Action::Kind::Redirect;
93
3/4
✓ Branch 36 → 37 taken 1136 times.
✗ Branch 36 → 39 not taken.
✓ Branch 37 → 38 taken 1135 times.
✓ Branch 37 → 39 taken 1 time.
2271 row.destructive = row.destructive || action.kind == Sieve::Action::Kind::Discard ||
94
2/2
✓ Branch 38 → 39 taken 5 times.
✓ Branch 38 → 40 taken 1130 times.
1135 action.kind == Sieve::Action::Kind::Reject;
95 }
96
1/2
✓ Branch 45 → 46 taken 1070 times.
✗ Branch 45 → 157 not taken.
1070 if (!serverExtensions.isEmpty())
97
5/5
✓ Branch 46 → 47 taken 1070 times.
✓ Branch 47 → 48 taken 1070 times.
✓ Branch 48 → 49 taken 1070 times.
✓ Branch 71 → 50 taken 1132 times.
✓ Branch 71 → 72 taken 1070 times.
2202 for (const QString &extension : Sieve::extensionsFor(rule))
98
1/2
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 62 taken 1132 times.
1132 if (!serverExtensions.contains(extension) &&
99 ✗ !(extension == QLatin1String("imap4flags") &&
100
3/8
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 1132 times.
✗ Branch 65 → 66 not taken.
✓ Branch 65 → 67 taken 1132 times.
✗ Branch 67 → 68 not taken.
✓ Branch 67 → 69 taken 1132 times.
1132 serverExtensions.contains(QStringLiteral("imapflags"))))
101
0/1
✗ Branch 68 → 69 not taken.
1070 row.unsupported.append(extension);
102
2/2
✓ Branch 74 → 75 taken 35 times.
✓ Branch 74 → 93 taken 62 times.
97 } else if (block.kind == Sieve::BlockKind::Vacation) {
103 35 row.kind = QStringLiteral("vacation");
104
1/3
✓ Branch 81 → 82 taken 35 times.
✗ Branch 81 → 83 not taken.
✗ Branch 83 → 84 not taken.
35 row.name = block.named ? block.name : tr("Out of office");
105 35 row.enabled = block.vacation.enabled;
106
1/1
✓ Branch 86 → 87 taken 35 times.
35 row.plainSentence = RuleSentence::vacationSummary(block.vacation);
107
1/1
✓ Branch 89 → 90 taken 35 times.
35 row.sentence = row.plainSentence.toHtmlEscaped();
108 } else {
109 62 row.kind = QStringLiteral("advanced");
110 62 row.position = ++position;
111
3/3
✓ Branch 99 → 100 taken 32 times.
✓ Branch 99 → 101 taken 30 times.
✓ Branch 101 → 102 taken 30 times.
62 row.name = block.named ? block.name : tr("Advanced block");
112
2/2
✓ Branch 105 → 106 taken 62 times.
✓ Branch 106 → 107 taken 62 times.
62 const QByteArray body = block.original.mid(block.leading.size()).trimmed();
113
1/1
✓ Branch 108 → 109 taken 62 times.
62 const QList<QByteArray> lines = body.split('\n');
114 // The first lines that say something: no marker comment (the name is
115 // shown above it) and no lone braces.
116 62 QStringList excerpt;
117
6/6
✓ Branch 138 → 139 taken 187 times.
✓ Branch 138 → 142 taken 31 times.
✓ Branch 140 → 141 taken 156 times.
✓ Branch 140 → 142 taken 31 times.
✓ Branch 143 → 110 taken 156 times.
✓ Branch 143 → 144 taken 62 times.
218 for (int l = 0; l < lines.size() && excerpt.size() < 2; ++l) {
118
2/2
✓ Branch 111 → 112 taken 156 times.
✓ Branch 112 → 113 taken 156 times.
156 const QString line = QString::fromUtf8(lines.at(l)).trimmed();
119
4/6
✓ Branch 115 → 116 taken 156 times.
✗ Branch 115 → 125 not taken.
✓ Branch 118 → 119 taken 125 times.
✓ Branch 118 → 125 taken 31 times.
✓ Branch 121 → 122 taken 125 times.
✗ Branch 121 → 125 not taken.
281 if (line.isEmpty() || line == QLatin1String("{") || line == QLatin1String("}") ||
120
5/5
✓ Branch 123 → 124 taken 125 times.
✓ Branch 124 → 125 taken 32 times.
✓ Branch 124 → 126 taken 93 times.
✓ Branch 127 → 128 taken 63 times.
✓ Branch 127 → 129 taken 93 times.
281 line.startsWith(QLatin1String("# rule:[")))
121 63 continue;
122
1/1
✓ Branch 129 → 130 taken 93 times.
93 excerpt.append(line);
123 156 }
124
1/1
✓ Branch 146 → 147 taken 62 times.
62 row.excerpt = excerpt.join(QLatin1Char('\n'));
125 62 row.plainSentence = row.excerpt;
126
1/1
✓ Branch 150 → 151 taken 62 times.
62 row.sentence = row.excerpt.toHtmlEscaped();
127 62 }
128
1/3
✓ Branch 160 → 161 taken 1137 times.
✗ Branch 253 → 254 not taken.
✗ Branch 253 → 255 not taken.
2274 QString base = block.named ? row.kind + QLatin1Char(':') + block.name
129
3/5
✓ Branch 168 → 169 taken 30 times.
✓ Branch 170 → 171 taken 30 times.
✓ Branch 170 → 172 taken 1137 times.
✗ Branch 234 → 235 not taken.
✗ Branch 234 → 236 not taken.
1197 : row.kind + QLatin1Char(':') +
130
6/10
✓ Branch 163 → 164 taken 30 times.
✓ Branch 165 → 166 taken 30 times.
✓ Branch 172 → 173 taken 30 times.
✓ Branch 172 → 174 taken 1137 times.
✓ Branch 178 → 179 taken 1137 times.
✓ Branch 178 → 180 taken 30 times.
✗ Branch 240 → 241 not taken.
✗ Branch 240 → 242 not taken.
✗ Branch 248 → 249 not taken.
✗ Branch 248 → 250 not taken.
2394 QString::fromLatin1(QCryptographicHash::hash(
131
9/11
✓ Branch 157 → 158 taken 1137 times.
✓ Branch 157 → 162 taken 30 times.
✓ Branch 161 → 170 taken 1137 times.
✓ Branch 164 → 165 taken 30 times.
✓ Branch 169 → 170 taken 30 times.
✓ Branch 174 → 175 taken 30 times.
✓ Branch 174 → 176 taken 1137 times.
✓ Branch 176 → 177 taken 30 times.
✓ Branch 176 → 178 taken 1137 times.
✗ Branch 244 → 245 not taken.
✗ Branch 244 → 246 not taken.
3561 block.original, QCryptographicHash::Sha1).toHex());
132
4/4
✓ Branch 180 → 181 taken 1167 times.
✓ Branch 181 → 182 taken 1167 times.
✓ Branch 184 → 185 taken 1167 times.
✓ Branch 185 → 186 taken 1167 times.
1167 row.key = base + QLatin1Char('#') + QString::number(occurrences[base]++);
133
1/1
✓ Branch 190 → 191 taken 1167 times.
1167 rows.append(row);
134 1167 }
135 164 return rows;
136 164 }
137
138 1222 bool QuickRuleModel::accepts(const Row &row) const {
139
4/4
✓ Branch 2 → 3 taken 3 times.
✓ Branch 2 → 5 taken 1219 times.
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 1 time.
1222 if (m_offOnly && row.enabled)
140 2 return false;
141
7/8
✓ Branch 5 → 6 taken 3 times.
✓ Branch 5 → 11 taken 1217 times.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 11 taken 2 times.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 11 not taken.
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 14 taken 1219 times.
1220 if (m_problemsOnly && row.health.isEmpty() && row.unsupported.isEmpty())
142 1 return false;
143
2/2
✓ Branch 17 → 18 taken 25 times.
✓ Branch 17 → 29 taken 6 times.
31 if (!m_folder.isEmpty() && row.target != m_folder &&
144
8/10
✓ Branch 15 → 16 taken 31 times.
✓ Branch 15 → 29 taken 1188 times.
✓ Branch 20 → 21 taken 25 times.
✓ Branch 21 → 22 taken 25 times.
✓ Branch 22 → 23 taken 24 times.
✓ Branch 22 → 29 taken 1 time.
✓ Branch 34 → 35 taken 24 times.
✓ Branch 34 → 36 taken 1195 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
2493 !row.target.startsWith(m_folder + QLatin1Char('/')) &&
145
7/10
✓ Branch 25 → 26 taken 24 times.
✓ Branch 26 → 27 taken 24 times.
✓ Branch 27 → 28 taken 24 times.
✗ Branch 27 → 29 not taken.
✓ Branch 30 → 31 taken 24 times.
✓ Branch 30 → 32 taken 1195 times.
✓ Branch 32 → 33 taken 25 times.
✓ Branch 32 → 34 taken 1194 times.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
1243 !row.target.startsWith(m_folder + QLatin1Char('.')))
146 24 return false;
147
2/2
✓ Branch 39 → 40 taken 2 times.
✓ Branch 39 → 45 taken 1 time.
1198 if (!m_text.isEmpty() && !row.name.contains(m_text, Qt::CaseInsensitive) &&
148
5/6
✓ Branch 37 → 38 taken 3 times.
✓ Branch 37 → 45 taken 1192 times.
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 45 not taken.
✓ Branch 46 → 47 taken 2 times.
✓ Branch 46 → 48 taken 1193 times.
1200 !row.plainSentence.contains(m_text, Qt::CaseInsensitive) &&
149
1/2
✓ Branch 43 → 44 taken 2 times.
✗ Branch 43 → 45 not taken.
2 !row.target.contains(m_text, Qt::CaseInsensitive))
150 2 return false;
151 1193 return true;
152 }
153
154 964 void QuickRuleModel::setRows(const QList<Row> &rows) {
155 964 m_all = rows;
156 964 QList<Row> target;
157
4/4
✓ Branch 3 → 4 taken 964 times.
✓ Branch 4 → 5 taken 964 times.
✓ Branch 12 → 6 taken 1167 times.
✓ Branch 12 → 13 taken 964 times.
2131 for (const Row &row : m_all)
158
3/3
✓ Branch 7 → 8 taken 1167 times.
✓ Branch 8 → 9 taken 1156 times.
✓ Branch 8 → 10 taken 11 times.
1167 if (accepts(row))
159
1/1
✓ Branch 9 → 10 taken 1156 times.
1156 target.append(row);
160
1/1
✓ Branch 13 → 14 taken 964 times.
964 applyVisible(target);
161 964 }
162
163 // Keyed incremental update of the visible rows: removals, moves, inserts
164 // and dataChanged — never a reset (S95.3.2).
165 964 void QuickRuleModel::applyVisible(const QList<Row> &target) {
166 964 const int before = m_rows.size();
167 964 QSet<QString> wanted;
168
2/2
✓ Branch 10 → 6 taken 1156 times.
✓ Branch 10 → 11 taken 964 times.
2120 for (const Row &row : target)
169
1/1
✓ Branch 7 → 8 taken 1156 times.
1156 wanted.insert(row.key);
170
2/2
✓ Branch 22 → 13 taken 402 times.
✓ Branch 22 → 23 taken 964 times.
1366 for (int i = m_rows.size() - 1; i >= 0; --i) {
171
2/2
✓ Branch 15 → 16 taken 383 times.
✓ Branch 15 → 17 taken 19 times.
402 if (wanted.contains(m_rows.at(i).key))
172 383 continue;
173
1/1
✓ Branch 18 → 19 taken 19 times.
19 beginRemoveRows({}, i, i);
174
1/1
✓ Branch 19 → 20 taken 19 times.
19 m_rows.removeAt(i);
175
1/1
✓ Branch 20 → 21 taken 19 times.
19 endRemoveRows();
176 }
177
2/2
✓ Branch 60 → 24 taken 1156 times.
✓ Branch 60 → 61 taken 964 times.
2120 for (int i = 0; i < target.size(); ++i) {
178 1156 const Row &row = target.at(i);
179 1156 int found = -1;
180
2/2
✓ Branch 32 → 26 taken 402 times.
✓ Branch 32 → 33 taken 773 times.
1175 for (int j = i; j < m_rows.size(); ++j)
181
2/2
✓ Branch 28 → 29 taken 383 times.
✓ Branch 28 → 30 taken 19 times.
402 if (m_rows.at(j).key == row.key) {
182 383 found = j;
183 383 break;
184 }
185
2/2
✓ Branch 33 → 34 taken 773 times.
✓ Branch 33 → 39 taken 383 times.
1156 if (found < 0) {
186
1/1
✓ Branch 35 → 36 taken 773 times.
773 beginInsertRows({}, i, i);
187
1/1
✓ Branch 36 → 37 taken 773 times.
773 m_rows.insert(i, row);
188
1/1
✓ Branch 37 → 38 taken 773 times.
773 endInsertRows();
189 773 continue;
190 }
191
2/2
✓ Branch 39 → 40 taken 3 times.
✓ Branch 39 → 45 taken 380 times.
383 if (found != i) {
192
1/1
✓ Branch 42 → 43 taken 3 times.
3 beginMoveRows({}, found, found, {}, i);
193
1/1
✓ Branch 43 → 44 taken 3 times.
3 m_rows.move(found, i);
194
1/1
✓ Branch 44 → 45 taken 3 times.
3 endMoveRows();
195 }
196
3/3
✓ Branch 46 → 47 taken 383 times.
✓ Branch 47 → 48 taken 123 times.
✓ Branch 47 → 58 taken 260 times.
383 if (!(m_rows.at(i) == row)) {
197
1/1
✓ Branch 48 → 49 taken 123 times.
123 m_rows[i] = row;
198
3/3
✓ Branch 52 → 53 taken 123 times.
✓ Branch 54 → 55 taken 123 times.
✓ Branch 55 → 56 taken 123 times.
123 emit dataChanged(index(i), index(i));
199 }
200 }
201
2/2
✓ Branch 62 → 63 taken 99 times.
✓ Branch 62 → 64 taken 865 times.
964 if (before != m_rows.size())
202
1/1
✓ Branch 63 → 64 taken 99 times.
99 emit countChanged();
203 964 }
204
205 12 void QuickRuleModel::setFilter(const QString &text, const QString &folder, bool problemsOnly,
206 bool offOnly) {
207
8/10
✓ Branch 3 → 4 taken 10 times.
✓ Branch 3 → 9 taken 2 times.
✓ Branch 5 → 6 taken 4 times.
✓ Branch 5 → 9 taken 6 times.
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 9 taken 2 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 2 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 12 times.
12 if (text == m_text && folder == m_folder && problemsOnly == m_problemsOnly && offOnly == m_offOnly)
208 ✗ return;
209
1/1
✓ Branch 12 → 13 taken 12 times.
12 m_text = text.trimmed();
210 12 m_folder = folder;
211 12 m_problemsOnly = problemsOnly;
212 12 m_offOnly = offOnly;
213 12 beginResetModel();
214 12 m_rows.clear();
215
4/4
✓ Branch 18 → 19 taken 12 times.
✓ Branch 19 → 20 taken 12 times.
✓ Branch 27 → 21 taken 55 times.
✓ Branch 27 → 28 taken 12 times.
67 for (const Row &row : m_all)
216
3/3
✓ Branch 22 → 23 taken 55 times.
✓ Branch 23 → 24 taken 37 times.
✓ Branch 23 → 25 taken 18 times.
55 if (accepts(row))
217
1/1
✓ Branch 24 → 25 taken 37 times.
37 m_rows.append(row);
218 12 endResetModel();
219 12 emit countChanged();
220 }
221
222 ✗ void QuickRuleModel::setMatchCount(const QString &key, const QString &text) {
223 ✗ for (Row &row : m_all)
224 ✗ if (row.key == key)
225 ✗ row.matchCount = text;
226 ✗ for (int i = 0; i < m_rows.size(); ++i)
227 ✗ if (m_rows.at(i).key == key && m_rows.at(i).matchCount != text) {
228 ✗ m_rows[i].matchCount = text;
229 ✗ emit dataChanged(index(i), index(i), {MatchCountRole});
230 }
231 ✗ }
232
233 13 int QuickRuleModel::blockIndexAt(int row) const {
234
3/4
✓ Branch 2 → 3 taken 13 times.
✗ Branch 2 → 7 not taken.
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 7 taken 1 time.
13 return row >= 0 && row < m_rows.size() ? m_rows.at(row).blockIndex : -1;
235 }
236
237 5 int QuickRuleModel::rowForBlock(int blockIndex) const {
238
2/2
✓ Branch 8 → 3 taken 29 times.
✓ Branch 8 → 9 taken 1 time.
30 for (int i = 0; i < m_rows.size(); ++i)
239
2/2
✓ Branch 4 → 5 taken 4 times.
✓ Branch 4 → 6 taken 25 times.
29 if (m_rows.at(i).blockIndex == blockIndex)
240 4 return i;
241 1 return -1;
242 }
243
244 2 QString QuickRuleModel::keyAt(int row) const {
245
3/4
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 7 taken 1 time.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 7 not taken.
2 return row >= 0 && row < m_rows.size() ? m_rows.at(row).key : QString();
246 }
247
248 89 int QuickRuleModel::problemCount() const {
249 89 int count = 0;
250
2/2
✓ Branch 15 → 4 taken 613 times.
✓ Branch 15 → 16 taken 89 times.
702 for (const Row &row : m_all)
251
5/6
✓ Branch 6 → 7 taken 551 times.
✓ Branch 6 → 9 taken 62 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 551 times.
✓ Branch 11 → 12 taken 62 times.
✓ Branch 11 → 13 taken 551 times.
613 if (!row.health.isEmpty() || !row.unsupported.isEmpty())
252 62 ++count;
253 89 return count;
254 }
255
256 44 int QuickRuleModel::offCount() const {
257 44 int count = 0;
258
2/2
✓ Branch 9 → 4 taken 306 times.
✓ Branch 9 → 10 taken 44 times.
350 for (const Row &row : m_all)
259
2/2
✓ Branch 5 → 6 taken 67 times.
✓ Branch 5 → 7 taken 239 times.
306 if (!row.enabled)
260 67 ++count;
261 44 return count;
262 }
263
264 263 QStringList QuickRuleModel::targets() const {
265 263 QStringList result;
266
2/2
✓ Branch 15 → 4 taken 2331 times.
✓ Branch 15 → 16 taken 263 times.
2594 for (const Row &row : m_all)
267
6/6
✓ Branch 6 → 7 taken 1853 times.
✓ Branch 6 → 10 taken 478 times.
✓ Branch 8 → 9 taken 1682 times.
✓ Branch 8 → 10 taken 171 times.
✓ Branch 11 → 12 taken 1682 times.
✓ Branch 11 → 13 taken 649 times.
2331 if (!row.target.isEmpty() && !result.contains(row.target))
268
1/1
✓ Branch 12 → 13 taken 1682 times.
1682 result.append(row.target);
269
1/1
✓ Branch 16 → 17 taken 263 times.
263 result.sort(Qt::CaseInsensitive);
270 263 return result;
271 ✗ }
272