diff --git a/packages/genui/lib/src/catalog/basic_functions.dart b/packages/genui/lib/src/catalog/basic_functions.dart index be27861cc..2971bca8d 100644 --- a/packages/genui/lib/src/catalog/basic_functions.dart +++ b/packages/genui/lib/src/catalog/basic_functions.dart @@ -309,7 +309,7 @@ class EmailFunction extends SynchronousClientFunction { Object? executeSync(JsonMap args, ExecutionContext _) { final Object? value = args['value']; if (value is! String) return false; - final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+\$'); + final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+$'); return emailRegex.hasMatch(value); } } diff --git a/packages/genui/test/catalog/basic_functions_test.dart b/packages/genui/test/catalog/basic_functions_test.dart index 3410d947b..9b9aed45c 100644 --- a/packages/genui/test/catalog/basic_functions_test.dart +++ b/packages/genui/test/catalog/basic_functions_test.dart @@ -72,6 +72,29 @@ void main() { expect(await run(func, {'value': null}), 0); }); + test('email', () async { + final EmailFunction func = BasicFunctions.emailFunction; + + // Valid emails (Gmail) + expect(await run(func, {'value': 'zhangsan@gmail.com'}), isTrue); + expect(await run(func, {'value': 'a@gmail.c'}), isTrue); + expect(await run(func, {'value': 'first.last@gmail.com'}), isTrue); + expect(await run(func, {'value': 'user+tag@gmail.com'}), isTrue); + + // Invalid emails + expect(await run(func, {'value': ''}), isFalse); + expect(await run(func, {'value': 'plainaddress'}), isFalse); + expect(await run(func, {'value': '@gmail.com'}), isFalse); + expect(await run(func, {'value': 'no-domain@'}), isFalse); + expect(await run(func, {'value': 'no-tld@gmail'}), isFalse); + expect(await run(func, {'value': 'a@gmail@gmail.com'}), isFalse); + + // Non-string values return false + expect(await run(func, {'value': null}), isFalse); + expect(await run(func, {'value': 123}), isFalse); + expect(await run(func, {}), isFalse); + }); + test('and', () async { final AndFunction func = BasicFunctions.andFunction; expect(