Skip to content

Commit f6feb9f

Browse files
Implement contains element validator
1 parent 537294e commit f6feb9f

10 files changed

+60
-3
lines changed

lib/new_api_prototype/generic_type_validators.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
import '../localization/l10n.dart';
22
import 'constants.dart';
33

4-
Validator<T> containsElement<T extends Object>(
4+
/// Returns a [Validator] function that checks whether its input is in the
5+
/// provided list `values`. If the input is valid, the validator returns `null`,
6+
/// otherwise, it returns `containsElementMsg`, if provided, or
7+
/// `FormBuilderLocalizations.current.containsElementErrorText`.
8+
///
9+
/// # Errors
10+
/// - Throws an [AssertionError] if the input `values` is an empty list.
11+
Validator<T> containsElement<T extends Object?>(
512
List<T> values, {
613
String? containsElementMsg,
714
}) {
15+
assert(values.isNotEmpty, 'The list "values" may not be empty.');
16+
final Set<T> setOfValues = values.toSet();
817
return (T value) {
9-
return values.contains(value)
18+
return setOfValues.contains(value)
1019
? null
1120
: containsElementMsg ??
1221
FormBuilderLocalizations.current.containsElementErrorText;

lib/new_api_prototype/new_api_prototype.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
export 'collection_validators.dart';
12
export 'composition_validators.dart';
23
export 'constants.dart';
34
export 'generic_type_validators.dart';

lib/new_api_prototype/string_validators.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import '../localization/l10n.dart';
2+
import 'collection_validators.dart';
23
import 'composition_validators.dart';
34
import 'constants.dart';
4-
import 'generic_type_validators.dart';
55
import 'override_error_msg.dart';
66

77
const _minL = minLength;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:form_builder_validators/form_builder_validators.dart';
3+
4+
void main() {
5+
group('Validator: containsElement', () {
6+
group('Validations with default error message', () {
7+
test('Should return null when int 0 is provided', () {
8+
final Validator<int> validator = containsElement(<int>[0]);
9+
10+
expect(validator(0), isNull);
11+
expect(validator(2),
12+
equals(FormBuilderLocalizations.current.containsElementErrorText));
13+
});
14+
test('Should return null when int 0 or String "2" is provided', () {
15+
final Validator<Object> validator = containsElement(<Object>[0, '2']);
16+
17+
expect(validator(0), isNull);
18+
expect(validator('2'), isNull);
19+
expect(validator(2),
20+
equals(FormBuilderLocalizations.current.containsElementErrorText));
21+
});
22+
test('Should return null when int 0, int 2, or null is provided', () {
23+
final Validator<Object?> validator =
24+
containsElement(<Object?>[0, 2, null]);
25+
26+
expect(validator(0), isNull);
27+
expect(validator(2), isNull);
28+
expect(validator(null), isNull);
29+
expect(validator('2'),
30+
equals(FormBuilderLocalizations.current.containsElementErrorText));
31+
});
32+
});
33+
34+
test('Should throw assertionError when list input is empty', () {
35+
expect(() => containsElement([]), throwsAssertionError);
36+
});
37+
38+
test('Should return custom error message when invalid input is provided',
39+
() {
40+
const customMessage = 'custom message';
41+
final validator =
42+
containsElement([1, 2, 3], containsElementMsg: customMessage);
43+
44+
expect(validator(4), equals(customMessage));
45+
});
46+
});
47+
}

test/new_api_testing/bool/has_min_lowercase_chars_validator_test.dart renamed to test/new_api_testing/string_validators/has_min_lowercase_chars_validator_test.dart

File renamed without changes.

test/new_api_testing/bool/has_min_numeric_chars_validator_test.dart renamed to test/new_api_testing/string_validators/has_min_numeric_chars_validator_test.dart

File renamed without changes.

test/new_api_testing/bool/has_min_special_chars_validator_test.dart renamed to test/new_api_testing/string_validators/has_min_special_chars_validator_test.dart

File renamed without changes.

test/new_api_testing/bool/has_min_uppercase_chars_validator_test.dart renamed to test/new_api_testing/string_validators/has_min_uppercase_chars_validator_test.dart

File renamed without changes.

test/new_api_testing/bool/is_false_validator_test.dart renamed to test/new_api_testing/string_validators/is_false_validator_test.dart

File renamed without changes.

test/new_api_testing/bool/is_true_validator_test.dart renamed to test/new_api_testing/string_validators/is_true_validator_test.dart

File renamed without changes.

0 commit comments

Comments
 (0)