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

rwjdk / TrelloDotNet / 13649885202

04 Mar 2025 08:57AM UTC coverage: 54.1% (+4.2%) from 49.905%
13649885202

push

github

rwjdk
More Bug-fixes for Filter by raising Test-coverage

1481 of 3275 branches covered (45.22%)

Branch coverage included in aggregate %.

12 of 14 new or added lines in 2 files covered. (85.71%)

2 existing lines in 2 files now uncovered.

3085 of 5165 relevant lines covered (59.73%)

61.66 hits per line

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

40.16
/src/TrelloDotNet/Extensions/CardsExtensions.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text.RegularExpressions;
5
using TrelloDotNet.Model;
6

7
namespace TrelloDotNet.Extensions
8
{
9
    /// <summary>
10
    /// Extensions for list of Cards
11
    /// </summary>
12
    public static class CardsExtensions
13
    {
14
        /// <summary>
15
        /// Filter list of cards based on a set of conditions
16
        /// </summary>
17
        /// <param name="cards">The list of cards</param>
18
        /// <param name="conditions">The conditions to apply</param>
19
        /// <returns></returns>
20
        public static List<Card> Filter(this IEnumerable<Card> cards, params CardsFilterCondition[] conditions)
21
        {
22
            foreach (CardsFilterCondition entry in conditions)
692✔
23
            {
24
                switch (entry.Field)
174!
25
                {
26
                    case CardsConditionField.Name:
27
                        cards = FilterName(cards, entry);
24✔
28
                        break;
24✔
29
                    case CardsConditionField.ListId:
30
                        cards = FilterListId(cards, entry);
10✔
31
                        break;
8✔
32
                    case CardsConditionField.ListName:
33
                        cards = FilterListName(cards, entry);
24✔
34
                        break;
22✔
35
                    case CardsConditionField.LabelId:
36
                        cards = FilterLabelId(cards, entry);
22✔
37
                        break;
22✔
38
                    case CardsConditionField.LabelName:
39
                        cards = FilterLabelName(cards, entry);
24✔
40
                        break;
24✔
41
                    case CardsConditionField.MemberId:
42
                        cards = FilterMemberId(cards, entry);
20✔
43
                        break;
20✔
44
                    case CardsConditionField.MemberName:
45
                        cards = FilterMemberName(cards, entry);
24✔
46
                        break;
24✔
47
                    case CardsConditionField.Description:
48
                        cards = FilterDescription(cards, entry);
26✔
49
                        break;
26✔
50
                    case CardsConditionField.DueWithNoDueComplete:
51
                        cards = FilterDueDateNoDueComplete(cards, entry);
×
52
                        break;
×
53
                    case CardsConditionField.Due:
54
                        cards = FilterDueDate(cards, entry);
×
55
                        break;
×
56
                    case CardsConditionField.Start:
57
                        cards = FilterStartDate(cards, entry);
×
58
                        break;
×
59
                    case CardsConditionField.Created:
60
                        cards = FilterCreateDate(cards, entry);
×
61
                        break;
×
62
                    case CardsConditionField.CustomField:
63
                        cards = FilterCustomField(cards, entry);
×
64
                        break;
×
65
                    case CardsConditionField.DueComplete:
66
                        cards = FilterDueComplete(cards, entry);
×
67
                        break;
68
                }
69
            }
70

71
            return cards.ToList();
170✔
72
        }
73

74
        private static IEnumerable<Card> FilterLabelName(IEnumerable<Card> cards, CardsFilterCondition entry)
75
        {
76
            switch (entry.Condition)
24!
77
            {
78
                case CardsCondition.AllOfThese:
79
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
80
                    {
81
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
82
                    }
83

84
                    return cards.Where(x => x.Labels.Any(y => y.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
7✔
85

86
                case CardsCondition.Equal:
87
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
88
                    {
89
                        return cards.Where(x => { return x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
9✔
90
                    }
91

92
                    // ReSharper disable once ConvertIfStatementToReturnStatement
93
                    if (entry.ValueAsNumber.HasValue)
1!
94
                    {
NEW
95
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsNumber.Value);
×
96
                    }
97

98
                    return cards.Where(x => x.LabelIds.Count == 1 && x.Labels.Any(z => z.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
5✔
99

100
                case CardsCondition.AnyOfThese:
101

102
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
103
                    {
104
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
105
                    }
106

107
                    return cards.Where(x => x.Labels.Any(z => z.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
108

109
                case CardsCondition.NoneOfThese:
110
                case CardsCondition.NotEqual:
111
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
112
                    {
113
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.Labels.Any(z => z.Name.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
28✔
114
                    }
115

116
                    // ReSharper disable once ConvertIfStatementToReturnStatement
117
                    if (entry.ValueAsNumber.HasValue)
2!
118
                    {
NEW
119
                        return cards.Where(x => x.LabelIds.Count != entry.ValueAsNumber.Value);
×
120
                    }
121

122
                    return cards.Where(x => !x.Labels.Any(z => z.Name.Equals(entry.ValueAsString)));
14✔
123

124
                case CardsCondition.DoNotHaveAnyValue:
125
                    return cards.Where(x => x.LabelIds.Count == 0);
×
126
                case CardsCondition.HasAnyValue:
127
                    return cards.Where(x => x.LabelIds.Count != 0);
×
128
                case CardsCondition.GreaterThan:
129
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
×
130
                case CardsCondition.LessThan:
131
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
×
132
                case CardsCondition.GreaterThanOrEqual:
133
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
×
134
                case CardsCondition.LessThanOrEqual:
135
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
×
136
                case CardsCondition.Between:
137
                {
138
                    if (entry.ValueAsNumbers?.Count != 2)
×
139
                    {
140
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
141
                    }
142

143
                    decimal from = entry.ValueAsNumbers.First();
×
144
                    decimal to = entry.ValueAsNumbers.Last();
×
145
                    cards = cards.Where(x => x.LabelIds.Count >= from);
×
146
                    cards = cards.Where(x => x.LabelIds.Count <= to);
×
147
                    return cards;
×
148
                }
149
                case CardsCondition.NotBetween:
150
                {
151
                    if (entry.ValueAsNumbers?.Count != 2)
×
152
                    {
153
                        throw new TrelloApiException("NotBetween Condition for Labels need 2 and only 2 Numbers");
×
154
                    }
155

156
                    decimal from = entry.ValueAsNumbers.First();
×
157
                    decimal to = entry.ValueAsNumbers.Last();
×
158
                    cards = cards.Where(x => x.LabelIds.Count > to || x.LabelIds.Count < from);
×
159
                    return cards;
×
160
                }
161
                case CardsCondition.Contains:
162
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
163
                    {
164
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.Contains(y))); });
16✔
165
                    }
166

167
                    return cards.Where(x => x.Labels.Any(z => z.Name.Contains(entry.ValueAsString)));
7✔
168
                case CardsCondition.DoNotContains:
169
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2!
170
                    {
171
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.Contains(y))); });
×
172
                    }
173

174
                    return cards.Where(x => x.Labels.All(z => !z.Name.Contains(entry.ValueAsString)));
14✔
175
                case CardsCondition.RegEx:
176
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
177
                    {
178
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => Regex.IsMatch(z.Name, y, RegexOptions.IgnoreCase))); });
12✔
179
                    }
180

181
                    return cards.Where(x => x.Labels.Any(z => Regex.IsMatch(z.Name, entry.ValueAsString, RegexOptions.IgnoreCase)));
6✔
182
                case CardsCondition.StartsWith:
183
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
184
                    {
185
                        return cards.Where(x => { return x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
6✔
186
                    }
187

188
                    return cards.Where(x => x.Labels.Any(z => z.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
189
                case CardsCondition.DoNotStartWith:
190
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
191
                    {
192
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
193
                    }
194

195
                    return cards.Where(x => x.Labels.All(z => !z.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
196
                case CardsCondition.EndsWith:
197
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
198
                    {
199
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Labels.Any(z => z.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
12✔
200
                    }
201

202
                    return cards.Where(x => x.Labels.Any(z => z.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
203
                case CardsCondition.DoNotEndWith:
204
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
205
                    {
206
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Labels.All(z => !z.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
16✔
207
                    }
208

209
                    return cards.Where(x => x.Labels.All(z => !z.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
7✔
210
                default:
211
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
212
            }
213
        }
214

215
        private static IEnumerable<Card> FilterListName(IEnumerable<Card> cards, CardsFilterCondition entry)
216
        {
217
            switch (entry.Condition)
24✔
218
            {
219
                case CardsCondition.AnyOfThese:
220
                case CardsCondition.Equal:
221
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
222
                    {
223
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Equals(x.List.Name, StringComparison.InvariantCultureIgnoreCase)));
18✔
224
                    }
225

226
                    return cards.Where(x => x.List.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
8✔
227
                case CardsCondition.NoneOfThese:
228
                case CardsCondition.NotEqual:
229
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
230
                    {
231
                        return cards.Where(x => entry.ValueAsStrings.All(y => !y.Equals(x.List.Name, StringComparison.InvariantCultureIgnoreCase)));
18✔
232
                    }
233

234
                    return cards.Where(x => !x.List.Name.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
8✔
235
                case CardsCondition.Contains:
236
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
237
                    {
238
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.Contains(y)));
10✔
239
                    }
240

241
                    return cards.Where(x => x.List.Name.Contains(entry.ValueAsString));
4✔
242
                case CardsCondition.DoNotContains:
243
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
244
                    {
245
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.Contains(y)));
10✔
246
                    }
247

248
                    return cards.Where(x => !x.List.Name.Contains(entry.ValueAsString));
4✔
249
                case CardsCondition.RegEx:
250
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
251
                    {
252
                        return cards.Where(x => entry.ValueAsStrings.Any(y => Regex.IsMatch(x.List.Name, y, RegexOptions.IgnoreCase)));
7✔
253
                    }
254

255
                    return cards.Where(x => Regex.IsMatch(x.List.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
256
                case CardsCondition.StartsWith:
257
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
258
                    {
259
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
260
                    }
261

262
                    return cards.Where(x => x.List.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
263
                case CardsCondition.EndsWith:
264
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
265
                    {
266
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.List.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
267
                    }
268

269
                    return cards.Where(x => x.List.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
270
                case CardsCondition.DoNotStartWith:
271
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
272
                    {
273
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
274
                    }
275

276
                    return cards.Where(x => !x.List.Name.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
277
                case CardsCondition.DoNotEndWith:
278
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
279
                    {
280
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.List.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
281
                    }
282

283
                    return cards.Where(x => !x.List.Name.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase));
4✔
284
                default:
285
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
2✔
286
            }
287
        }
288

289
        private static IEnumerable<Card> FilterDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
290
        {
291
            switch (entry.Condition)
×
292
            {
293
                case CardsCondition.Equal:
294
                    return cards.Where(x => x.DueComplete == entry.ValueAsBoolean);
×
295
                case CardsCondition.NotEqual:
296
                    return cards.Where(x => x.DueComplete != entry.ValueAsBoolean);
×
297
                default:
298
                    throw new TrelloApiException($"{entry.Condition} on DueComplete Filter does not make sense");
×
299
            }
300
        }
301

302
        private static IEnumerable<Card> FilterCustomField(IEnumerable<Card> cards, CardsFilterCondition entry)
303
        {
304
            if (entry.CustomFieldEntry == null)
×
305
            {
306
                throw new TrelloApiException("CustomField was not provided");
×
307
            }
308

309
            var customFieldDefinition = entry.CustomFieldEntry;
×
310

311
            cards = cards.Where(x =>
×
312
            {
×
313
                CustomFieldItem customFieldItem = x.CustomFieldItems.FirstOrDefault(y => y.CustomFieldId == customFieldDefinition.Id);
×
314
                switch (entry.Condition)
×
315
                {
×
316
                    case CardsCondition.HasAnyValue:
×
317
                        return customFieldItem != null;
×
318
                    case CardsCondition.DoNotHaveAnyValue:
×
319
                        return customFieldItem == null;
×
320
                }
×
321

×
322
                switch (customFieldDefinition.Type)
×
323
                {
×
324
                    case CustomFieldType.Checkbox:
×
325
                        var @checked = customFieldItem?.Value.Checked ?? false;
×
326
                        switch (entry.Condition)
×
327
                        {
×
328
                            case CardsCondition.Equal:
×
329
                                return @checked == entry.ValueAsBoolean;
×
330
                            case CardsCondition.NotEqual:
×
331
                                return @checked != entry.ValueAsBoolean;
×
332
                            default:
×
333
                                throw new TrelloApiException($"Custom Field of Type Checkbox can't use Condition '{entry.Condition}'");
×
334
                        }
×
335
                    case CustomFieldType.Date:
×
336
                        var date = customFieldItem?.Value.Date;
×
337
                        switch (entry.Condition)
×
338
                        {
×
339
                            case CardsCondition.Equal:
×
340
                                return date.HasValue && date.Value == entry.ValueAsDateTimeOffset;
×
341
                            case CardsCondition.NotEqual:
×
342
                                return !date.HasValue || date.Value != entry.ValueAsDateTimeOffset;
×
343
                            case CardsCondition.GreaterThan:
×
344
                                return date.HasValue && date.Value > entry.ValueAsDateTimeOffset;
×
345
                            case CardsCondition.LessThan:
×
346
                                return date.HasValue && date.Value < entry.ValueAsDateTimeOffset;
×
347
                            case CardsCondition.GreaterThanOrEqual:
×
348
                                return date.HasValue && date.Value >= entry.ValueAsDateTimeOffset;
×
349
                            case CardsCondition.LessThanOrEqual:
×
350
                                return date.HasValue && date.Value <= entry.ValueAsDateTimeOffset;
×
351
                            case CardsCondition.AnyOfThese:
×
352
                                return date.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == date.Value);
×
353
                            case CardsCondition.NoneOfThese:
×
354
                                return date.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != date.Value);
×
355
                            case CardsCondition.Between:
×
356
                            {
×
357
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
358
                                {
×
359
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Dates");
×
360
                                }
×
361

×
362
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
363
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
364
                                return date.HasValue && date.Value >= from && date.Value <= to;
×
365
                            }
×
366
                            case CardsCondition.NotBetween:
×
367
                            {
×
368
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
369
                                {
×
370
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Dates");
×
371
                                }
×
372

×
373
                                DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
374
                                DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
375
                                return (date.HasValue && date.Value > to) || (date.HasValue && date.Value < from);
×
376
                            }
×
377
                            default:
×
378
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Date");
×
379
                        }
×
380
                    case CustomFieldType.List:
×
381
                        string listValue = customFieldDefinition.Options.FirstOrDefault(y => y.Id == customFieldItem?.ValueId)?.Value.Text ?? string.Empty;
×
382
                        switch (entry.Condition)
×
383
                        {
×
384
                            case CardsCondition.Equal:
×
385
                                return listValue.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase);
×
386
                            case CardsCondition.NotEqual:
×
387
                                return listValue != entry.ValueAsString;
×
388
                            case CardsCondition.GreaterThan:
×
389
                                return listValue.Length > entry.ValueAsNumber;
×
390
                            case CardsCondition.LessThan:
×
391
                                return listValue.Length < entry.ValueAsNumber;
×
392
                            case CardsCondition.GreaterThanOrEqual:
×
393
                                return listValue.Length >= entry.ValueAsNumber;
×
394
                            case CardsCondition.LessThanOrEqual:
×
395
                                return listValue.Length <= entry.ValueAsNumber;
×
396
                            case CardsCondition.Contains:
×
397
                                return listValue.Contains(entry.ValueAsString);
×
398
                            case CardsCondition.DoNotContains:
×
399
                                return !listValue.Contains(entry.ValueAsString);
×
400
                            case CardsCondition.AnyOfThese:
×
401
                                return entry.ValueAsStrings?.Any(y => y.Equals(listValue, StringComparison.InvariantCultureIgnoreCase)) ?? false;
×
402
                            case CardsCondition.NoneOfThese:
×
403
                                return entry.ValueAsStrings?.All(y => y != listValue) ?? false;
×
404
                            case CardsCondition.RegEx:
×
405
                                return Regex.IsMatch(listValue, entry.ValueAsString, RegexOptions.IgnoreCase);
×
406
                            case CardsCondition.StartsWith:
×
407
                                return listValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
408
                            case CardsCondition.EndsWith:
×
409
                                return listValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
410
                            case CardsCondition.DoNotStartWith:
×
411
                                return !listValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
412
                            case CardsCondition.DoNotEndWith:
×
413
                                return !listValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
414
                            case CardsCondition.AllOfThese:
×
415
                            default:
×
416
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type List");
×
417
                        }
×
418
                    case CustomFieldType.Number:
×
419
                        var number = customFieldItem?.Value.Number ?? decimal.MinValue;
×
420
                        switch (entry.Condition)
×
421
                        {
×
422
                            case CardsCondition.Equal:
×
423
                                return number == entry.ValueAsNumber;
×
424
                            case CardsCondition.NotEqual:
×
425
                                return number != entry.ValueAsNumber;
×
426
                            case CardsCondition.GreaterThan:
×
427
                                return number > entry.ValueAsNumber;
×
428
                            case CardsCondition.LessThan:
×
429
                                return number < entry.ValueAsNumber;
×
430
                            case CardsCondition.GreaterThanOrEqual:
×
431
                                return number >= entry.ValueAsNumber;
×
432
                            case CardsCondition.LessThanOrEqual:
×
433
                                return number <= entry.ValueAsNumber;
×
434
                            case CardsCondition.AnyOfThese:
×
435
                                return entry.ValueAsNumbers.Any(y => y == number);
×
436
                            case CardsCondition.NoneOfThese:
×
437
                                return entry.ValueAsNumbers.All(y => y != number);
×
438
                            case CardsCondition.Between:
×
439
                            {
×
440
                                if (entry.ValueAsNumbers?.Count != 2)
×
441
                                {
×
442
                                    throw new TrelloApiException("Between Condition for Custom Field need 2 and only 2 Numbers");
×
443
                                }
×
444

×
445
                                decimal from = entry.ValueAsNumbers.First();
×
446
                                decimal to = entry.ValueAsNumbers.Last();
×
447
                                return number >= from && number <= to;
×
448
                            }
×
449
                            case CardsCondition.NotBetween:
×
450
                            {
×
451
                                if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
452
                                {
×
453
                                    throw new TrelloApiException("NotBetween Condition for Custom Field need 2 and only 2 Numbers");
×
454
                                }
×
455

×
456
                                decimal from = entry.ValueAsNumbers.First();
×
457
                                decimal to = entry.ValueAsNumbers.Last();
×
458
                                return number > to || number < from;
×
459
                            }
×
460
                            default:
×
461
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Number");
×
462
                        }
×
463
                    case CustomFieldType.Text:
×
464
                    default:
×
465
                        string textValue = customFieldItem?.Value.Text ?? string.Empty;
×
466
                        switch (entry.Condition)
×
467
                        {
×
468
                            case CardsCondition.Equal:
×
469
                                return textValue.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase);
×
470
                            case CardsCondition.NotEqual:
×
471
                                return textValue != entry.ValueAsString;
×
472
                            case CardsCondition.GreaterThan:
×
473
                                return textValue.Length > entry.ValueAsNumber;
×
474
                            case CardsCondition.LessThan:
×
475
                                return textValue.Length < entry.ValueAsNumber;
×
476
                            case CardsCondition.GreaterThanOrEqual:
×
477
                                return textValue.Length >= entry.ValueAsNumber;
×
478
                            case CardsCondition.LessThanOrEqual:
×
479
                                return textValue.Length <= entry.ValueAsNumber;
×
480
                            case CardsCondition.Contains:
×
481
                                return textValue.Contains(entry.ValueAsString);
×
482
                            case CardsCondition.DoNotContains:
×
483
                                return !textValue.Contains(entry.ValueAsString);
×
484
                            case CardsCondition.AnyOfThese:
×
485
                                return entry.ValueAsStrings?.Any(y => y.Equals(textValue, StringComparison.InvariantCultureIgnoreCase)) ?? false;
×
486
                            case CardsCondition.NoneOfThese:
×
487
                                return entry.ValueAsStrings?.All(y => y != textValue) ?? false;
×
488
                            case CardsCondition.RegEx:
×
489
                                return Regex.IsMatch(textValue, entry.ValueAsString, RegexOptions.IgnoreCase);
×
490
                            case CardsCondition.StartsWith:
×
491
                                return textValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
492
                            case CardsCondition.EndsWith:
×
493
                                return textValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
494
                            case CardsCondition.DoNotStartWith:
×
495
                                return !textValue.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
496
                            case CardsCondition.DoNotEndWith:
×
497
                                return !textValue.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase);
×
498
                            case CardsCondition.AllOfThese:
×
499
                            default:
×
500
                                throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a CustomField of Type Text");
×
501
                        }
×
502
                }
×
503
            });
×
504

505
            return cards;
×
506
        }
507

508
        private static IEnumerable<Card> FilterDueDate(IEnumerable<Card> cards, CardsFilterCondition entry)
509
        {
510
            switch (entry.Condition)
×
511
            {
512
                case CardsCondition.Equal:
513
                    return cards.Where(x => x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
×
514
                case CardsCondition.NotEqual:
515
                    return cards.Where(x => x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
×
516
                case CardsCondition.GreaterThan:
517
                    return cards.Where(x => x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
×
518
                case CardsCondition.LessThan:
519
                    return cards.Where(x => x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
×
520
                case CardsCondition.GreaterThanOrEqual:
521
                    return cards.Where(x => x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
×
522
                case CardsCondition.LessThanOrEqual:
523
                    return cards.Where(x => x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
×
524

525
                case CardsCondition.Between:
526
                {
527
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
528
                    {
529
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
530
                    }
531

532
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
533
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
534
                    cards = cards.Where(x => x.Due.HasValue && x.Due >= from);
×
535
                    cards = cards.Where(x => x.Due.HasValue && x.Due <= to);
×
536
                    return cards;
×
537
                }
538
                case CardsCondition.NotBetween:
539
                {
540
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
541
                    {
542
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
543
                    }
544

545
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
546
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
547
                    cards = cards.Where(x => x.Due.HasValue && x.Due > to || x.Due < from);
×
548
                    return cards;
×
549
                }
550

551
                case CardsCondition.HasAnyValue:
552
                    return cards.Where(x => x.Due.HasValue);
×
553
                case CardsCondition.DoNotHaveAnyValue:
554
                    return cards.Where(x => !x.Due.HasValue);
×
555
                case CardsCondition.AnyOfThese:
556
                    return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
×
557
                case CardsCondition.NoneOfThese:
558
                    return cards.Where(x => x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
×
559
                default:
560
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
561
            }
562
        }
563

564
        private static IEnumerable<Card> FilterDueDateNoDueComplete(IEnumerable<Card> cards, CardsFilterCondition entry)
565
        {
566
            switch (entry.Condition)
×
567
            {
568
                case CardsCondition.Equal:
569
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due == entry.ValueAsDateTimeOffset);
×
570
                case CardsCondition.NotEqual:
571
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due != entry.ValueAsDateTimeOffset);
×
572
                case CardsCondition.GreaterThan:
573
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > entry.ValueAsDateTimeOffset);
×
574
                case CardsCondition.LessThan:
575
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due < entry.ValueAsDateTimeOffset);
×
576
                case CardsCondition.GreaterThanOrEqual:
577
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= entry.ValueAsDateTimeOffset);
×
578
                case CardsCondition.LessThanOrEqual:
579
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= entry.ValueAsDateTimeOffset);
×
580

581
                case CardsCondition.Between:
582
                {
583
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
584
                    {
585
                        throw new TrelloApiException("Between Condition for Due Date need 2 and only 2 Dates");
×
586
                    }
587

588
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
589
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
590
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due >= from);
×
591
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due <= to);
×
592
                    return cards;
×
593
                }
594
                case CardsCondition.NotBetween:
595
                {
596
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
597
                    {
598
                        throw new TrelloApiException("NotBetween Condition for Due Date need 2 and only 2 Dates");
×
599
                    }
600

601
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
602
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
603
                    cards = cards.Where(x => !x.DueComplete && x.Due.HasValue && x.Due > to || x.Due < from);
×
604
                    return cards;
×
605
                }
606

607
                case CardsCondition.HasAnyValue:
608
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue);
×
609
                case CardsCondition.DoNotHaveAnyValue:
610
                    return cards.Where(x => !x.Due.HasValue);
×
611
                case CardsCondition.AnyOfThese:
612
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y == x.Due));
×
613
                case CardsCondition.NoneOfThese:
614
                    return cards.Where(x => !x.DueComplete && x.Due.HasValue && entry.ValueAsDateTimeOffsets.All(y => y != x.Due));
×
615
                default:
616
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterDueDate");
×
617
            }
618
        }
619

620
        private static IEnumerable<Card> FilterCreateDate(IEnumerable<Card> cards, CardsFilterCondition entry)
621
        {
622
            switch (entry.Condition)
×
623
            {
624
                case CardsCondition.Equal:
625
                    return cards.Where(x => x.Created.HasValue && x.Created == entry.ValueAsDateTimeOffset);
×
626
                case CardsCondition.NotEqual:
627
                    return cards.Where(x => x.Created.HasValue && x.Created != entry.ValueAsDateTimeOffset);
×
628
                case CardsCondition.GreaterThan:
629
                    return cards.Where(x => x.Created.HasValue && x.Created > entry.ValueAsDateTimeOffset);
×
630
                case CardsCondition.LessThan:
631
                    return cards.Where(x => x.Created.HasValue && x.Created < entry.ValueAsDateTimeOffset);
×
632
                case CardsCondition.GreaterThanOrEqual:
633
                    return cards.Where(x => x.Created.HasValue && x.Created >= entry.ValueAsDateTimeOffset);
×
634
                case CardsCondition.LessThanOrEqual:
635
                    return cards.Where(x => x.Created.HasValue && x.Created <= entry.ValueAsDateTimeOffset);
×
636
                case CardsCondition.Between:
637
                {
638
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
639
                    {
640
                        throw new TrelloApiException("Between Condition for Created Date need 2 and only 2 Dates");
×
641
                    }
642

643
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
644
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
645
                    cards = cards.Where(x => x.Created.HasValue && x.Created >= from);
×
646
                    cards = cards.Where(x => x.Created.HasValue && x.Created <= to);
×
647
                    return cards;
×
648
                }
649
                case CardsCondition.NotBetween:
650
                {
651
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
652
                    {
653
                        throw new TrelloApiException("NotBetween Condition for Created Date need 2 and only 2 Dates");
×
654
                    }
655

656
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
657
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
658
                    cards = cards.Where(x => x.Created.HasValue && x.Created > to || x.Created < from);
×
659
                    return cards;
×
660
                }
661
                case CardsCondition.AnyOfThese:
662
                    return cards.Where(x => entry.ValueAsDateTimeOffsets.Any(y => x.Created != null && y == x.Created.Value));
×
663
                case CardsCondition.NoneOfThese:
664
                    return cards.Where(x => entry.ValueAsDateTimeOffsets.All(y => x.Created != null && y != x.Created.Value));
×
665
                default:
666
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterCreateDate");
×
667
            }
668
        }
669

670
        private static IEnumerable<Card> FilterStartDate(IEnumerable<Card> cards, CardsFilterCondition entry)
671
        {
672
            switch (entry.Condition)
×
673
            {
674
                case CardsCondition.Equal:
675
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date == entry.ValueAsDateTimeOffset.Value.Date);
×
676
                case CardsCondition.NotEqual:
677
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date != entry.ValueAsDateTimeOffset.Value.Date);
×
678
                case CardsCondition.GreaterThan:
679
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date > entry.ValueAsDateTimeOffset.Value.Date);
×
680
                case CardsCondition.LessThan:
681
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date < entry.ValueAsDateTimeOffset.Value.Date);
×
682
                case CardsCondition.GreaterThanOrEqual:
683
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date >= entry.ValueAsDateTimeOffset.Value.Date);
×
684
                case CardsCondition.LessThanOrEqual:
685
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffset != null && x.Start.Value.Date <= entry.ValueAsDateTimeOffset.Value.Date);
×
686
                case CardsCondition.Between:
687
                {
688
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
689
                    {
690
                        throw new TrelloApiException("Between Condition for Start Date need 2 and only 2 Dates");
×
691
                    }
692

693
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
694
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
695
                    cards = cards.Where(x => x.Start.HasValue && x.Start >= from);
×
696
                    cards = cards.Where(x => x.Start.HasValue && x.Start <= to);
×
697
                    return cards;
×
698
                }
699
                case CardsCondition.NotBetween:
700
                {
701
                    if (entry.ValueAsDateTimeOffsets?.Count != 2)
×
702
                    {
703
                        throw new TrelloApiException("NotBetween Condition for Start Date need 2 and only 2 Dates");
×
704
                    }
705

706
                    DateTimeOffset from = entry.ValueAsDateTimeOffsets.First();
×
707
                    DateTimeOffset to = entry.ValueAsDateTimeOffsets.Last();
×
708
                    cards = cards.Where(x => x.Start.HasValue && x.Start > to || x.Start < from);
×
709
                    return cards;
×
710
                }
711
                case CardsCondition.HasAnyValue:
712
                    return cards.Where(x => x.Start.HasValue);
×
713
                case CardsCondition.DoNotHaveAnyValue:
714
                    return cards.Where(x => !x.Start.HasValue);
×
715
                case CardsCondition.AnyOfThese:
716
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.Any(y => y.Date == x.Start.Value.Date));
×
717
                case CardsCondition.NoneOfThese:
718
                    return cards.Where(x => x.Start.HasValue && entry.ValueAsDateTimeOffsets.All(y => y.Date != x.Start.Value.Date));
×
719
                default:
720
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a FilterStartDate");
×
721
            }
722
        }
723

724
        private static IEnumerable<Card> FilterListId(IEnumerable<Card> cards, CardsFilterCondition entry)
725
        {
726
            switch (entry.Condition)
10✔
727
            {
728
                case CardsCondition.AnyOfThese:
729
                case CardsCondition.Equal:
730
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
731
                    {
732
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y == x.ListId));
18✔
733
                    }
734

735
                    return cards.Where(x => x.ListId == entry.ValueAsString);
8✔
736
                case CardsCondition.NoneOfThese:
737
                case CardsCondition.NotEqual:
738
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
739
                    {
740
                        return cards.Where(x => entry.ValueAsStrings.All(y => y != x.ListId));
18✔
741
                    }
742

743
                    return cards.Where(x => x.ListId != entry.ValueAsString);
8✔
744
                default:
745
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a List Condition");
2✔
746
            }
747
        }
748

749
        private static IEnumerable<Card> FilterLabelId(IEnumerable<Card> cards, CardsFilterCondition entry)
750
        {
751
            switch (entry.Condition)
22!
752
            {
753
                case CardsCondition.AllOfThese:
754
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
755
                    {
756
                        return cards.Where(x => entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
8✔
757
                    }
758

759
                    return cards.Where(x => x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
760

761
                case CardsCondition.Equal:
762
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
763
                    {
764
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)));
6✔
765
                    }
766

767
                    if (entry.ValueAsNumber.HasValue)
3✔
768
                    {
769
                        return cards.Where(x => x.LabelIds.Count == entry.ValueAsNumber.Value);
8✔
770
                    }
771

772
                    return cards.Where(x => x.LabelIds.Count == 1 && x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
773

774
                case CardsCondition.AnyOfThese:
775
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
776
                    {
777
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
9✔
778
                    }
779

780
                    return cards.Where(x => x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
781

782
                case CardsCondition.NoneOfThese:
783
                case CardsCondition.NotEqual:
784
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
6✔
785
                    {
786
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.LabelIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
20✔
787
                    }
788

789
                    if (entry.ValueAsNumber.HasValue)
4✔
790
                    {
791
                        return cards.Where(x => x.LabelIds.Count != entry.ValueAsNumber.Value);
8✔
792
                    }
793

794
                    return cards.Where(x => !x.LabelIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
8✔
795
                case CardsCondition.DoNotHaveAnyValue:
796
                    return cards.Where(x => x.LabelIds.Count == 0);
4✔
797
                case CardsCondition.HasAnyValue:
798
                    return cards.Where(x => x.LabelIds.Count != 0);
4✔
799
                case CardsCondition.GreaterThan:
800
                    return cards.Where(x => x.LabelIds.Count > entry.ValueAsNumber);
4✔
801
                case CardsCondition.LessThan:
802
                    return cards.Where(x => x.LabelIds.Count < entry.ValueAsNumber);
4✔
803
                case CardsCondition.GreaterThanOrEqual:
804
                    return cards.Where(x => x.LabelIds.Count >= entry.ValueAsNumber);
4✔
805
                case CardsCondition.LessThanOrEqual:
806
                    return cards.Where(x => x.LabelIds.Count <= entry.ValueAsNumber);
4✔
807
                case CardsCondition.Between:
808
                {
809
                    if (entry.ValueAsNumbers?.Count != 2)
1!
810
                    {
811
                        throw new TrelloApiException("Between Condition for Labels need 2 and only 2 Numbers");
×
812
                    }
813

814
                    decimal from = entry.ValueAsNumbers.First();
1✔
815
                    decimal to = entry.ValueAsNumbers.Last();
1✔
816
                    cards = cards.Where(x => x.LabelIds.Count >= from);
4✔
817
                    cards = cards.Where(x => x.LabelIds.Count <= to);
3✔
818
                    return cards;
1✔
819
                }
820
                case CardsCondition.NotBetween:
821
                {
822
                    if (entry.ValueAsNumbers?.Count != 2)
1!
823
                    {
824
                        throw new TrelloApiException("NotBetween Condition for Labels need 2 and only 2 Numbers");
×
825
                    }
826

827
                    decimal from = entry.ValueAsNumbers.First();
1✔
828
                    decimal to = entry.ValueAsNumbers.Last();
1✔
829
                    cards = cards.Where(x => x.LabelIds.Count > to || x.LabelIds.Count < from);
4!
830
                    return cards;
1✔
831
                }
832
                default:
833
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Label Condition");
×
834
            }
835
        }
836

837
        private static IEnumerable<Card> FilterMemberId(IEnumerable<Card> cards, CardsFilterCondition entry)
838
        {
839
            switch (entry.Condition)
20!
840
            {
841
                case CardsCondition.AllOfThese:
842
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
843
                    {
844
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
9✔
845
                    }
846

847
                    return cards.Where(x => x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
848

849
                case CardsCondition.Equal:
850
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
851
                    {
852
                        return cards.Where(x => { return x.MemberIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
4!
853
                    }
854

855
                    if (entry.ValueAsNumber.HasValue)
2✔
856
                    {
857
                        return cards.Where(x => x.MemberIds.Count == entry.ValueAsNumber.Value);
4✔
858
                    }
859

860
                    return cards.Where(x => x.MemberIds.Count == 1 && x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
861

862
                case CardsCondition.AnyOfThese:
863

864
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
865
                    {
866
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
8✔
867
                    }
868

869
                    return cards.Where(x => x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
4✔
870

871
                case CardsCondition.NoneOfThese:
872
                case CardsCondition.NotEqual:
873
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
5✔
874
                    {
875
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.MemberIds.Contains(y, StringComparer.InvariantCultureIgnoreCase)); });
16✔
876
                    }
877

878
                    if (entry.ValueAsNumber.HasValue)
3✔
879
                    {
880
                        return cards.Where(x => x.MemberIds.Count != entry.ValueAsNumber.Value);
4✔
881
                    }
882

883
                    return cards.Where(x => !x.MemberIds.Contains(entry.ValueAsString, StringComparer.InvariantCultureIgnoreCase));
8✔
884

885
                case CardsCondition.DoNotHaveAnyValue:
886
                    return cards.Where(x => x.MemberIds.Count == 0);
4✔
887
                case CardsCondition.HasAnyValue:
888
                    return cards.Where(x => x.MemberIds.Count != 0);
4✔
889
                case CardsCondition.GreaterThan:
890
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
4✔
891
                case CardsCondition.LessThan:
892
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
4✔
893
                case CardsCondition.GreaterThanOrEqual:
894
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
4✔
895
                case CardsCondition.LessThanOrEqual:
896
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
4✔
897
                case CardsCondition.Between:
898
                {
899
                    if (entry.ValueAsNumbers?.Count != 2)
2!
900
                    {
901
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
902
                    }
903

904
                    decimal from = entry.ValueAsNumbers.First();
2✔
905
                    decimal to = entry.ValueAsNumbers.Last();
2✔
906
                    cards = cards.Where(x => x.MemberIds.Count >= from);
8✔
907
                    cards = cards.Where(x => x.MemberIds.Count <= to);
6✔
908
                    return cards;
2✔
909
                }
910
                case CardsCondition.NotBetween:
911
                {
912
                    if (entry.ValueAsNumbers?.Count != 2)
×
913
                    {
914
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
915
                    }
916

917
                    decimal from = entry.ValueAsNumbers.First();
×
918
                    decimal to = entry.ValueAsNumbers.Last();
×
919
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
920
                    return cards;
×
921
                }
922
                default:
923
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
924
            }
925
        }
926

927
        private static IEnumerable<Card> FilterMemberName(IEnumerable<Card> cards, CardsFilterCondition entry)
928
        {
929
            switch (entry.Condition)
24!
930
            {
931
                case CardsCondition.AllOfThese:
932
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
933
                    {
934
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
13✔
935
                    }
936

937
                    return cards.Where(x => x.Members.Any(y => y.FullName.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
938

939
                case CardsCondition.Equal:
940
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
941
                    {
942
                        return cards.Where(x => { return x.MemberIds.Count == entry.ValueAsStrings.Count && entry.ValueAsStrings.All(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
4!
943
                    }
944

945
                    return cards.Where(x => x.MemberIds.Count == 1 && x.Members.Any(z => z.FullName.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
946

947
                case CardsCondition.AnyOfThese:
948

949
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
950
                    {
951
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
10✔
952
                    }
953

954
                    return cards.Where(x => x.Members.Any(z => z.FullName.Equals(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
955

956
                case CardsCondition.NoneOfThese:
957
                case CardsCondition.NotEqual:
958
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
959
                    {
960
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => !x.Members.Any(z => z.FullName.Equals(y, StringComparison.InvariantCultureIgnoreCase))); });
20✔
961
                    }
962

963
                    return cards.Where(x => !x.Members.Any(z => z.FullName.Equals(entry.ValueAsString)));
12✔
964

965
                case CardsCondition.DoNotHaveAnyValue:
966
                    return cards.Where(x => x.MemberIds.Count == 0);
×
967
                case CardsCondition.HasAnyValue:
968
                    return cards.Where(x => x.MemberIds.Count != 0);
×
969
                case CardsCondition.GreaterThan:
970
                    return cards.Where(x => x.MemberIds.Count > entry.ValueAsNumber);
×
971
                case CardsCondition.LessThan:
972
                    return cards.Where(x => x.MemberIds.Count < entry.ValueAsNumber);
×
973
                case CardsCondition.GreaterThanOrEqual:
974
                    return cards.Where(x => x.MemberIds.Count >= entry.ValueAsNumber);
×
975
                case CardsCondition.LessThanOrEqual:
976
                    return cards.Where(x => x.MemberIds.Count <= entry.ValueAsNumber);
×
977
                case CardsCondition.Between:
978
                {
979
                    if (entry.ValueAsNumbers?.Count != 2)
×
980
                    {
981
                        throw new TrelloApiException("Between Condition for Members need 2 and only 2 Numbers");
×
982
                    }
983

984
                    decimal from = entry.ValueAsNumbers.First();
×
985
                    decimal to = entry.ValueAsNumbers.Last();
×
986
                    cards = cards.Where(x => x.MemberIds.Count >= from);
×
987
                    cards = cards.Where(x => x.MemberIds.Count <= to);
×
988
                    return cards;
×
989
                }
990
                case CardsCondition.NotBetween:
991
                {
992
                    if (entry.ValueAsNumbers?.Count != 2)
×
993
                    {
994
                        throw new TrelloApiException("NotBetween Condition for Members need 2 and only 2 Numbers");
×
995
                    }
996

997
                    decimal from = entry.ValueAsNumbers.First();
×
998
                    decimal to = entry.ValueAsNumbers.Last();
×
999
                    cards = cards.Where(x => x.MemberIds.Count > to || x.MemberIds.Count < from);
×
1000
                    return cards;
×
1001
                }
1002
                case CardsCondition.Contains:
1003
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1004
                    {
1005
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.Contains(y))); });
14✔
1006
                    }
1007

1008
                    return cards.Where(x => x.Members.Any(z => z.FullName.Contains(entry.ValueAsString)));
6✔
1009
                case CardsCondition.DoNotContains:
1010
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1011
                    {
1012
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.Contains(y))); });
14✔
1013
                    }
1014

1015
                    return cards.Where(x => x.Members.All(z => !z.FullName.Contains(entry.ValueAsString)));
6✔
1016
                case CardsCondition.RegEx:
1017
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1018
                    {
1019
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => Regex.IsMatch(z.FullName, y, RegexOptions.IgnoreCase))); });
14✔
1020
                    }
1021

1022
                    return cards.Where(x => x.Members.Any(z => Regex.IsMatch(z.FullName, entry.ValueAsString, RegexOptions.IgnoreCase)));
6✔
1023
                case CardsCondition.StartsWith:
1024
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1025
                    {
1026
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1027
                    }
1028

1029
                    return cards.Where(x => x.Members.Any(z => z.FullName.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1030
                case CardsCondition.DoNotStartWith:
1031
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1032
                    {
1033
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.StartsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1034
                    }
1035

1036
                    return cards.Where(x => x.Members.All(z => !z.FullName.StartsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1037
                case CardsCondition.EndsWith:
1038
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1039
                    {
1040
                        return cards.Where(x => { return entry.ValueAsStrings.Any(y => x.Members.Any(z => z.FullName.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1041
                    }
1042

1043
                    return cards.Where(x => x.Members.Any(z => z.FullName.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1044
                case CardsCondition.DoNotEndWith:
1045
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1046
                    {
1047
                        return cards.Where(x => { return entry.ValueAsStrings.All(y => x.Members.All(z => !z.FullName.EndsWith(y, StringComparison.InvariantCultureIgnoreCase))); });
14✔
1048
                    }
1049

1050
                    return cards.Where(x => x.Members.All(z => !z.FullName.EndsWith(entry.ValueAsString, StringComparison.InvariantCultureIgnoreCase)));
6✔
1051
                default:
1052
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Member Condition");
×
1053
            }
1054
        }
1055

1056
        private static IEnumerable<Card> FilterName(IEnumerable<Card> cards, CardsFilterCondition entry)
1057
        {
1058
            switch (entry.Condition)
24!
1059
            {
1060
                case CardsCondition.Equal:
1061
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1062
                    {
1063
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
4✔
1064
                    }
1065

1066
                    if (entry.ValueAsString != null)
1!
1067
                    {
1068
                        return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
4✔
1069
                    }
1070

1071
                    if (entry.ValueAsNumber.HasValue)
×
1072
                    {
1073
                        return cards.Where(x => x.Name?.Length == entry.ValueAsNumber);
×
1074
                    }
1075

1076
                    break;
1077
                case CardsCondition.NotEqual:
1078
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1079
                    {
1080
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
4✔
1081
                    }
1082

1083
                    if (entry.ValueAsString != null)
1!
1084
                    {
1085
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Name));
4✔
1086
                    }
1087

1088
                    if (entry.ValueAsNumber.HasValue)
×
1089
                    {
1090
                        return cards.Where(x => x.Name?.Length != entry.ValueAsNumber);
×
1091
                    }
1092

1093
                    break;
1094
                case CardsCondition.GreaterThan:
1095
                    //Assume this means length of name
1096
                    if (entry.ValueAsNumber.HasValue)
×
1097
                    {
1098
                        return cards.Where(x => x.Name?.Length > entry.ValueAsNumber);
×
1099
                    }
1100

1101
                    break;
1102
                case CardsCondition.LessThan:
1103
                    //Assume this means length of name
1104
                    if (entry.ValueAsNumber.HasValue)
×
1105
                    {
1106
                        cards = cards.Where(x => x.Name?.Length < entry.ValueAsNumber);
×
1107
                    }
1108

1109
                    break;
×
1110
                case CardsCondition.GreaterThanOrEqual:
1111
                    //Assume this means length of name
1112
                    if (entry.ValueAsNumber.HasValue)
×
1113
                    {
1114
                        cards = cards.Where(x => x.Name?.Length >= entry.ValueAsNumber);
×
1115
                    }
1116

1117
                    break;
×
1118
                case CardsCondition.LessThanOrEqual:
1119
                    //Assume this means length of name
1120
                    if (entry.ValueAsNumber.HasValue)
×
1121
                    {
1122
                        cards = cards.Where(x => x.Name?.Length <= entry.ValueAsNumber);
×
1123
                    }
1124

1125
                    break;
×
1126
                case CardsCondition.HasAnyValue:
1127
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Name));
×
1128
                case CardsCondition.DoNotHaveAnyValue:
1129
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Name));
×
1130
                case CardsCondition.Contains:
1131
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1132
                    {
1133
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.Contains(y)));
9✔
1134
                    }
1135

1136
                    return cards.Where(x => x.Name.Contains(entry.ValueAsString));
4✔
1137

1138
                case CardsCondition.DoNotContains:
1139
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1140
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1141
                    {
1142
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Name.Contains(y)));
8✔
1143
                    }
1144

1145
                    return cards.Where(x => !x.Name.Contains(entry.ValueAsString));
4✔
1146

1147
                case CardsCondition.AnyOfThese:
1148
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
1149
                    {
1150
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Name)));
18✔
1151
                    }
1152

1153
                    return cards.Where(x => entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
8✔
1154

1155
                case CardsCondition.NoneOfThese:
1156
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1157
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1158
                    {
1159
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Name, StringComparer.InvariantCultureIgnoreCase));
4✔
1160
                    }
1161

1162
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Name, StringComparison.CurrentCultureIgnoreCase));
4✔
1163

1164
                case CardsCondition.RegEx:
1165
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1166
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1167
                    {
1168
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Name, y, RegexOptions.IgnoreCase)));
18✔
1169
                    }
1170

1171
                    return cards.Where(x => Regex.IsMatch(x.Name, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
1172

1173
                case CardsCondition.StartsWith:
1174
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1175
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1176
                    {
1177
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1178
                    }
1179

1180
                    return cards.Where(x => x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1181

1182
                case CardsCondition.EndsWith:
1183
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1184
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1185
                    {
1186
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1187
                    }
1188

1189
                    return cards.Where(x => x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1190

1191
                case CardsCondition.DoNotStartWith:
1192
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1193
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1194
                    {
1195
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
7✔
1196
                    }
1197

1198
                    return cards.Where(x => !x.Name.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1199

1200
                case CardsCondition.DoNotEndWith:
1201
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1202
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1203
                    {
1204
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Name.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1205
                    }
1206

1207
                    return cards.Where(x => !x.Name.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1208

1209
                default:
1210
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Name Condition");
×
1211
            }
1212

1213
            return cards;
×
1214
        }
1215

1216
        private static IEnumerable<Card> FilterDescription(IEnumerable<Card> cards, CardsFilterCondition entry)
1217
        {
1218
            switch (entry.Condition)
26!
1219
            {
1220
                case CardsCondition.Equal:
1221
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1222
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1223
                    {
1224
                        return cards.Where(x => entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
4✔
1225
                    }
1226
                    else if (entry.ValueAsString != null)
2✔
1227
                    {
1228
                        return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
4✔
1229
                    }
1230
                    else if (entry.ValueAsNumber.HasValue)
1!
1231
                    {
1232
                        return cards.Where(x => x.Description.Length == entry.ValueAsNumber);
4✔
1233
                    }
1234

1235
                    break;
1236
                case CardsCondition.NotEqual:
1237
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1238
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1239
                    {
1240
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
4✔
1241
                    }
1242
                    else if (entry.ValueAsString != null)
2✔
1243
                    {
1244
                        return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
4✔
1245
                    }
1246
                    else if (entry.ValueAsNumber.HasValue)
1!
1247
                    {
1248
                        return cards.Where(x => x.Description.Length != entry.ValueAsNumber);
4✔
1249
                    }
1250

1251
                    break;
1252
                case CardsCondition.GreaterThan:
1253
                    //Assume this means length of Description
1254
                    if (entry.ValueAsNumber.HasValue)
×
1255
                    {
1256
                        return cards.Where(x => x.Description.Length > entry.ValueAsNumber);
×
1257
                    }
1258

1259
                    break;
1260
                case CardsCondition.LessThan:
1261
                    //Assume this means length of Description
1262
                    if (entry.ValueAsNumber.HasValue)
×
1263
                    {
1264
                        return cards.Where(x => x.Description.Length < entry.ValueAsNumber);
×
1265
                    }
1266

1267
                    break;
1268
                case CardsCondition.GreaterThanOrEqual:
1269
                    //Assume this means length of Description
1270
                    if (entry.ValueAsNumber.HasValue)
×
1271
                    {
1272
                        return cards.Where(x => x.Description.Length >= entry.ValueAsNumber);
×
1273
                    }
1274

1275
                    break;
1276
                case CardsCondition.LessThanOrEqual:
1277
                    //Assume this means length of Description
1278
                    if (entry.ValueAsNumber.HasValue)
×
1279
                    {
1280
                        return cards.Where(x => x.Description.Length <= entry.ValueAsNumber);
×
1281
                    }
1282

1283
                    break;
1284
                case CardsCondition.HasAnyValue:
1285
                    return cards.Where(x => !string.IsNullOrWhiteSpace(x.Description));
×
1286
                case CardsCondition.DoNotHaveAnyValue:
1287
                    return cards.Where(x => string.IsNullOrWhiteSpace(x.Description));
×
1288
                case CardsCondition.Contains:
1289
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1290
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1291
                    {
1292
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.Contains(y)));
9✔
1293
                    }
1294

1295
                    return cards.Where(x => x.Description.Contains(entry.ValueAsString));
4✔
1296

1297
                case CardsCondition.DoNotContains:
1298
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1299
                    {
1300
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.Contains(y)));
8✔
1301
                    }
1302

1303
                    return cards.Where(x => !x.Description.Contains(entry.ValueAsString));
4✔
1304

1305
                case CardsCondition.AnyOfThese:
1306
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1307
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
4✔
1308
                    {
1309
                        return cards.Where(x => entry.ValueAsStrings.Any(y => y.Contains(x.Description)));
18✔
1310
                    }
1311

1312
                    return cards.Where(x => entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
8✔
1313

1314
                case CardsCondition.AllOfThese:
1315
                {
1316
                    throw new TrelloApiException("AllOfThese on Description Filter does not make sense");
×
1317
                }
1318
                case CardsCondition.NoneOfThese:
1319
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1320
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1321
                    {
1322
                        return cards.Where(x => !entry.ValueAsStrings.Contains(x.Description, StringComparer.InvariantCultureIgnoreCase));
4✔
1323
                    }
1324

1325
                    return cards.Where(x => !entry.ValueAsString.Equals(x.Description, StringComparison.CurrentCultureIgnoreCase));
4✔
1326

1327
                case CardsCondition.RegEx:
1328
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1329
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
3✔
1330
                    {
1331
                        return cards.Where(x => entry.ValueAsStrings.All(y => Regex.IsMatch(x.Description, y, RegexOptions.IgnoreCase)));
18✔
1332
                    }
1333

1334
                    return cards.Where(x => Regex.IsMatch(x.Description, entry.ValueAsString, RegexOptions.IgnoreCase));
4✔
1335

1336
                case CardsCondition.StartsWith:
1337
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1338
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
1!
1339
                    {
1340
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
×
1341
                    }
1342

1343
                    return cards.Where(x => x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1344

1345
                case CardsCondition.EndsWith:
1346
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1347
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1348
                    {
1349
                        return cards.Where(x => entry.ValueAsStrings.Any(y => x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1350
                    }
1351

1352
                    return cards.Where(x => x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1353

1354
                case CardsCondition.DoNotStartWith:
1355
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1356
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1357
                    {
1358
                        return cards.Where(x => entry.ValueAsStrings.Any(y => !x.Description.StartsWith(y, StringComparison.InvariantCultureIgnoreCase)));
10✔
1359
                    }
1360

1361
                    return cards.Where(x => !x.Description.StartsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1362

1363
                case CardsCondition.DoNotEndWith:
1364
                    // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
1365
                    if (entry.ValueAsStrings != null && entry.ValueAsStrings.Count != 0)
2✔
1366
                    {
1367
                        return cards.Where(x => entry.ValueAsStrings.All(y => !x.Description.EndsWith(y, StringComparison.InvariantCultureIgnoreCase)));
9✔
1368
                    }
1369

1370
                    return cards.Where(x => !x.Description.EndsWith(entry.ValueAsString, StringComparison.CurrentCultureIgnoreCase));
4✔
1371

1372
                default:
1373
                    throw new TrelloApiException($"Condition '{entry.Condition}' does not make sense to apply to a Description Condition");
×
1374
            }
1375

1376
            return cards;
×
1377
        }
1378
    }
1379
}
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