• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

MeindertN / RoboClerk / 18636588030

19 Oct 2025 09:51PM UTC coverage: 82.089% (-0.5%) from 82.629%
18636588030

push

github

MeindertN
Fixed cross platform compatibility for a number of tests

2000 of 2531 branches covered (79.02%)

Branch coverage included in aggregate %.

6167 of 7418 relevant lines covered (83.14%)

156.04 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

64.75
/RoboClerk/PluginSupport/DataSourcePluginBase.cs
1
using System;
2
using System.Collections.Generic;
3
using System.IO.Abstractions;
4
using System.Linq;
5
using System.Reflection;
6
using System.Text;
7
using System.Text.RegularExpressions;
8

9
namespace RoboClerk
10
{
11
    public abstract class DataSourcePluginBase : PluginBase, IDataSourcePlugin
12
    {
13
        protected List<RequirementItem> systemRequirements = new List<RequirementItem>();
129✔
14
        protected List<RequirementItem> softwareRequirements = new List<RequirementItem>();
129✔
15
        protected List<RequirementItem> documentationRequirements = new List<RequirementItem>();
129✔
16
        protected List<SoftwareSystemTestItem> testCases = new List<SoftwareSystemTestItem>();
129✔
17
        protected List<AnomalyItem> anomalies = new List<AnomalyItem>();
129✔
18
        protected List<RiskItem> risks = new List<RiskItem>();
129✔
19
        protected List<SOUPItem> soup = new List<SOUPItem>();
129✔
20
        protected List<DocContentItem> docContents = new List<DocContentItem>();
129✔
21
        protected List<UnitTestItem> unitTests = new List<UnitTestItem>();
129✔
22
        protected List<ExternalDependency> dependencies = new List<ExternalDependency>();
129✔
23
        protected List<TestResult> testResults = new List<TestResult>();
129✔
24
        //we also keep track of any items that have been eliminated
25
        protected List<EliminatedRequirementItem> eliminatedSystemRequirements = new List<EliminatedRequirementItem>();
129✔
26
        protected List<EliminatedRequirementItem> eliminatedSoftwareRequirements = new List<EliminatedRequirementItem>();
129✔
27
        protected List<EliminatedRequirementItem> eliminatedDocumentationRequirements = new List<EliminatedRequirementItem>();
129✔
28
        protected List<EliminatedSoftwareSystemTestItem> eliminatedSoftwareSystemTests = new List<EliminatedSoftwareSystemTestItem>();
129✔
29
        protected List<EliminatedRiskItem> eliminatedRisks = new List<EliminatedRiskItem>();
129✔
30
        protected List<EliminatedDocContentItem> eliminatedDocContents = new List<EliminatedDocContentItem>();
129✔
31
        protected List<EliminatedSOUPItem> eliminatedSOUP = new List<EliminatedSOUPItem>();
129✔
32
        protected List<EliminatedAnomalyItem> eliminatedAnomalies = new List<EliminatedAnomalyItem>();
129✔
33
        protected List<EliminatedTestResult> eliminatedTestResults = new List<EliminatedTestResult>();
129✔
34
        protected List<EliminatedUnitTestItem> eliminatedUnitTests = new List<EliminatedUnitTestItem>();
129✔
35

36
        public DataSourcePluginBase(IFileSystem fileSystem)
37
            :base(fileSystem)
129✔
38
        {
129✔
39

40
        }
129✔
41

42
        public abstract void RefreshItems();
43

44
        public IEnumerable<AnomalyItem> GetAnomalies()
45
        {
4✔
46
            return anomalies;
4✔
47
        }
4✔
48

49
        public IEnumerable<RequirementItem> GetSystemRequirements()
50
        {
4✔
51
            return systemRequirements;
4✔
52
        }
4✔
53

54
        public IEnumerable<RequirementItem> GetSoftwareRequirements()
55
        {
4✔
56
            return softwareRequirements;
4✔
57
        }
4✔
58

59
        public IEnumerable<RequirementItem> GetDocumentationRequirements()
60
        {
4✔
61
            return documentationRequirements;
4✔
62
        }
4✔
63

64
        public IEnumerable<DocContentItem> GetDocContents()
65
        {
4✔
66
            return docContents;
4✔
67
        }
4✔
68

69
        public IEnumerable<SoftwareSystemTestItem> GetSoftwareSystemTests()
70
        {
12✔
71
            return testCases;
12✔
72
        }
12✔
73

74
        public IEnumerable<RiskItem> GetRisks()
75
        {
4✔
76
            return risks;
4✔
77
        }
4✔
78

79
        public IEnumerable<SOUPItem> GetSOUP()
80
        {
4✔
81
            return soup;
4✔
82
        }
4✔
83

84
        public IEnumerable<UnitTestItem> GetUnitTests()
85
        {
39✔
86
            return unitTests;
39✔
87
        }
39✔
88

89
        public IEnumerable<ExternalDependency> GetDependencies()
90
        {
×
91
            return dependencies;
×
92
        }
×
93

94
        public IEnumerable<TestResult> GetTestResults()
95
        {
6✔
96
            return testResults;
6✔
97
        }
6✔
98

99
        public IEnumerable<EliminatedRequirementItem> GetEliminatedSystemRequirements()
100
        {
4✔
101
            return eliminatedSystemRequirements;
4✔
102
        }
4✔
103

104
        public IEnumerable<EliminatedRequirementItem> GetEliminatedSoftwareRequirements()
105
        {
2✔
106
            return eliminatedSoftwareRequirements;
2✔
107
        }
2✔
108

109
        public IEnumerable<EliminatedRequirementItem> GetEliminatedDocumentationRequirements()
110
        {
2✔
111
            return eliminatedDocumentationRequirements;
2✔
112
        }
2✔
113

114
        public IEnumerable<EliminatedSoftwareSystemTestItem> GetEliminatedSoftwareSystemTests()
115
        {
2✔
116
            return eliminatedSoftwareSystemTests;
2✔
117
        }
2✔
118

119
        public IEnumerable<EliminatedRiskItem> GetEliminatedRisks()
120
        {
2✔
121
            return eliminatedRisks;
2✔
122
        }
2✔
123

124
        public IEnumerable<EliminatedDocContentItem> GetEliminatedDocContents()
125
        {
2✔
126
            return eliminatedDocContents;
2✔
127
        }
2✔
128

129
        public IEnumerable<EliminatedAnomalyItem> GetEliminatedAnomalies()
130
        {
4✔
131
            return eliminatedAnomalies;
4✔
132
        }
4✔
133

134
        public IEnumerable<EliminatedSOUPItem> GetEliminatedSOUP()
135
        {
2✔
136
            return eliminatedSOUP;
2✔
137
        }
2✔
138

139
        public IEnumerable<EliminatedTestResult> GetEliminatedTestResults()
140
        {
×
141
            return eliminatedTestResults;
×
142
        }
×
143

144
        public IEnumerable<EliminatedUnitTestItem> GetEliminatedUnitTests()
145
        {
×
146
            return eliminatedUnitTests;
×
147
        }
×
148

149
        protected void ClearAllItems()
150
        {
4✔
151
            systemRequirements.Clear();
4✔
152
            softwareRequirements.Clear();
4✔
153
            documentationRequirements.Clear();
4✔
154
            testCases.Clear();
4✔
155
            anomalies.Clear();
4✔
156
            risks.Clear();
4✔
157
            soup.Clear();
4✔
158
            docContents.Clear();
4✔
159
            unitTests.Clear();
4✔
160
            dependencies.Clear();
4✔
161
            testResults.Clear();
4✔
162
            eliminatedSystemRequirements.Clear();
4✔
163
            eliminatedSoftwareRequirements.Clear();
4✔
164
            eliminatedDocumentationRequirements.Clear();
4✔
165
            eliminatedSoftwareSystemTests.Clear();
4✔
166
            eliminatedSOUP.Clear();
4✔
167
            eliminatedRisks.Clear();
4✔
168
            eliminatedDocContents.Clear();
4✔
169
            eliminatedAnomalies.Clear();
4✔
170
            eliminatedTestResults.Clear();
4✔
171
            eliminatedUnitTests.Clear();
4✔
172
        }
4✔
173

174
        public void EliminateItem(string itemID, string reason, EliminationReason eliminationReason)
175
        {
×
176
            // Check system requirements
177
            var systemReq = systemRequirements.FirstOrDefault(item => item.ItemID == itemID);
×
178
            if (systemReq != null)
×
179
            {
×
180
                systemRequirements.Remove(systemReq);
×
181
                eliminatedSystemRequirements.Add(new EliminatedRequirementItem(systemReq, reason, eliminationReason));
×
182
                return;
×
183
            }
184

185
            // Check software requirements
186
            var softwareReq = softwareRequirements.FirstOrDefault(item => item.ItemID == itemID);
×
187
            if (softwareReq != null)
×
188
            {
×
189
                softwareRequirements.Remove(softwareReq);
×
190
                eliminatedSoftwareRequirements.Add(new EliminatedRequirementItem(softwareReq, reason, eliminationReason));
×
191
                return;
×
192
            }
193

194
            // Check documentation requirements
195
            var docReq = documentationRequirements.FirstOrDefault(item => item.ItemID == itemID);
×
196
            if (docReq != null)
×
197
            {
×
198
                documentationRequirements.Remove(docReq);
×
199
                eliminatedDocumentationRequirements.Add(new EliminatedRequirementItem(docReq, reason, eliminationReason));
×
200
                return;
×
201
            }
202

203
            // Check software system tests
204
            var testCase = testCases.FirstOrDefault(item => item.ItemID == itemID);
×
205
            if (testCase != null)
×
206
            {
×
207
                testCases.Remove(testCase);
×
208
                eliminatedSoftwareSystemTests.Add(new EliminatedSoftwareSystemTestItem(testCase, reason, eliminationReason));
×
209
                return;
×
210
            }
211

212
            // Check unit tests
213
            var unitTest = unitTests.FirstOrDefault(item => item.ItemID == itemID);
×
214
            if (unitTest != null)
×
215
            {
×
216
                unitTests.Remove(unitTest);
×
217
                eliminatedUnitTests.Add(new EliminatedUnitTestItem(unitTest, reason, eliminationReason));
×
218
                return;
×
219
            }
220

221
            // Check risks
222
            var risk = risks.FirstOrDefault(item => item.ItemID == itemID);
×
223
            if (risk != null)
×
224
            {
×
225
                risks.Remove(risk);
×
226
                eliminatedRisks.Add(new EliminatedRiskItem(risk, reason, eliminationReason));
×
227
                return;
×
228
            }
229

230
            // Check anomalies
231
            var anomaly = anomalies.FirstOrDefault(item => item.ItemID == itemID);
×
232
            if (anomaly != null)
×
233
            {
×
234
                anomalies.Remove(anomaly);
×
235
                eliminatedAnomalies.Add(new EliminatedAnomalyItem(anomaly, reason, eliminationReason));
×
236
                return;
×
237
            }
238

239
            // Check SOUP items
240
            var soupItem = soup.FirstOrDefault(item => item.ItemID == itemID);
×
241
            if (soupItem != null)
×
242
            {
×
243
                soup.Remove(soupItem);
×
244
                eliminatedSOUP.Add(new EliminatedSOUPItem(soupItem, reason, eliminationReason));
×
245
                return;
×
246
            }
247

248
            // Check doc content items
249
            var docContent = docContents.FirstOrDefault(item => item.ItemID == itemID);
×
250
            if (docContent != null)
×
251
            {
×
252
                docContents.Remove(docContent);
×
253
                eliminatedDocContents.Add(new EliminatedDocContentItem(docContent, reason, eliminationReason));
×
254
                return;
×
255
            }
256

257
            // Check test results
258
            var testResult = testResults.FirstOrDefault(item => item.ItemID == itemID);
×
259
            if (testResult != null)
×
260
            {
×
261
                testResults.Remove(testResult);
×
262
                eliminatedTestResults.Add(new EliminatedTestResult(testResult, reason, eliminationReason));
×
263
                return;
×
264
            }
265

266
            // If we reach here, the item was not found
267
            throw new ArgumentException($"Item with ID '{itemID}' not found in any item collection for plugin '{Name}'.");
×
268
        }
×
269

270
        protected string EscapeNonTablePipes(string text)
271
        {
91✔
272
            string tableBlockPattern = @"(?ms)(^\|===\s*$.*?^\|===\s*$)";
91✔
273

274
            // Use Regex.Split with a capturing group so that the table blocks are kept in the result.
275
            string[] segments = Regex.Split(text, tableBlockPattern);
91✔
276
            var sb = new StringBuilder();
91✔
277

278
            foreach (string segment in segments)
471✔
279
            {
99✔
280
                // If the segment itself matches our table block pattern, leave it unmodified.
281
                if (Regex.IsMatch(segment, @"(?ms)^\|===\s*$.*?^\|===\s*$"))
99✔
282
                {
4✔
283
                    sb.Append(segment);
4✔
284
                }
4✔
285
                else
286
                {
95✔
287
                    // Otherwise, escape any unescaped "|" in this segment.
288
                    string processed = Regex.Replace(segment, @"(?<!\\)\|", @"\|");
95✔
289
                    sb.Append(processed);
95✔
290
                }
95✔
291
            }
99✔
292
            return sb.ToString();
91✔
293
        }
91✔
294

295
        private void ScrubItemsFields<T>(IEnumerable<T> items)
296
        {
21✔
297
            foreach (var obj in items)
79✔
298
            {
8✔
299
                Type type = obj.GetType();
8✔
300
                PropertyInfo[] properties = type.GetProperties();
8✔
301

302
                foreach (PropertyInfo property in properties)
294✔
303
                {
135✔
304
                    if (property.PropertyType == typeof(string) && property.CanWrite)
135✔
305
                    {
85✔
306
                        string currentValue = (string)property.GetValue(obj);
85✔
307
                        if (currentValue != null)
85✔
308
                        {
85✔
309
                            // Escape pipes in non-table parts of the content.
310
                            string newValue = EscapeNonTablePipes(currentValue);
85✔
311
                            property.SetValue(obj, newValue);
85✔
312
                        }
85✔
313
                    }
85✔
314
                }
135✔
315
            }
8✔
316
        }
21✔
317

318
        // with the exception of docContent items, all other items are visualized
319
        // in tables and they need to escape the | character
320
        protected void ScrubItemContents()
321
        {
2✔
322
            ScrubItemsFields(systemRequirements);
2✔
323
            ScrubItemsFields(softwareRequirements);
2✔
324
            ScrubItemsFields(documentationRequirements);
2✔
325
            ScrubItemsFields(testCases);
2✔
326
            foreach (var testCase in testCases)
8✔
327
            {
1✔
328
                ScrubItemsFields(testCase.TestCaseSteps);
1✔
329
            }
1✔
330
            ScrubItemsFields(anomalies);
2✔
331
            ScrubItemsFields(risks);
2✔
332
            ScrubItemsFields(soup);
2✔
333
            ScrubItemsFields(unitTests);
2✔
334
            ScrubItemsFields(dependencies);
2✔
335
            ScrubItemsFields(testResults);
2✔
336
        }
2✔
337
    }
338
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc