001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package edu.samplu.travel.krad.test;
017    
018    import edu.samplu.common.WebDriverLegacyITBase;
019    import org.junit.Assert;
020    import org.junit.Test;
021    
022    /**
023     * tests that regex validation works as expected on input fields where it is configured
024     * 
025     * @author Kuali Rice Team (rice.collab@kuali.org)
026     */
027    public class UIFComponentValidationRegexPatternLegacyIT extends WebDriverLegacyITBase {
028        
029        @Override
030        public String getTestUrl() {
031            return "/kr-krad/uicomponents?viewId=UifCompView_KNS&methodToCall=start&readOnlyFields=field91";
032        }
033    
034        @Test
035        public void testValidCharacterConstraint() throws Exception {
036    
037            /*
038             *  Timestamp pattern validation message says it allows years from 1900 - 2099 
039             *  In fact it also allows 2999 as the upper limit. This needs to be sorted out.
040             *  Test failing this condition is commented in the below code section for Timestamp Validation. Once resolved can be uncommented  
041             *  
042             */
043         
044            waitAndClickByXpath("//a[contains(text(),'Validation - Regex')]");
045    
046            //---------------------------------------------Fixed Point------------------------------//
047    
048           
049            waitAndTypeByName("field50", "123.123");
050            fireEvent("field50","blur");        
051            validateErrorImage(true);
052            clearTextByName("field50");
053    
054            waitAndTypeByXpath("//input[@name='field50']", "1234.4");
055            fireEvent("field50","blur");    
056            validateErrorImage(true);
057            clearTextByName("field50");
058    
059         
060            waitAndTypeByXpath("//input[@name='field50']", "1234.434");
061            fireEvent("field50","blur");
062            validateErrorImage(true);
063            clearTextByName("field50");
064            
065            waitAndTypeByXpath("//input[@name='field50']", "123.67");
066            fireEvent("field50","blur");
067            validateErrorImage(false);
068            clearTextByName("field50");
069    
070            //---------------------------------------------Floating Point------------------------------//
071           
072            waitAndTypeByXpath("//input[@name='field51']", "127.");
073            fireEvent("field51","blur");
074            validateErrorImage(true);
075            clearTextByName("field51");
076             
077            waitAndTypeByXpath("//input[@name='field51']", "1234()98");
078            fireEvent("field51","blur");
079            validateErrorImage(true);
080            clearTextByName("field51");
081            
082            waitAndTypeByXpath("//input[@name='field51']", "-123.67");
083            fireEvent("field51","blur");
084            validateErrorImage(false);
085            clearTextByName("field51");
086    
087            //---------------------------------------------Integer Pattern constraint------------------------------//
088            
089            waitAndTypeByXpath("//input[@name='field77']", "127.");
090            fireEvent("field77","blur");
091            validateErrorImage(true);
092            clearTextByName("field77");
093    
094            waitAndTypeByXpath("//input[@name='field77']", "1234.4123");
095            fireEvent("field77","blur");
096            validateErrorImage(true);
097            clearTextByName("field77");
098    
099            waitAndTypeByXpath("//input[@name='field77']", "123E123");
100            fireEvent("field77", "blur");
101            validateErrorImage(true);
102            clearTextByName("field77");
103    
104            waitAndTypeByXpath("//input[@name='field77']", "-123");
105            fireEvent("field77", "blur");
106            validateErrorImage(false);
107            clearTextByName("field77");
108    
109            //---------------------------------------------Phone Text------------------------------//
110            waitAndTypeByXpath("//input[@name='field52']", "1271231234");
111            fireEvent("field52", "blur");
112            validateErrorImage(true);
113            clearTextByName("field52");
114    
115            waitAndTypeByXpath("//input[@name='field52']", "123-123-123");
116            fireEvent("field52", "blur");
117            validateErrorImage(true);
118            clearTextByName("field52");
119    
120            waitAndTypeByXpath("//input[@name='field52']", "12-12-123445");
121            fireEvent("field52", "blur");
122            validateErrorImage(true);
123            clearTextByName("field52");
124    
125            waitAndTypeByXpath("//input[@name='field52']", "1234-12-1234");
126            fireEvent("field52", "blur");
127            validateErrorImage(true);
128            clearTextByName("field52");
129    
130            waitAndTypeByXpath("//input[@name='field52']", "123.123.1234");
131            fireEvent("field52", "blur");
132            validateErrorImage(true);
133            clearTextByName("field52");
134    
135            waitAndTypeByXpath("//input[@name='field52']", "123-123-12345");
136            fireEvent("field52", "blur");
137            validateErrorImage(true);
138            clearTextByName("field52");
139    
140            waitAndTypeByXpath("//input[@name='field52']", "123-123-1234");
141            fireEvent("field52", "blur");
142            validateErrorImage(false);
143            clearTextByName("field52");
144    
145            //---------------------------------------------JavaClass Text------------------------------//
146            waitAndTypeByXpath("//input[@name='field53']", "127");
147            fireEvent("field53", "blur");
148            validateErrorImage(true);
149            clearTextByName("field53");
150    
151            waitAndTypeByXpath("//input[@name='field53']", "TestJava!@#Class");
152            fireEvent("field53", "blur");
153            validateErrorImage(true);
154            clearTextByName("field53");
155    
156            waitAndTypeByXpath("//input[@name='field53']", "Test JavaClass");
157            fireEvent("field53", "blur");
158            validateErrorImage(true);
159            clearTextByName("field53");
160    
161            waitAndTypeByXpath("//input[@name='field53']", "Test JavaClass");
162            fireEvent("field53", "blur");
163            validateErrorImage(true);
164            clearTextByName("field53");
165    
166            waitAndTypeByXpath("//input[@name='field53']", "TestJavaClass");
167            fireEvent("field53", "blur");
168            validateErrorImage(false);
169            clearTextByName("field53");
170    
171            //---------------------------------------------Email Text------------------------------//
172            waitAndTypeByXpath("//input[@name='field54']", "123@123.123");
173            fireEvent("field54", "blur");
174            validateErrorImage(true);
175            clearTextByName("field54");
176    
177            waitAndTypeByXpath("//input[@name='field54']", "email.com@emailServer");
178            fireEvent("field54", "blur");
179            validateErrorImage(true);
180            clearTextByName("field54");
181    
182            waitAndTypeByXpath("//input[@name='field54']", "emailemailServer@.com");
183            fireEvent("field54", "blur");
184            validateErrorImage(true);
185            clearTextByName("field54");
186    
187            waitAndTypeByXpath("//input[@name='field54']", "email@emailServercom");
188            fireEvent("field54", "blur");
189            validateErrorImage(true);
190            clearTextByName("field54");
191    
192            waitAndTypeByXpath("//input[@name='field54']", "email@emailServer.com");
193            fireEvent("field54", "blur");
194            validateErrorImage(false);
195            clearTextByName("field54");
196    
197            //---------------------------------------------URL pattern Text------------------------------//
198            waitAndTypeByXpath("//input[@name='field84']", "www.google.com");
199            fireEvent("field84", "blur");
200            validateErrorImage(true);
201            clearTextByName("field84");
202    
203            waitAndTypeByXpath("//input[@name='field84']", "https:www.google.com");
204            fireEvent("field84", "blur");
205            validateErrorImage(true);
206            clearTextByName("field84");
207    
208            waitAndTypeByXpath("//input[@name='field84']", "ftp://www.google.comsdfa123!#@");
209            fireEvent("field84", "blur");
210            validateErrorImage(true);
211            clearTextByName("field84");
212            
213            waitAndTypeByXpath("//input[@name='field84']", "ftp:/www.google.coms");
214            fireEvent("field84", "blur");
215            validateErrorImage(true);
216            clearTextByName("field84");
217            
218            waitAndTypeByXpath("//input[@name='field84']", "ftp://www.google.com");
219            fireEvent("field84", "blur");
220            validateErrorImage(false);
221            clearTextByName("field84");
222            
223            waitAndTypeByXpath("//input[@name='field84']", "https://www.google.com");
224            fireEvent("field84", "blur");
225            validateErrorImage(false);
226            clearTextByName("field84");
227            
228            waitAndTypeByXpath("//input[@name='field84']", "http://www.google.com");
229            fireEvent("field84", "blur");
230            validateErrorImage(false);
231            clearTextByName("field84");
232    
233            //---------------------------------------------Date pattern Text------------------------------//
234            //-------------invalid formats
235            waitAndTypeByXpath("//input[@name='field55']", "12/12/2112 12:12:87 am");
236            fireEvent("field55", "blur");
237            validateErrorImage(true);
238            clearTextByName("field55");
239    
240            waitAndTypeByXpath("//input[@name='field55']", "12-12-2112 12:12 am");
241            fireEvent("field55", "blur");
242            validateErrorImage(true);
243            clearTextByName("field55");
244            
245            waitAndTypeByXpath("//input[@name='field55']", "12-12-2112 12:12");
246            fireEvent("field55", "blur");
247            validateErrorImage(true);
248            clearTextByName("field55");
249            
250            waitAndTypeByXpath("//input[@name='field55']", "12/12/2112 12:12");
251            fireEvent("field55", "blur");
252            validateErrorImage(true);
253            clearTextByName("field55");
254            
255            waitAndTypeByXpath("//input[@name='field55']", "12-12-2112 12:12:78");
256            fireEvent("field55", "blur");
257            validateErrorImage(true);
258            clearTextByName("field55");
259            
260            waitAndTypeByXpath("//input[@name='field55']", "12 Sept");
261            fireEvent("field55", "blur");
262            validateErrorImage(true);
263            clearTextByName("field55");
264            
265            waitAndTypeByXpath("//input[@name='field55']", "Sept 12 12:12");
266            fireEvent("field55", "blur");
267            validateErrorImage(true);
268            clearTextByName("field55");
269            
270            waitAndTypeByXpath("//input[@name='field55']", "221299 12:12:13");
271            fireEvent("field55", "blur");
272            validateErrorImage(true);
273            clearTextByName("field55");
274            
275            waitAndTypeByXpath("//input[@name='field55']", "111222 12:12");
276            fireEvent("field55", "blur");
277            validateErrorImage(true);
278            clearTextByName("field55");
279            
280            waitAndTypeByXpath("//input[@name='field55']", "9/9/2012 12:12 am");
281            fireEvent("field55", "blur");
282            validateErrorImage(true);
283            clearTextByName("field55");
284            
285            //-------------valid formats      
286            waitAndTypeByXpath("//input[@name='field55']", "09/09/2012 12:12 pm");
287            fireEvent("field55", "blur");
288            validateErrorImage(false);
289            clearTextByName("field55");
290            
291            waitAndTypeByXpath("//input[@name='field55']", "090923");
292            fireEvent("field55", "blur");
293            validateErrorImage(false);
294            clearTextByName("field55");
295            
296            waitAndTypeByXpath("//input[@name='field55']", "Sept 12");
297            fireEvent("field55", "blur");
298            validateErrorImage(false);
299            clearTextByName("field55");
300            
301            waitAndTypeByXpath("//input[@name='field55']", "2034");
302            fireEvent("field55", "blur");
303            validateErrorImage(false);
304            clearTextByName("field55");
305    
306            waitAndTypeByXpath("//input[@name='field55']", "12/12/2012 23:12:59");
307            fireEvent("field55", "blur");
308            validateErrorImage(false);
309            clearTextByName("field55");
310            
311            waitAndTypeByXpath("//input[@name='field55']", "12-12-12 23:12:59");
312            fireEvent("field55", "blur");
313            validateErrorImage(false);
314            clearTextByName("field55");
315           
316            waitAndTypeByXpath("//input[@name='field55']", "121212 23:12:32");
317            fireEvent("field55", "blur");
318            validateErrorImage(false);
319            clearTextByName("field55");
320            
321            waitAndTypeByXpath("//input[@name='field55']", "Sept 12 23:45:50");
322            fireEvent("field55", "blur");
323            validateErrorImage(false);
324            clearTextByName("field55");
325    
326            waitAndTypeByXpath("//input[@name='field55']", "2011 12:23:32");
327            fireEvent("field55", "blur");
328            validateErrorImage(false);
329            clearTextByName("field55");
330            
331            //---------------------------------------------BasicDate pattern Text------------------------------//
332            waitAndTypeByXpath("//input[@name='field75']", "12122012");
333            fireEvent("field75", "blur");
334            validateErrorImage(true);
335            clearTextByName("field75");
336            
337            waitAndTypeByXpath("//input[@name='field75']", "13-12-34");
338            fireEvent("field75", "blur");
339            validateErrorImage(true);
340            clearTextByName("field75");
341            
342            waitAndTypeByXpath("//input[@name='field75']", "12:12:2034");
343            fireEvent("field75", "blur");
344            validateErrorImage(true);
345            clearTextByName("field75");
346    
347            waitAndTypeByXpath("//input[@name='field75']", "12-12-2034");
348            fireEvent("field75", "blur");
349            validateErrorImage(false);
350            clearTextByName("field75");
351     
352            //---------------------------------------------Time12H Pattern Text------------------------------//
353            waitAndTypeByXpath("//input[@name='field82']", "13:00:12");
354            fireEvent("field82", "blur");
355            validateErrorImage(true);
356            clearTextByName("field82");
357    
358            waitAndTypeByXpath("//input[@name='field82']", "09:00:");
359            fireEvent("field82", "blur");
360            validateErrorImage(true);
361            clearTextByName("field82");
362    
363            waitAndTypeByXpath("//input[@name='field82']", "3-00:12");
364            fireEvent("field82", "blur");
365            validateErrorImage(true);
366            clearTextByName("field82");
367            
368            waitAndTypeByXpath("//input[@name='field82']", "3:00:34");
369            fireEvent("field82", "blur");
370            validateErrorImage(false);
371            clearTextByName("field82");
372    
373            waitAndTypeByXpath("//input[@name='field82']", "3:00");
374            fireEvent("field82", "blur");
375            validateErrorImage(false);
376            clearTextByName("field82");
377    
378            //---------------------------------------------Time24H Pattern Text------------------------------//
379            waitAndTypeByXpath("//input[@name='field83']", "24:00:12");
380            fireEvent("field83", "blur");
381            validateErrorImage(true);
382            clearTextByName("field83");
383    
384            waitAndTypeByXpath("//input[@name='field83']", "14:00:");
385            fireEvent("field83", "blur");
386            validateErrorImage(true);
387            clearTextByName("field83");
388            
389            waitAndTypeByXpath("//input[@name='field83']", "13:00:76");
390            fireEvent("field83", "blur");
391            validateErrorImage(true);
392            clearTextByName("field83");
393    
394            waitAndTypeByXpath("//input[@name='field83']", "13:00:23");
395            fireEvent("field83", "blur");
396            validateErrorImage(false);
397            clearTextByName("field83");
398    
399            waitAndTypeByXpath("//input[@name='field83']", "23:00:12");
400            fireEvent("field83", "blur");
401            validateErrorImage(false);
402            clearTextByName("field83");
403    
404            //---------------------------------------------Timestamp pattern Text------------------------------//
405            waitAndTypeByXpath("//input[@name='field56']", "1000-12-12 12:12:12.103");
406            fireEvent("field56", "blur");
407            validateErrorImage(true);
408            clearTextByName("field56");
409    
410            waitAndTypeByXpath("//input[@name='field56']", "2000/12/12 12-12-12.87");
411            fireEvent("field56", "blur");
412            validateErrorImage(true);
413            clearTextByName("field56");
414            
415            waitAndTypeByXpath("//input[@name='field56']", "2000/12/12 12-12-12.87");
416            fireEvent("field56", "blur");
417            validateErrorImage(true);
418            clearTextByName("field56");
419    
420            waitAndTypeByXpath("//input[@name='field56']", "2011-08-12 12:12:12");
421            fireEvent("field56", "blur");
422            validateErrorImage(true);
423            clearTextByName("field56");
424    
425            //--------this should not be allowed
426            /*
427            clearTimeStampText();
428            waitAndType("//input[@name='field56']", "2999-12-12 12:12:12.103");
429            focus("//input[@name='field57']");
430            Thread.sleep(100);
431            assertTrue(isTextPresent("Must be a date/time in the format of yyyy-mm-dd hh:mm:ss.ms, between the years of 1900 and 2099, inclusive. \"ms\" represents milliseconds, and must be included."));
432            
433            */
434            waitAndTypeByXpath("//input[@name='field56']", "2099-12-12 12:12:12.103");
435            fireEvent("field56", "blur");
436            validateErrorImage(false);
437            clearTextByName("field56");
438            
439            //---------------------------------------------Year Pattern Text------------------------------//
440            waitAndTypeByXpath("//input[@name='field57']", "1599");
441            fireEvent("field57", "blur");
442            validateErrorImage(true);
443            clearTextByName("field57");
444    
445            waitAndTypeByXpath("//input[@name='field57']", "2200");
446            fireEvent("field57", "blur");
447            validateErrorImage(true);
448            clearTextByName("field57");
449    
450            waitAndTypeByXpath("//input[@name='field57']", "20000");
451            fireEvent("field57", "blur");
452            validateErrorImage(true);
453            clearTextByName("field57");
454    
455            waitAndTypeByXpath("//input[@name='field57']", "-202");
456            fireEvent("field57", "blur");
457            validateErrorImage(true);
458            clearTextByName("field57");
459    
460            waitAndTypeByXpath("//input[@name='field57']", "2000");
461            fireEvent("field57", "blur");
462            validateErrorImage(false);
463            clearTextByName("field57");
464    
465            //---------------------------------------------Month Pattern Text------------------------------//
466            waitAndTypeByXpath("//input[@name='field58']", "0");
467            fireEvent("field58", "blur");
468            validateErrorImage(true);
469            clearTextByName("field58");
470    
471            waitAndTypeByXpath("//input[@name='field58']", "-12");
472            fireEvent("field58", "blur");
473            validateErrorImage(true);
474            clearTextByName("field58");
475    
476            waitAndTypeByXpath("//input[@name='field58']", "100");
477            fireEvent("field58", "blur");
478            validateErrorImage(true);
479            clearTextByName("field58");
480    
481            waitAndTypeByXpath("//input[@name='field58']", "12");
482            fireEvent("field58", "blur");
483            validateErrorImage(false);
484            clearTextByName("field58");
485    
486            //---------------------------------------------ZipCode Pattern Text------------------------------//
487    
488            waitAndTypeByXpath("//input[@name='field61']", "123");
489            fireEvent("field61", "blur");
490            validateErrorImage(true);
491            clearTextByName("field61");
492    
493            waitAndTypeByXpath("//input[@name='field61']", "2341 12");
494            fireEvent("field61", "blur");
495            validateErrorImage(true);
496            clearTextByName("field61");
497    
498            waitAndTypeByXpath("//input[@name='field61']", "0-1231");
499            fireEvent("field61", "blur");
500            validateErrorImage(true);
501            clearTextByName("field61");
502    
503            waitAndTypeByXpath("//input[@name='field61']", "12345");
504            fireEvent("field61", "blur");
505            validateErrorImage(false);
506            clearTextByName("field61");
507    
508            //---------------------------------------------Alpha Numeric w/o options Text------------------------------//
509            waitAndTypeByXpath("//input[@name='field62']", "123 23 @#");
510            fireEvent("field62", "blur");
511            validateErrorImage(true);
512            clearTextByName("field62");
513    
514            waitAndTypeByXpath("//input[@name='field62']", "-asd123");
515            fireEvent("field62", "blur");
516            validateErrorImage(true);
517            clearTextByName("field62");
518    
519            waitAndTypeByXpath("//input[@name='field62']", "asd/123");
520            fireEvent("field62", "blur");
521            validateErrorImage(true);
522            clearTextByName("field62");
523    
524            waitAndTypeByXpath("//input[@name='field62']", "asd123");
525            fireEvent("field62", "blur");
526            validateErrorImage(false);
527            clearTextByName("field62");
528    
529            //---------------------------------------------Alpha Numeric with options Text------------------------------//
530            waitAndTypeByXpath("//input[@name='field63']", "123^we");
531            fireEvent("field63", "blur");
532            validateErrorImage(true);
533            clearTextByName("field63");
534    
535            waitAndTypeByXpath("//input[@name='field63']", "-123_asd");
536            fireEvent("field63", "blur");
537            validateErrorImage(true);
538            clearTextByName("field63");
539            
540            waitAndTypeByXpath("//input[@name='field63']", "123 23 @#");
541            fireEvent("field63", "blur");
542            clearTextByName("field63");
543    
544            waitAndTypeByXpath("//input[@name='field63']", "as_de 456/123");
545            fireEvent("field63", "blur");
546            validateErrorImage(false);
547            clearTextByName("field63");
548    
549            //---------------------------------------------Alpha with Whitespace and commas Text------------------------------//
550            waitAndTypeByXpath("//input[@name='field64']", "123^we");
551            fireEvent("field64", "blur");
552            validateErrorImage(true);
553            clearTextByName("field64");
554    
555            waitAndTypeByXpath("//input[@name='field64']", "asd_pqr");
556            fireEvent("field64", "blur");
557            validateErrorImage(true);
558            clearTextByName("field64");
559    
560            waitAndTypeByXpath("//input[@name='field64']", "asd/def");
561            fireEvent("field64", "blur");
562            validateErrorImage(true);
563            clearTextByName("field64");
564    
565            waitAndTypeByXpath("//input[@name='field64']", "asd ,pqr");
566            fireEvent("field64", "blur");
567            validateErrorImage(false);
568            clearTextByName("field64");
569    
570            //---------------------------------------------AlphaPatterrn with disallowed charset Text------------------------------//
571            waitAndTypeByXpath("//input[@name='field76']", "123");
572            fireEvent("field76", "blur");
573            validateErrorImage(true);
574            clearTextByName("field76");
575    
576            waitAndTypeByXpath("//input[@name='field76']", "`abcd`");
577            fireEvent("field76", "blur");
578            validateErrorImage(true);
579            clearTextByName("field76");
580    
581            waitAndTypeByXpath("//input[@name='field76']", "|abcd|");
582            fireEvent("field76", "blur");
583            validateErrorImage(true);
584            clearTextByName("field76");
585    
586            waitAndTypeByXpath("//input[@name='field76']", "~abcd~");
587            fireEvent("field76", "blur");
588            validateErrorImage(true);
589            clearTextByName("field76");
590    
591            waitAndTypeByXpath("//input[@name='field76']", " ab_c d_ef ");
592            fireEvent("field76", "blur");
593            validateErrorImage(false);
594            clearTextByName("field76");
595    
596            //---------------------------------------------Anything with No Whitespace Text------------------------------//
597            waitAndTypeByXpath("//input[@name='field65']", "123 ^we");
598            fireEvent("field65", "blur");
599            validateErrorImage(true);
600            clearTextByName("field65");
601    
602            waitAndTypeByXpath("//input[@name='field65']", "123^we!@#^&*~:");
603            fireEvent("field65", "blur");
604            validateErrorImage(false);
605            clearTextByName("field65");
606            
607            //---------------------------------------------CharacterSet Text------------------------------//
608            waitAndTypeByXpath("//input[@name='field66']", "123 ^we");
609            fireEvent("field66", "blur");
610            validateErrorImage(true);
611            clearTextByName("field66");
612            
613            waitAndTypeByXpath("//input[@name='field66']", "123_^we");
614            fireEvent("field66", "blur");
615            validateErrorImage(true);
616            clearTextByName("field66");
617            
618            waitAndTypeByXpath("//input[@name='field66']", "abc ABC");
619            fireEvent("field66", "blur");
620            validateErrorImage(true);
621            clearTextByName("field66");
622            
623            waitAndTypeByXpath("//input[@name='field66']", "aAbBcC");
624            fireEvent("field66", "blur");
625            validateErrorImage(false);
626            clearTextByName("field66");
627            
628            //---------------------------------------------Numeric Character Text------------------------------//
629            waitAndTypeByXpath("//input[@name='field67']", "123 ^we");
630            fireEvent("field67", "blur");
631            validateErrorImage(true);
632            clearTextByName("field67");
633            
634            waitAndTypeByXpath("//input[@name='field67']", "123/10");
635            fireEvent("field67", "blur");
636            validateErrorImage(true);
637            clearTextByName("field67");
638            
639            waitAndTypeByXpath("//input[@name='field67']", "(123.00)");
640            fireEvent("field67", "blur");
641            validateErrorImage(true);
642            clearTextByName("field67");
643            
644            waitAndTypeByXpath("//input[@name='field67']", "(12-3)");
645            fireEvent("field67", "blur");
646            validateErrorImage(false);
647            clearTextByName("field67");
648            
649            //---------------------------------------------Valid Chars Custom Text------------------------------//
650            waitAndTypeByXpath("//input[@name='field68']", "123.123");
651            fireEvent("field68", "blur");
652            validateErrorImage(true);
653            clearTextByName("field68");
654            
655            waitAndTypeByXpath("//input[@name='field68']", "a.b");
656            fireEvent("field68", "blur");
657            validateErrorImage(true);
658            clearTextByName("field68");
659            
660            waitAndTypeByXpath("//input[@name='field68']", "123 qwe");
661            fireEvent("field68", "blur");
662            validateErrorImage(true);
663            clearTextByName("field68");
664            
665            waitAndTypeByXpath("//input[@name='field68']", "5.a");
666            fireEvent("field68", "blur");
667            validateErrorImage(true);
668            clearTextByName("field68");
669            
670            waitAndTypeByXpath("//input[@name='field68']", "a.0,b.4");
671            fireEvent("field68", "blur");
672            validateErrorImage(true);
673            clearTextByName("field68");
674            
675            waitAndTypeByXpath("//input[@name='field68']", "a.0");
676            fireEvent("field68", "blur");
677            validateErrorImage(false);
678            clearTextByName("field68");
679            passed();
680        }
681            
682        public void validateErrorImage(boolean validateVisible) throws Exception {
683            Thread.sleep(500);
684            for (int second = 0;; second++) {
685                if (second >= 5)
686                    Assert.fail("timeout");
687                try {
688                    if (validateVisible) {
689                        
690                        if (isVisible("img.uif-validationImage"));
691                            break;
692                    } else {
693                        
694                        if (! isVisible("img.uif-validationImage"))
695                            break;
696                    }
697    
698                } catch (Exception e) {}
699                Thread.sleep(1000);
700            }
701            if (validateVisible) {
702                Assert.assertTrue(isVisible("img.uif-validationImage"));
703            } else {
704                Assert.assertTrue(! isVisible("img.uif-validationImage"));
705            }        
706        }
707    }