View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.validator.routines;
18  
19  import static org.junit.Assert.*;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  
24  import org.apache.commons.validator.ResultPair;
25  import org.junit.Before;
26  import org.junit.Ignore;
27  import org.junit.Test;
28  
29  /**
30   * Performs Validation Test for e-mail validations.
31   *
32   *
33   * @version $Revision$
34   */
35  public class EmailValidatorTest {
36  
37      /**
38       * The key used to retrieve the set of validation
39       * rules from the xml file.
40       */
41      protected static String FORM_KEY = "emailForm";
42  
43     /**
44      * The key used to retrieve the validator action.
45      */
46     protected static String ACTION = "email";
47  
48     private EmailValidator validator;
49  
50     @Before
51     public void setUp() {
52          validator = EmailValidator.getInstance();
53     }
54  
55     /**
56      * Tests the e-mail validation.
57      */
58      @Test
59      public void testEmail()  {
60         assertTrue(validator.isValid("jsmith@apache.org"));
61      }
62  
63     /**
64      * Tests the email validation with numeric domains.
65      */
66      @Test
67      public void testEmailWithNumericAddress()  {
68          assertTrue(validator.isValid("someone@[216.109.118.76]"));
69          assertTrue(validator.isValid("someone@yahoo.com"));
70      }
71  
72      /**
73       * Tests the e-mail validation.
74       */
75      @Test
76      public void testEmailExtension()  {
77          assertTrue(validator.isValid("jsmith@apache.org"));
78  
79          assertTrue(validator.isValid("jsmith@apache.com"));
80  
81          assertTrue(validator.isValid("jsmith@apache.net"));
82  
83          assertTrue(validator.isValid("jsmith@apache.info"));
84  
85          assertFalse(validator.isValid("jsmith@apache."));
86  
87          assertFalse(validator.isValid("jsmith@apache.c"));
88  
89          assertTrue(validator.isValid("someone@yahoo.museum"));
90  
91          assertFalse(validator.isValid("someone@yahoo.mu-seum"));
92      }
93  
94     /**
95      * <p>Tests the e-mail validation with a dash in
96      * the address.</p>
97      */
98      @Test
99      public void testEmailWithDash()  {
100        assertTrue(validator.isValid("andy.noble@data-workshop.com"));
101 
102        assertFalse(validator.isValid("andy-noble@data-workshop.-com"));
103 
104        assertFalse(validator.isValid("andy-noble@data-workshop.c-om"));
105 
106        assertFalse(validator.isValid("andy-noble@data-workshop.co-m"));
107    }
108 
109    /**
110     * Tests the e-mail validation with a dot at the end of
111     * the address.
112     */
113     @Test
114     public void testEmailWithDotEnd()  {
115       assertFalse(validator.isValid("andy.noble@data-workshop.com."));
116    }
117 
118     /**
119      * Tests the e-mail validation with an RCS-noncompliant character in
120      * the address.
121      */
122     @Test
123     public void testEmailWithBogusCharacter()  {
124 
125         assertFalse(validator.isValid("andy.noble@\u008fdata-workshop.com"));
126 
127         // The ' character is valid in an email username.
128         assertTrue(validator.isValid("andy.o'reilly@data-workshop.com"));
129 
130         // But not in the domain name.
131         assertFalse(validator.isValid("andy@o'reilly.data-workshop.com"));
132 
133         // The + character is valid in an email username.
134         assertTrue(validator.isValid("foo+bar@i.am.not.in.us.example.com"));
135 
136         // But not in the domain name
137         assertFalse(validator.isValid("foo+bar@example+3.com"));
138 
139         // Domains with only special characters aren't allowed (VALIDATOR-286) 
140         assertFalse(validator.isValid("test@%*.com"));
141         assertFalse(validator.isValid("test@^&#.com"));
142 
143     }
144 
145     @Test
146     public void testVALIDATOR_315() {
147         assertFalse(validator.isValid("me@at&t.net"));
148         assertTrue(validator.isValid("me@att.net")); // Make sure TLD is not the cause of the failure
149     }
150 
151     @Test
152     public void testVALIDATOR_278() {
153         assertFalse(validator.isValid("someone@-test.com"));// hostname starts with dash/hyphen
154         assertFalse(validator.isValid("someone@test-.com"));// hostname ends with dash/hyphen
155     }
156 
157     @Test
158     public void testValidator235() {
159         String version = System.getProperty("java.version");
160         if (version.compareTo("1.6") < 0) {
161             System.out.println("Cannot run Unicode IDN tests");
162             return; // Cannot run the test
163         }
164         assertTrue("xn--d1abbgf6aiiy.xn--p1ai should validate", validator.isValid("someone@xn--d1abbgf6aiiy.xn--p1ai"));
165         assertTrue("президент.рф should validate", validator.isValid("someone@президент.рф"));
166         assertTrue("www.b\u00fccher.ch should validate", validator.isValid("someone@www.b\u00fccher.ch"));
167         assertFalse("www.\uFFFD.ch FFFD should fail", validator.isValid("someone@www.\uFFFD.ch"));
168         assertTrue("www.b\u00fccher.ch should validate", validator.isValid("someone@www.b\u00fccher.ch"));
169         assertFalse("www.\uFFFD.ch FFFD should fail", validator.isValid("someone@www.\uFFFD.ch"));
170     }
171 
172     /**
173     * Tests the email validation with commas.
174     */
175     @Test
176     public void testEmailWithCommas()  {
177         assertFalse(validator.isValid("joeblow@apa,che.org"));
178 
179         assertFalse(validator.isValid("joeblow@apache.o,rg"));
180 
181         assertFalse(validator.isValid("joeblow@apache,org"));
182 
183     }
184 
185    /**
186     * Tests the email validation with spaces.
187     */
188     @Test
189     public void testEmailWithSpaces()  {
190         assertFalse(validator.isValid("joeblow @apache.org"));
191 
192         assertFalse(validator.isValid("joeblow@ apache.org"));
193 
194         assertFalse(validator.isValid(" joeblow@apache.org"));
195 
196         assertFalse(validator.isValid("joeblow@apache.org "));
197 
198         assertFalse(validator.isValid("joe blow@apache.org "));
199 
200         assertFalse(validator.isValid("joeblow@apa che.org "));
201 
202         assertTrue(validator.isValid("\"joeblow \"@apache.org"));
203 
204         assertTrue(validator.isValid("\" joeblow\"@apache.org"));
205 
206         assertTrue(validator.isValid("\" joe blow \"@apache.org"));
207 
208     }
209 
210    /**
211     * Tests the email validation with ascii control characters.
212     * (i.e. Ascii chars 0 - 31 and 127)
213     */
214     @Test
215     public void testEmailWithControlChars()  {
216         for (char c = 0; c < 32; c++) {
217             assertFalse("Test control char " + ((int)c), validator.isValid("foo" + c + "bar@domain.com"));
218         }
219         assertFalse("Test control char 127", validator.isValid("foo" + ((char)127) + "bar@domain.com"));
220     }
221     
222     /**
223      * Test that @localhost and @localhost.localdomain
224      *  addresses are declared as valid when requested. 
225      */
226     @Test
227     public void testEmailLocalhost() {
228        // Check the default is not to allow
229        EmailValidator noLocal = EmailValidator.getInstance(false);
230        EmailValidator allowLocal = EmailValidator.getInstance(true);
231        assertEquals(validator, noLocal);
232        
233        // Depends on the validator
234        assertTrue(
235              "@localhost.localdomain should be accepted but wasn't",
236              allowLocal.isValid("joe@localhost.localdomain")
237        );
238        assertTrue(
239              "@localhost should be accepted but wasn't",
240              allowLocal.isValid("joe@localhost")
241        );
242        
243        assertFalse(
244              "@localhost.localdomain should be accepted but wasn't",
245              noLocal.isValid("joe@localhost.localdomain")
246        );
247        assertFalse(
248              "@localhost should be accepted but wasn't",
249              noLocal.isValid("joe@localhost")
250        );
251     }
252     
253     /**
254      * VALIDATOR-296 - A / or a ! is valid in the user part,
255      *  but not in the domain part 
256      */
257     @Test
258     public void testEmailWithSlashes() {
259        assertTrue(
260              "/ and ! valid in username",
261              validator.isValid("joe!/blow@apache.org")
262        );
263        assertFalse(
264              "/ not valid in domain",
265              validator.isValid("joe@ap/ache.org")
266        );
267        assertFalse(
268              "! not valid in domain",
269              validator.isValid("joe@apac!he.org")
270        );
271     }
272 
273     /**
274      * Write this test according to parts of RFC, as opposed to the type of character
275      * that is being tested.
276      */
277     @Test
278     public void testEmailUserName()  {
279 
280         assertTrue(validator.isValid("joe1blow@apache.org"));
281 
282         assertTrue(validator.isValid("joe$blow@apache.org"));
283 
284         assertTrue(validator.isValid("joe-@apache.org"));
285 
286         assertTrue(validator.isValid("joe_@apache.org"));
287 
288         assertTrue(validator.isValid("joe+@apache.org")); // + is valid unquoted
289 
290         assertTrue(validator.isValid("joe!@apache.org")); // ! is valid unquoted
291 
292         assertTrue(validator.isValid("joe*@apache.org")); // * is valid unquoted
293 
294         assertTrue(validator.isValid("joe'@apache.org")); // ' is valid unquoted
295 
296         assertTrue(validator.isValid("joe%45@apache.org")); // % is valid unquoted
297 
298         assertTrue(validator.isValid("joe?@apache.org")); // ? is valid unquoted
299 
300         assertTrue(validator.isValid("joe&@apache.org")); // & ditto
301 
302         assertTrue(validator.isValid("joe=@apache.org")); // = ditto
303 
304         assertTrue(validator.isValid("+joe@apache.org")); // + is valid unquoted
305 
306         assertTrue(validator.isValid("!joe@apache.org")); // ! is valid unquoted
307 
308         assertTrue(validator.isValid("*joe@apache.org")); // * is valid unquoted
309 
310         assertTrue(validator.isValid("'joe@apache.org")); // ' is valid unquoted
311 
312         assertTrue(validator.isValid("%joe45@apache.org")); // % is valid unquoted
313 
314         assertTrue(validator.isValid("?joe@apache.org")); // ? is valid unquoted
315 
316         assertTrue(validator.isValid("&joe@apache.org")); // & ditto
317 
318         assertTrue(validator.isValid("=joe@apache.org")); // = ditto
319 
320         assertTrue(validator.isValid("+@apache.org")); // + is valid unquoted
321 
322         assertTrue(validator.isValid("!@apache.org")); // ! is valid unquoted
323 
324         assertTrue(validator.isValid("*@apache.org")); // * is valid unquoted
325 
326         assertTrue(validator.isValid("'@apache.org")); // ' is valid unquoted
327 
328         assertTrue(validator.isValid("%@apache.org")); // % is valid unquoted
329 
330         assertTrue(validator.isValid("?@apache.org")); // ? is valid unquoted
331 
332         assertTrue(validator.isValid("&@apache.org")); // & ditto
333 
334         assertTrue(validator.isValid("=@apache.org")); // = ditto
335 
336 
337         //UnQuoted Special characters are invalid
338 
339         assertFalse(validator.isValid("joe.@apache.org")); // . not allowed at end of local part
340 
341         assertFalse(validator.isValid(".joe@apache.org")); // . not allowed at start of local part
342 
343         assertFalse(validator.isValid(".@apache.org")); // . not allowed alone
344 
345         assertTrue(validator.isValid("joe.ok@apache.org")); // . allowed embedded
346 
347         assertFalse(validator.isValid("joe..ok@apache.org")); // .. not allowed embedded
348 
349         assertFalse(validator.isValid("..@apache.org")); // .. not allowed alone
350 
351         assertFalse(validator.isValid("joe(@apache.org"));
352 
353         assertFalse(validator.isValid("joe)@apache.org"));
354 
355         assertFalse(validator.isValid("joe,@apache.org"));
356 
357         assertFalse(validator.isValid("joe;@apache.org"));
358 
359 
360         //Quoted Special characters are valid
361         assertTrue(validator.isValid("\"joe.\"@apache.org"));
362 
363         assertTrue(validator.isValid("\".joe\"@apache.org"));
364 
365         assertTrue(validator.isValid("\"joe+\"@apache.org"));
366 
367         assertTrue(validator.isValid("\"joe@\"@apache.org"));
368 
369         assertTrue(validator.isValid("\"joe!\"@apache.org"));
370 
371         assertTrue(validator.isValid("\"joe*\"@apache.org"));
372 
373         assertTrue(validator.isValid("\"joe'\"@apache.org"));
374 
375         assertTrue(validator.isValid("\"joe(\"@apache.org"));
376 
377         assertTrue(validator.isValid("\"joe)\"@apache.org"));
378 
379         assertTrue(validator.isValid("\"joe,\"@apache.org"));
380 
381         assertTrue(validator.isValid("\"joe%45\"@apache.org"));
382 
383         assertTrue(validator.isValid("\"joe;\"@apache.org"));
384 
385         assertTrue(validator.isValid("\"joe?\"@apache.org"));
386 
387         assertTrue(validator.isValid("\"joe&\"@apache.org"));
388 
389         assertTrue(validator.isValid("\"joe=\"@apache.org"));
390 
391         assertTrue(validator.isValid("\"..\"@apache.org"));
392 
393         // escaped quote character valid in quoted string
394         assertTrue(validator.isValid("\"john\\\"doe\"@apache.org"));
395 
396         assertTrue(validator.isValid("john56789.john56789.john56789.john56789.john56789.john56789.john@example.com"));
397 
398         assertFalse(validator.isValid("john56789.john56789.john56789.john56789.john56789.john56789.john5@example.com"));
399 
400         assertTrue(validator.isValid("\\>escape\\\\special\\^characters\\<@example.com"));
401 
402         assertTrue(validator.isValid("Abc\\@def@example.com"));
403 
404         assertFalse(validator.isValid("Abc@def@example.com"));
405 
406         assertTrue(validator.isValid("space\\ monkey@example.com"));
407     }
408 
409     /**
410      * These test values derive directly from RFC 822 &
411      * Mail::RFC822::Address & RFC::RFC822::Address perl test.pl
412      * For traceability don't combine these test values with other tests.
413      */
414     private static final ResultPair[] testEmailFromPerl = {
415         new ResultPair("abigail@example.com", true),
416         new ResultPair("abigail@example.com ", true),
417         new ResultPair(" abigail@example.com", true),
418         new ResultPair("abigail @example.com ", true),
419         new ResultPair("*@example.net", true),
420         new ResultPair("\"\\\"\"@foo.bar", true),
421         new ResultPair("fred&barny@example.com", true),
422         new ResultPair("---@example.com", true),
423         new ResultPair("foo-bar@example.net", true),
424         new ResultPair("\"127.0.0.1\"@[127.0.0.1]", true),
425         new ResultPair("Abigail <abigail@example.com>", true),
426         new ResultPair("Abigail<abigail@example.com>", true),
427         new ResultPair("Abigail<@a,@b,@c:abigail@example.com>", true),
428         new ResultPair("\"This is a phrase\"<abigail@example.com>", true),
429         new ResultPair("\"Abigail \"<abigail@example.com>", true),
430         new ResultPair("\"Joe & J. Harvey\" <example @Org>", true),
431         new ResultPair("Abigail <abigail @ example.com>", true),
432         new ResultPair("Abigail made this <  abigail   @   example  .    com    >", true),
433         new ResultPair("Abigail(the bitch)@example.com", true),
434         new ResultPair("Abigail <abigail @ example . (bar) com >", true),
435         new ResultPair("Abigail < (one)  abigail (two) @(three)example . (bar) com (quz) >", true),
436         new ResultPair("Abigail (foo) (((baz)(nested) (comment)) ! ) < (one)  abigail (two) @(three)example . (bar) com (quz) >", true),
437         new ResultPair("Abigail <abigail(fo\\(o)@example.com>", true),
438         new ResultPair("Abigail <abigail(fo\\)o)@example.com> ", true),
439         new ResultPair("(foo) abigail@example.com", true),
440         new ResultPair("abigail@example.com (foo)", true),
441         new ResultPair("\"Abi\\\"gail\" <abigail@example.com>", true),
442         new ResultPair("abigail@[example.com]", true),
443         new ResultPair("abigail@[exa\\[ple.com]", true),
444         new ResultPair("abigail@[exa\\]ple.com]", true),
445         new ResultPair("\":sysmail\"@  Some-Group. Some-Org", true),
446         new ResultPair("Muhammed.(I am  the greatest) Ali @(the)Vegas.WBA", true),
447         new ResultPair("mailbox.sub1.sub2@this-domain", true),
448         new ResultPair("sub-net.mailbox@sub-domain.domain", true),
449         new ResultPair("name:;", true),
450         new ResultPair("':;", true),
451         new ResultPair("name:   ;", true),
452         new ResultPair("Alfred Neuman <Neuman@BBN-TENEXA>", true),
453         new ResultPair("Neuman@BBN-TENEXA", true),
454         new ResultPair("\"George, Ted\" <Shared@Group.Arpanet>", true),
455         new ResultPair("Wilt . (the  Stilt) Chamberlain@NBA.US", true),
456         new ResultPair("Cruisers:  Port@Portugal, Jones@SEA;", true),
457         new ResultPair("$@[]", true),
458         new ResultPair("*()@[]", true),
459         new ResultPair("\"quoted ( brackets\" ( a comment )@example.com", true),
460         new ResultPair("\"Joe & J. Harvey\"\\x0D\\x0A     <ddd\\@ Org>", true),
461         new ResultPair("\"Joe &\\x0D\\x0A J. Harvey\" <ddd \\@ Org>", true),
462         new ResultPair("Gourmets:  Pompous Person <WhoZiWhatZit\\@Cordon-Bleu>,\\x0D\\x0A" +
463             "        Childs\\@WGBH.Boston, \"Galloping Gourmet\"\\@\\x0D\\x0A" +
464             "        ANT.Down-Under (Australian National Television),\\x0D\\x0A" +
465             "        Cheapie\\@Discount-Liquors;", true),
466         new ResultPair("   Just a string", false),
467         new ResultPair("string", false),
468         new ResultPair("(comment)", false),
469         new ResultPair("()@example.com", false),
470         new ResultPair("fred(&)barny@example.com", false),
471         new ResultPair("fred\\ barny@example.com", false),
472         new ResultPair("Abigail <abi gail @ example.com>", false),
473         new ResultPair("Abigail <abigail(fo(o)@example.com>", false),
474         new ResultPair("Abigail <abigail(fo)o)@example.com>", false),
475         new ResultPair("\"Abi\"gail\" <abigail@example.com>", false),
476         new ResultPair("abigail@[exa]ple.com]", false),
477         new ResultPair("abigail@[exa[ple.com]", false),
478         new ResultPair("abigail@[exaple].com]", false),
479         new ResultPair("abigail@", false),
480         new ResultPair("@example.com", false),
481         new ResultPair("phrase: abigail@example.com abigail@example.com ;", false),
482         new ResultPair("invalid�char@example.com", false)
483     };
484 
485     /**
486      * Write this test based on perl Mail::RFC822::Address
487      * which takes its example email address directly from RFC822
488      *
489      * This test fails so disable it
490      * The real solution is to fix the email parsing.
491      */
492     @Ignore("VALIDATOR-267")
493     @Test
494     public void testEmailFromPerl()  {
495         int errors = 0;
496         for (int index = 0; index < testEmailFromPerl.length; index++) {
497             String item = testEmailFromPerl[index].item;
498             boolean exp =  testEmailFromPerl[index].valid;
499             boolean act = validator.isValid(item);
500             if (act != exp) {
501                 System.out.printf("%s: expected %s actual %s%n", item, exp, act);
502                 errors += 1;
503             }
504         }
505         assertEquals("Expected 0 errors", 0, errors);
506     }
507 
508     @Test
509     public void testValidator293(){
510         assertTrue(validator.isValid("abc-@abc.com"));
511         assertTrue(validator.isValid("abc_@abc.com"));
512         assertTrue(validator.isValid("abc-def@abc.com"));
513         assertTrue(validator.isValid("abc_def@abc.com"));
514         assertFalse(validator.isValid("abc@abc_def.com"));
515     }
516 
517     @Test
518     public void testValidator365() {
519         assertFalse(validator.isValid(
520                 "Loremipsumdolorsitametconsecteturadipiscingelit.Nullavitaeligulamattisrhoncusnuncegestasmattisleo."+
521                 "Donecnonsapieninmagnatristiquedictumaacturpis.Fusceorciduifacilisisutsapieneuconsequatpharetralectus."+
522                 "Quisqueenimestpulvinarutquamvitaeportamattisex.Nullamquismaurisplaceratconvallisjustoquisportamauris."+
523                 "Innullalacusconvalliseufringillautvenenatissitametdiam.Maecenasluctusligulascelerisquepulvinarfeugiat."+
524                 "Sedmolestienullaaliquetorciluctusidpharetranislfinibus.Suspendissemalesuadatinciduntduisitametportaarcusollicitudinnec."+
525                 "Donecetmassamagna.Curabitururnadiampretiumveldignissimporttitorfringillaeuneque."+
526                 "Duisantetelluspharetraidtinciduntinterdummolestiesitametfelis.Utquisquamsitametantesagittisdapibusacnonodio."+
527                 "Namrutrummolestiediamidmattis.Cumsociisnatoquepenatibusetmagnisdisparturientmontesnasceturridiculusmus."+
528                 "Morbiposueresedmetusacconsectetur.Etiamquisipsumvitaejustotempusmaximus.Sedultriciesplaceratvolutpat."+
529                 "Integerlacuslectusmaximusacornarequissagittissitametjusto."+
530                 "Cumsociisnatoquepenatibusetmagnisdisparturientmontesnasceturridiculusmus.Maecenasindictumpurussedrutrumex.Nullafacilisi."+
531                 "Integerfinibusfinibusmietpharetranislfaucibusvel.Maecenasegetdolorlacinialobortisjustovelullamcorpersem."+
532                 "Vivamusaliquetpurusidvariusornaresapienrisusrutrumnisitinciduntmollissemnequeidmetus."+
533                 "Etiamquiseleifendpurus.Nuncfelisnuncscelerisqueiddignissimnecfinibusalibero."+
534                 "Nuncsemperenimnequesitamethendreritpurusfacilisisac.Maurisdapibussemperfelisdignissimgravida."+
535                 "Aeneanultricesblanditnequealiquamfinibusodioscelerisqueac.Aliquamnecmassaeumaurisfaucibusfringilla."+
536                 "Etiamconsequatligulanisisitametaliquamnibhtemporquis.Nuncinterdumdignissimnullaatsodalesarcusagittiseu."+
537                 "Proinpharetrametusneclacuspulvinarsedvolutpatliberoornare.Sedligulanislpulvinarnonlectuseublanditfacilisisante."+
538                 "Sedmollisnislalacusauctorsuscipit.Inhachabitasseplateadictumst.Phasellussitametvelittemporvenenatisfeliseuegestasrisus."+
539                 "Aliquameteratsitametnibhcommodofinibus.Morbiefficiturodiovelpulvinariaculis."+
540                 "Aeneantemporipsummassaaconsecteturturpisfaucibusultrices.Praesentsodalesmaurisquisportafermentum."+
541                 "Etiamnisinislvenenatisvelauctorutullamcorperinjusto.Proinvelligulaerat.Phasellusvestibulumgravidamassanonfeugiat."+
542                 "Maecenaspharetraeuismodmetusegetefficitur.Suspendisseamet@gmail.com"));
543     }
544 
545     /**
546      * Tests the e-mail validation with a user at a TLD
547      *
548      * http://tools.ietf.org/html/rfc5321#section-2.3.5
549      * (In the case of a top-level domain used by itself in an
550      * email address, a single string is used without any dots)
551      */
552     @Test
553     public void testEmailAtTLD() {
554         EmailValidator val = EmailValidator.getInstance(false, true);
555         assertTrue(val.isValid("test@com"));
556     }
557 
558     @Test
559     public void testValidator359() {
560         EmailValidator val = EmailValidator.getInstance(false, true);
561         assertFalse(val.isValid("test@.com"));
562     }
563 
564     @Test
565     public void testValidator374() {
566         assertTrue(validator.isValid("abc@school.school"));
567     }
568 
569     @Test(expected = IllegalArgumentException.class)
570     public void testValidator473_1() { // reject null DomainValidator
571         new EmailValidator(false, false, null);
572     }
573 
574     @Test(expected = IllegalArgumentException.class)
575     public void testValidator473_2() { // reject null DomainValidator with mismatched allowLocal
576         List<DomainValidator.Item> items = new ArrayList<>();
577         new EmailValidator(false, false, DomainValidator.getInstance(true, items));
578     }
579 
580     @Test(expected = IllegalArgumentException.class)
581     public void testValidator473_3() { // reject null DomainValidator with mismatched allowLocal
582         List<DomainValidator.Item> items = new ArrayList<>();
583         new EmailValidator(true, false, DomainValidator.getInstance(false, items));
584     }
585 
586     @Test
587     public void testValidator473_4() { // Show that can override domain validation
588         assertFalse(validator.isValidDomain("test.local"));
589         List<DomainValidator.Item> items = new ArrayList<>();
590         items.add(new DomainValidator.Item(DomainValidator.ArrayType.GENERIC_PLUS, new String[]{"local"}));
591         EmailValidator val = new EmailValidator(true, false, DomainValidator.getInstance(true, items));
592         assertTrue(val.isValidDomain("test.local"));
593     }
594 
595     public static void main(String[] args) {
596         EmailValidator validator = EmailValidator.getInstance();
597         for(String arg : args) {
598             System.out.printf("%s: %s%n", arg, validator.isValid(arg));
599         }
600     }
601 }