1- using FluentAssertions ;
1+ using System ;
2+ using FluentAssertions ;
23using Xunit ;
34
45namespace Light . GuardClauses . Tests . StringAssertions ;
56
67public sealed class IsEmailAddressTests
78{
9+ public static readonly TheoryData < string > InvalidEmailAddresses =
10+ [
11+ null ,
12+ "plainaddress" ,
13+ "#@%^%#$@#$@#.com" ,
14+ "@domain.com" ,
15+ "Joe Smith <email@domain.com>" ,
16+ "email.domain.com" ,
17+ "email@domain@domain.com" ,
18+ ".email@domain.com" ,
19+ "email.@domain.com" ,
20+ "email..email@domain.com" ,
21+ "email@domain.com (Joe Smith)" ,
22+ "email@domain" ,
23+ "email@-domain.com" ,
24+ "email@111.222.333.44444" ,
25+ "email@domain..com" ,
26+ "email@256.256.256.256" ,
27+ ] ;
28+
829 [ Theory ]
9- [ InlineData ( null ) ]
10- [ InlineData ( "plainaddress" ) ]
11- [ InlineData ( "#@%^%#$@#$@#.com" ) ]
12- [ InlineData ( "@domain.com" ) ]
13- [ InlineData ( "Joe Smith <email@domain.com>" ) ]
14- [ InlineData ( "email.domain.com" ) ]
15- [ InlineData ( "email@domain@domain.com" ) ]
16- [ InlineData ( ".email@domain.com" ) ]
17- [ InlineData ( "email.@domain.com" ) ]
18- [ InlineData ( "email..email@domain.com" ) ]
19- [ InlineData ( "email@domain.com (Joe Smith)" ) ]
20- [ InlineData ( "email@domain" ) ]
21- [ InlineData ( "email@-domain.com" ) ]
22- [ InlineData ( "email@111.222.333.44444" ) ]
23- [ InlineData ( "email@domain..com" ) ]
24- [ InlineData ( "email@256.256.256.256" ) ] // Invalid IP (values > 255)
30+ [ MemberData ( nameof ( InvalidEmailAddresses ) ) ]
2531 public void IsNotValidEmailAddress ( string email )
2632 {
2733 var isValid = email . IsEmailAddress ( ) ;
2834
2935 isValid . Should ( ) . BeFalse ( ) ;
3036 }
3137
38+ public static readonly TheoryData < string > ValidEmailAddresses =
39+ [
40+ "email@domain.com" ,
41+ "firstname.lastname@domain.com" ,
42+ "email@subdomain.domain.com" ,
43+ "firstname+lastname@domain.com" ,
44+ "email@123.123.123.123" ,
45+ "1234567890@domain.com" ,
46+ "email@domain-one.com" ,
47+ "_______@domain.com" ,
48+ "email@domain.name" ,
49+ "email@domain.co.jp" ,
50+ "firstname-lastname@domain.com" ,
51+ "email@domain.museum" , // Long TLD (>4 chars)
52+ "email@domain.travel" , // Another long TLD
53+ "email@domain.photography" , // Even longer TLD
54+ "email@[IPv6:2001:db8::1]" , // IPv6 format
55+ "\" quoted\" @domain.com" , // Quoted local part
56+ "user.name+tag+sorting@example.com" , // Gmail-style + addressing
57+ "あいうえお@domain.com" , // Unicode character test
58+ ] ;
59+
3260 [ Theory ]
33- [ InlineData ( "email@domain.com" ) ]
34- [ InlineData ( "firstname.lastname@domain.com" ) ]
35- [ InlineData ( "email@subdomain.domain.com" ) ]
36- [ InlineData ( "firstname+lastname@domain.com" ) ]
37- [ InlineData ( "email@123.123.123.123" ) ]
38- [ InlineData ( "1234567890@domain.com" ) ]
39- [ InlineData ( "email@domain-one.com" ) ]
40- [ InlineData ( "_______@domain.com" ) ]
41- [ InlineData ( "email@domain.name" ) ]
42- [ InlineData ( "email@domain.co.jp" ) ]
43- [ InlineData ( "firstname-lastname@domain.com" ) ]
44- [ InlineData ( "email@domain.museum" ) ] // Long TLD (>4 chars)
45- [ InlineData ( "email@domain.travel" ) ] // Another long TLD
46- [ InlineData ( "email@domain.photography" ) ] // Even longer TLD
47- [ InlineData ( "email@[IPv6:2001:db8::1]" ) ] // IPv6 format
48- [ InlineData ( "\" quoted\" @domain.com" ) ] // Quoted local part
49- [ InlineData ( "user.name+tag+sorting@example.com" ) ] // Gmail-style + addressing
50- [ InlineData ( "あいうえお@domain.com" ) ] // Unicode character test
61+ [ MemberData ( nameof ( ValidEmailAddresses ) ) ]
5162 public void IsValidEmailAddress ( string email )
5263 {
5364 var isValid = email . IsEmailAddress ( ) ;
5465
5566 isValid . Should ( ) . BeTrue ( ) ;
5667 }
57- }
68+
69+ #if NET8_0
70+ [ Theory ]
71+ [ MemberData ( nameof ( InvalidEmailAddresses ) ) ]
72+ public void IsNotValidEmailAddress_ReadOnlySpan ( string email )
73+ {
74+ var span = new ReadOnlySpan < char > ( email ? . ToCharArray ( ) ?? [ ] ) ;
75+ var isValid = span . IsEmailAddress ( ) ;
76+
77+ isValid . Should ( ) . BeFalse ( ) ;
78+ }
79+
80+ [ Theory ]
81+ [ MemberData ( nameof ( ValidEmailAddresses ) ) ]
82+ public void IsValidEmailAddress_ReadOnlySpan ( string email )
83+ {
84+ var span = email . AsSpan ( ) ;
85+ var isValid = span . IsEmailAddress ( ) ;
86+
87+ isValid . Should ( ) . BeTrue ( ) ;
88+ }
89+
90+ [ Theory ]
91+ [ MemberData ( nameof ( InvalidEmailAddresses ) ) ]
92+ public void IsNotValidEmailAddress_Span ( string email )
93+ {
94+ var span = new Span < char > ( email ? . ToCharArray ( ) ?? [ ] ) ;
95+ var isValid = span . IsEmailAddress ( ) ;
96+
97+ isValid . Should ( ) . BeFalse ( ) ;
98+ }
99+
100+ [ Theory ]
101+ [ MemberData ( nameof ( ValidEmailAddresses ) ) ]
102+ public void IsValidEmailAddress_Span ( string email )
103+ {
104+ var span = new Span < char > ( email . ToCharArray ( ) ) ;
105+ var isValid = span . IsEmailAddress ( ) ;
106+
107+ isValid . Should ( ) . BeTrue ( ) ;
108+ }
109+
110+ [ Theory ]
111+ [ MemberData ( nameof ( InvalidEmailAddresses ) ) ]
112+ public void IsNotValidEmailAddress_Memory ( string email )
113+ {
114+ var memory = email ? . ToCharArray ( ) . AsMemory ( ) ?? Memory < char > . Empty ;
115+ var isValid = memory . IsEmailAddress ( ) ;
116+
117+ isValid . Should ( ) . BeFalse ( ) ;
118+ }
119+
120+ [ Theory ]
121+ [ MemberData ( nameof ( ValidEmailAddresses ) ) ]
122+ public void IsValidEmailAddress_Memory ( string email )
123+ {
124+ var memory = email . ToCharArray ( ) . AsMemory ( ) ;
125+ var isValid = memory . IsEmailAddress ( ) ;
126+
127+ isValid . Should ( ) . BeTrue ( ) ;
128+ }
129+
130+ [ Theory ]
131+ [ MemberData ( nameof ( InvalidEmailAddresses ) ) ]
132+ public void IsNotValidEmailAddress_ReadOnlyMemory ( string email )
133+ {
134+ var memory = new ReadOnlyMemory < char > ( email ? . ToCharArray ( ) ?? [ ] ) ;
135+ var isValid = memory . IsEmailAddress ( ) ;
136+
137+ isValid . Should ( ) . BeFalse ( ) ;
138+ }
139+
140+ [ Theory ]
141+ [ MemberData ( nameof ( ValidEmailAddresses ) ) ]
142+ public void IsValidEmailAddress_ReadOnlyMemory ( string email )
143+ {
144+ var memory = new ReadOnlyMemory < char > ( email . ToCharArray ( ) ) ;
145+ var isValid = memory . IsEmailAddress ( ) ;
146+
147+ isValid . Should ( ) . BeTrue ( ) ;
148+ }
149+ #endif
150+ }
0 commit comments