From 212646c58e915055091ac927d39b15ad6cb6b4db Mon Sep 17 00:00:00 2001 From: Kelby Hunt Date: Tue, 17 Dec 2019 10:52:14 -0800 Subject: [PATCH 1/2] Slight improvement on the regular expression for valid emails and more emails to test --- .../zzzRegexPattern/String.IsValidEmail.cs | 2 +- .../System.String/String.IsValidEmail.cs | 68 +++++++++++++++---- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/Z.Core/System.String/zzzRegexPattern/String.IsValidEmail.cs b/src/Z.Core/System.String/zzzRegexPattern/String.IsValidEmail.cs index f223fbd1..923a80f6 100644 --- a/src/Z.Core/System.String/zzzRegexPattern/String.IsValidEmail.cs +++ b/src/Z.Core/System.String/zzzRegexPattern/String.IsValidEmail.cs @@ -15,6 +15,6 @@ public static partial class Extensions /// true if valid email, false if not. public static bool IsValidEmail(this string obj) { - return Regex.IsMatch(obj, @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z0-9]{1,30})(\]?)$"); + return Regex.IsMatch(obj, @"^\w+([-+.']\w+)*@(\[*\w+)([-.]\w+)*\.\w+([-.]\w+\])*$"); } } \ No newline at end of file diff --git a/test/Z.Core.Test/System.String/String.IsValidEmail.cs b/test/Z.Core.Test/System.String/String.IsValidEmail.cs index 12452380..6834483a 100644 --- a/test/Z.Core.Test/System.String/String.IsValidEmail.cs +++ b/test/Z.Core.Test/System.String/String.IsValidEmail.cs @@ -4,7 +4,7 @@ // License (MIT): https://github.com/zzzprojects/Z.ExtensionMethods/blob/master/LICENSE // More projects: https://zzzprojects.com/ // Copyright © ZZZ Projects Inc. All rights reserved. -using System; + using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Z.Core.Test @@ -15,26 +15,68 @@ public class System_String_IsValidEmail [TestMethod] public void IsValidEmail() { + // Valid Emails { - // Type - string @this = "test@hotmail.com"; + // Arrange + var validEmails = new[] + { + "email@example.com", + "firstname.lastname@example.com", + "email@subdomain.example.com", + "firstname+lastname@example.com", + "email@123.123.123.123", + "email@[123.123.123.123]", + "1234567890@example.com", + "email@example-one.com", + "_______@example.com", + "email@example.name", + "email@example.museum", + "email@example.co.jp", + "firstname-lastname@example.com" + }; - // Exemples - var result = @this.IsValidEmail(); // return true; + // Act + foreach (var validEmail in validEmails) + { + // Act + var result = validEmail.IsValidEmail(); - // Unit Test - Assert.IsTrue(result); + // Assert + Assert.IsTrue(result); + } } + // Invalid Emails { - // Type - string @this = "mike@GOTBLOG.ONLINE"; + // Arrange + var invalidEmails = new[] + { + "plainaddress", + "#@%^%#$@#$@#.com", + "@example.com", + "Joe Smith ", + "email.example.com", + "email@example@example.com", + ".email@example.com", + "email.@example.com", + "email..email@example.com", + "email@example.com (Joe Smith)", + "email@example", + "email@-example.com", + //"email@example.web", // Should not be valid, not a top level domain, how should we handle this outside regex? Lookup dictionary of all valid top level domains? + "email@example..com", + "Abc..123@example.com" + }; - // Exemples - var result = @this.IsValidEmail(); // return true; + // Act + foreach (var validEmail in invalidEmails) + { + // Act + var result = validEmail.IsValidEmail(); - // Unit Test - Assert.IsTrue(result); + // Assert + Assert.IsFalse(result); + } } } } From 37cc0a39e701345b58fcd79587af40ea1feaf6dc Mon Sep 17 00:00:00 2001 From: Kelby Hunt Date: Sat, 21 Dec 2019 09:15:26 -0800 Subject: [PATCH 2/2] zzzprojects/Z.ExtensionMethods#28 - Copy paste in test methods is bad, nitpicking on foreach variable names --- test/Z.Core.Test/System.String/String.IsValidEmail.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/Z.Core.Test/System.String/String.IsValidEmail.cs b/test/Z.Core.Test/System.String/String.IsValidEmail.cs index 6834483a..a9a8fe81 100644 --- a/test/Z.Core.Test/System.String/String.IsValidEmail.cs +++ b/test/Z.Core.Test/System.String/String.IsValidEmail.cs @@ -4,7 +4,6 @@ // License (MIT): https://github.com/zzzprojects/Z.ExtensionMethods/blob/master/LICENSE // More projects: https://zzzprojects.com/ // Copyright © ZZZ Projects Inc. All rights reserved. - using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Z.Core.Test @@ -36,10 +35,10 @@ public void IsValidEmail() }; // Act - foreach (var validEmail in validEmails) + foreach (var email in validEmails) { // Act - var result = validEmail.IsValidEmail(); + var result = email.IsValidEmail(); // Assert Assert.IsTrue(result); @@ -63,16 +62,16 @@ public void IsValidEmail() "email@example.com (Joe Smith)", "email@example", "email@-example.com", - //"email@example.web", // Should not be valid, not a top level domain, how should we handle this outside regex? Lookup dictionary of all valid top level domains? + //"email@example.web", // Should not be valid, not a top level domain, how should we handle this outside regex? Lookup dictionary of all valid top level domains? https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains "email@example..com", "Abc..123@example.com" }; // Act - foreach (var validEmail in invalidEmails) + foreach (var email in invalidEmails) { // Act - var result = validEmail.IsValidEmail(); + var result = email.IsValidEmail(); // Assert Assert.IsFalse(result);