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

AndreuCodina / CrossValidation / 5039199915

pending completion
5039199915

Pull #26

github

GitHub
Merge 4f0503a9d into 3204cbf5a
Pull Request #26: Real async

359 of 390 branches covered (92.05%)

Branch coverage included in aggregate %.

566 of 566 new or added lines in 12 files covered. (100.0%)

1080 of 1136 relevant lines covered (95.07%)

202.55 hits per line

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

98.32
/src/CrossValidation/Validations/ValidationExtensions.cs
1
using System.Diagnostics.CodeAnalysis;
2
using System.Numerics;
3
using CrossValidation.Validators;
4
using CrossValidation.Validators.LengthValidators;
5

6
namespace CrossValidation.Validations;
7

8
public static class ValidationExtensions
9
{
10
    public static IValidation<TField> NotNull<TField>(
11
        this IValidation<TField?> validation)
12
        where TField : class
13
    {
14

15
        return validation.SetValidator(() => new NotNullValidator<TField?>(validation.GetFieldValue()))
71✔
16
            .Transform(x => x!);
54✔
17
    }
18

19
    public static IValidation<TField> NotNull<TField>(
20
        this IValidation<TField?> validation)
21
        where TField : struct
22
    {
23
        return validation.SetValidator(() => new NotNullValidator<TField?>(validation.GetFieldValue()))
48✔
24
            .Transform(x => x!.Value);
28✔
25
    }
26

27
    public static IValidation<TField?> WhenNotNull<TField, TReturnedField>(
28
        this IValidation<TField?> validation,
29
        Func<IValidation<TField>, IValidation<TReturnedField>> action)
30
        where TField : struct
31
    {
32
        validation.Condition = () => validation.GetFieldValue() is not null;
59✔
33
        return validation.SetScope(() =>
32✔
34
        {
32✔
35
            validation.IsScopeCreator = true;
23✔
36
            var getFieldValue = () => validation.GetFieldValue()!.Value;
77✔
37
            var scopeValidation = CreateScopeValidation(
23✔
38
                validation: validation,
23✔
39
                getFieldValue: getFieldValue,
23✔
40
                index: validation.Index);
23✔
41
            action(scopeValidation);
23✔
42
        }, ScopeType.WhenNotNull);
52✔
43
    }
44

45
    public static IValidation<TField?> WhenNotNull<TField, TReturnedField>(
46
        this IValidation<TField?> validation,
47
        Func<IValidation<TField>, IValidation<TReturnedField>> action)
48
        where TField : class
49
    {
50
        validation.Condition = () => validation.GetFieldValue() is not null;
26✔
51
        return validation.SetScope(() =>
13✔
52
        {
13✔
53
            validation.IsScopeCreator = true;
11✔
54
            var getFieldValue = () => validation.GetFieldValue()!;
40✔
55
            var scopeValidation = CreateScopeValidation(
11✔
56
                validation: validation,
11✔
57
                getFieldValue: getFieldValue,
11✔
58
                index: validation.Index);
11✔
59
            action(scopeValidation);
11✔
60
        }, ScopeType.WhenNotNull);
23✔
61
    }
62

63
    public static IValidation<TField?> Null<TField>(
64
        this IValidation<TField?> validation)
65
        where TField : class
66
    {
67
        return validation.SetValidator(() => new NullValidator<TField?>(validation.GetFieldValue()));
16✔
68
    }
69

70
    public static IValidation<TField?> Null<TField>(
71
        this IValidation<TField?> validation)
72
        where TField : struct
73
    {
74
        return validation.SetValidator(() => new NullValidator<TField?>(validation.GetFieldValue()));
6✔
75
    }
76

77
    public static IValidation<TField> GreaterThan<TField>(
78
        this IValidation<TField> validation,
79
        TField valueToCompare)
80
        where TField : IComparisonOperators<TField, TField, bool>
81
    {
82
        return validation.SetValidator(() =>
114✔
83
            new GreaterThanValidator<TField>(validation.GetFieldValue(), valueToCompare));
219✔
84
    }
85

86
    public static IValidation<TField> Enum<TField>(
87
        this IValidation<TField> validation)
88
        where TField : Enum
89
    {
90
        return validation.SetValidator(() => new EnumValidator<TField>(validation.GetFieldValue(), typeof(TField)));
4✔
91
    }
92

93
    public static IValidation<TEnum> Enum<TEnum>(
94
        this IValidation<int> validation)
95
        where TEnum : Enum
96
    {
97
        return validation.SetValidator(() => new EnumValidator<int>(validation.GetFieldValue(), typeof(TEnum)))
4✔
98
            .Transform(x => (TEnum)(object)x);
2✔
99
    }
100

101
    public static IValidation<TEnum> Enum<TEnum>(
102
        this IValidation<string> validation)
103
        where TEnum : Enum
104
    {
105
        return validation.SetValidator(() => new EnumValidator<string>(validation.GetFieldValue(), typeof(TEnum)))
6✔
106
            .Transform(x => (TEnum)System.Enum.Parse(typeof(TEnum), x, ignoreCase: true));
4✔
107
    }
108

109
    public static IValidation<TField> Enum<TField>(
110
        this IValidation<TField> validation,
111
        params TField[] allowedValues)
112
        where TField : Enum
113
    {
114
        return validation.SetValidator(() =>
3✔
115
            new EnumRangeValidator<TField, TField>(validation.GetFieldValue(), allowedValues));
6✔
116
    }
117

118
    public static IValidation<TEnum> Enum<TEnum>(
119
        this IValidation<int> validation,
120
        params TEnum[] allowedValues)
121
        where TEnum : Enum
122
    {
123
        return validation
2✔
124
            .SetValidator(() => new EnumRangeValidator<int, TEnum>(validation.GetFieldValue(), allowedValues))
2✔
125
            .Transform(x => (TEnum)(object)x);
2✔
126
    }
127

128
    public static IValidation<TEnum> Enum<TEnum>(
129
        this IValidation<string> validation,
130
        params TEnum[] allowedValues)
131
        where TEnum : Enum
132
    {
133
        return validation.SetValidator(
2✔
134
                () => new EnumRangeValidator<string, TEnum>(validation.GetFieldValue(), allowedValues))
2✔
135
            .Transform(x => (TEnum)System.Enum.Parse(typeof(TEnum), x, ignoreCase: true));
2✔
136
    }
137

138
    public static IValidation<string> LengthRange(
139
        this IValidation<string> validation,
140
        int minimum,
141
        int maximum)
142
    {
143
        return validation.SetValidator(() => new LengthRangeValidator(validation.GetFieldValue(), minimum, maximum));
5✔
144
    }
145

146
    public static IValidation<string> MinimumLength(
147
        this IValidation<string> validation,
148
        int minimum)
149
    {
150
        return validation.SetValidator(() => new MinimumLengthValidator(validation.GetFieldValue(), minimum));
2✔
151
    }
152

153
    public static IValidation<IEnumerable<TInnerType>> ForEach<TInnerType, TReturnedField>(
154
        this IValidation<IEnumerable<TInnerType>> validation,
155
        Func<IValidation<TInnerType>, IValidation<TReturnedField>> action)
156
    {
157
        return validation.SetScope(() =>
38✔
158
        {
38✔
159
            validation.IsScopeCreator = true;
37✔
160
            var fieldCollection = validation.GetFieldValue()
37✔
161
                .ToList();
37✔
162
            var index = 0;
37✔
163
            var totalItems = fieldCollection.Count();
37✔
164

38✔
165
            foreach (var innerField in fieldCollection)
199!
166
            {
38✔
167
                var getFieldValue = () => innerField;
252✔
168
                var scopeValidation = CreateScopeValidation(validation, getFieldValue, index);
81✔
169
                scopeValidation.HasFailed = false;
81✔
170
                action(scopeValidation);
81✔
171
                index++;
70✔
172
                var areAllItemsIterated = index  == totalItems;
70✔
173
                var stopWithFailedScope =
70✔
174
                    validation.HasFailed
70✔
175
                    && validation.Context!.ValidationMode is ValidationMode.AccumulateFirstErrors;
70✔
176
            
38✔
177
                if (areAllItemsIterated || stopWithFailedScope)
70✔
178
                {
38✔
179
                    validation.HasBeenExecuted = true;
26✔
180
                    break;
26✔
181
                }
38✔
182
            }
38✔
183
        }, ScopeType.ForEach);
64✔
184
    }
185

186
    public static IValidation<string> Regex(
187
        this IValidation<string> validation,
188
        [StringSyntax(StringSyntaxAttribute.Regex)]
189
        string pattern)
190
    {
191
        return validation.SetValidator(() => new RegularExpressionValidator(validation.GetFieldValue(), pattern));
×
192
    }
193

194
    public static IValidation<TDependentField> CreateScopeValidation<TField, TDependentField>(
195
        this IValidation<TField> validation,
196
        Func<TDependentField> getFieldValue,
197
        int? index)
198
    {
199
        var scopeValidation = new Validation<TDependentField>(
218✔
200
            getFieldValue: getFieldValue,
218✔
201
            crossErrorToException: validation.CrossErrorToException,
218✔
202
            generalizeError: validation.GeneralizeError,
218✔
203
            fieldFullPath: validation.FieldFullPath,
218✔
204
            context: validation.Context,
218✔
205
            index: index,
218✔
206
            parentPath: validation.ParentPath,
218✔
207
            fixedError: validation.Context!.Error,
218✔
208
            fixedMessage: validation.Context!.Message,
218✔
209
            fixedCode: validation.Context!.Code,
218✔
210
            fixedDetails: validation.Context!.Details,
218✔
211
            fixedHttpStatusCode: validation.Context!.HttpStatusCode,
218✔
212
            fixedFieldDisplayName: validation.Context!.FieldDisplayName);
218✔
213
        scopeValidation.HasFailed = validation.HasFailed;
218✔
214
        scopeValidation.HasPendingAsyncValidation = validation.HasPendingAsyncValidation;
218✔
215
        scopeValidation.ScopeType = validation.ScopeType;
218✔
216
        scopeValidation.IsInsideScope = true;
218✔
217
        scopeValidation.ScopeCreatorValidation = validation;
218✔
218
        validation.ScopeValidations ??= new();
218✔
219
        validation.ScopeValidations.Add(scopeValidation);
218✔
220
        return scopeValidation;
218✔
221
    }
222
}
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