Author: niallp
Date: Fri Dec  8 16:33:59 2006
New Revision: 484865

URL: http://svn.apache.org/viewvc?view=rev&rev=484865
Log:
VALIDATOR-214 - New Regular Expression validator using JDK 1.4's Regex

Added:
    
jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java
   (with props)
    
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java
   (with props)
Modified:
    
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RoutinesTestSuite.java

Added: 
jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java?view=auto&rev=484865
==============================================================================
--- 
jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java
 (added)
+++ 
jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java
 Fri Dec  8 16:33:59 2006
@@ -0,0 +1,452 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.validator.routines;
+
+import java.io.Serializable;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+/**
+ * Regular Expression validator (using JDK 1.4+ regex support).
+ * <p>
+ * This validator provides convenient regular expression validation
+ * in one of two ways:
+ *
+ * <h4>1. One Off validation using the static methods<h4>
+ * <ul>
+ *   <li>Validate <code>true</code> or <code>false</code>:</li>
+ *   <ul>
+ *     <li><code>boolean valid = RegexValidator.isValid(value, 
regex);</code></li>
+ *     <li><code>boolean valid = RegexValidator.isValid(value, regex, 
caseSensitive);</code></li>
+ *   </ul>
+ *   <li>Validate returning an aggregated String of the matched groups:</li>
+ *   <ul>
+ *     <li><code>String result = RegexValidator.validate(value, 
regex);</code></li>
+ *     <li><code>String result = RegexValidator.validate(value, regex, 
caseSensitive);</code></li>
+ *   </ul>
+ *   <li>Validate returning the matched groups:</li>
+ *   <ul>
+ *     <li><code>String[] result = RegexValidator.match(value, 
regex);</code></li>
+ *     <li><code>String[] result = RegexValidator.match(value, regex, 
caseSensitive);</code></li>
+ *   </ul>
+ * </ul>
+ *
+ * <h4>2. Re-using cached instances validating against one or more regular 
expression<h4>
+ * Construct the validator either for a single regular expression or a set 
(array) of 
+ * regular expressions. By default validation is <i>case sensitive</i> but 
constructors
+ * are provided to allow  <i>case in-sensitive</i> validation. For example to 
create
+ * a validator which does <i><i>case in-sensitive</i> validation for a set of 
regular
+ * expressions:
+ * <pre>
+ *         String[] regexs = new String[] {...};
+ *         RegexValidator validator = new RegexValidator(regexs, false);
+ * </pre>
+ * <p>
+ * <ul>
+ *   <li>Validate <code>true</code> or <code>false</code>:</li>
+ *   <ul>
+ *     <li><code>boolean valid = validator.isValid(value);</code></li>
+ *   </ul>
+ *   <li>Validate returning an aggregated String of the matched groups:</li>
+ *   <ul>
+ *     <li><code>String result = validator.validate(value);</code></li>
+ *   </ul>
+ *   <li>Validate returning the matched groups:</li>
+ *   <ul>
+ *     <li><code>String[] result = validator.match(value);</code></li>
+ *   </ul>
+ * </ul>
+ * <p>
+ * Cached instances pre-compile and re-use [EMAIL PROTECTED] Pattern}(s) - 
which according
+ * to the [EMAIL PROTECTED] Pattern} API are safe to use in a multi-threaded 
environment.
+ *
+ * @version $Revision$ $Date$
+ * @since Validator 1.4
+ */
+public final class RegexValidator implements Serializable {
+
+    private static final String MISSING_REGEX = "Regular Expression is 
missing";
+    private Pattern   pattern;
+    private Pattern[] patterns;
+
+    /**
+     * Construct a <i>case sensitive</i> validator for a single
+     * regular expression.
+     *
+     * @param regex The regular expression this validator will
+     * validate against
+     */
+    public RegexValidator(String regex) {
+        this(regex, 0);
+    }
+
+    /**
+     * Construct a validator for a single regular expression
+     * with the specified case sensitivity.
+     *
+     * @param regex The regular expression this validator will
+     * validate against
+     * @param caseSensitive when <code>true</code> matching is <i>case
+     * sensitive</i>, otherwise matching is <i>case in-sensitive</i>
+     */
+    public RegexValidator(String regex, boolean caseSensitive) {
+        this(regex, (caseSensitive ? 0 : Pattern.CASE_INSENSITIVE));
+    }
+
+    /**
+     * Construct a validator for a single regular expression with
+     * the specified flags.
+     *
+     * @param regex The regular expression this validator will
+     * validate against
+     * @param flags Bit mask of matching flags - see [EMAIL PROTECTED] 
Pattern} for values
+     */
+    private RegexValidator(String regex, int flags) {
+        if (regex == null || regex.length() == 0) {
+            throw new IllegalArgumentException(MISSING_REGEX);
+        }
+        pattern = Pattern.compile(regex, flags);
+    }
+
+    /**
+     * Construct a <i>case sensitive</i> validator for a set
+     * of regular expressions.
+     *
+     * @param regexs The set of regular expressions this validator will
+     * validate against
+     */
+    public RegexValidator(String[] regexs) {
+        this(regexs, 0);
+    }
+
+    /**
+     * Construct a validator for a set of regular expressions
+     * with the specified case sensitivity.
+     *
+     * @param regexs The set of regular expressions this validator will
+     * validate against
+     * @param caseSensitive when <code>true</code> matching is <i>case
+     * sensitive</i>, otherwise matching is <i>case in-sensitive</i>
+     */
+    public RegexValidator(String[] regexs, boolean caseSensitive) {
+        this(regexs, (caseSensitive ? 0: Pattern.CASE_INSENSITIVE));
+    }
+
+    /**
+     * Construct a validator for a set of regular expressions
+     * the specified flags.
+     *
+     * @param regexs The set of regular expressions this validator will
+     * validate against
+     * @param flags Bit mask of matching flags - see [EMAIL PROTECTED] 
Pattern} for values
+     */
+    private RegexValidator(String[] regexs, int flags) {
+        if (regexs == null || regexs.length == 0) {
+            throw new IllegalArgumentException("Regular expressions are 
missing");
+        }
+        patterns = new Pattern[regexs.length];
+        for (int i = 0; i < regexs.length; i++) {
+            if (regexs[i] == null || regexs[i].length() == 0) {
+                throw new IllegalArgumentException("Regular expression[" + i + 
"] is missing");
+            }
+            patterns[i] =  Pattern.compile(regexs[i], flags);
+        }
+    }
+
+    /**
+     * Validate a value against the set of regular expressions.
+     *
+     * @param value The value to validate.
+     * @return <code>true</code> if the value is valid 
+     * otherwise <code>false</code>.
+     */
+    public boolean isValid(String value) {
+        if (value == null) {
+            return false;
+        } else if (pattern != null) {
+            return pattern.matcher(value).matches();
+        } else {
+            for (int i = 0; i < patterns.length; i++) {
+                if (patterns[i].matcher(value).matches()) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Validate a value against a regular expression
+     * (<i>case sensitive</i>).
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @return <code>true</code> if the value is valid 
+     * otherwise <code>false</code>.
+     */
+    public static boolean isValid(String value, String regex) {
+        return RegexValidator.isValid(value, regex, 0);
+    }
+
+    /**
+     * Validate a value against a regular expression
+     * with the specified case sensitivity.
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @param caseSensitive when <code>true</code> matching is <i>case
+     * sensitive</i>, otherwise matching is <i>case in-sensitive</i>
+     * @return <code>true</code> if the value is valid 
+     * otherwise <code>false</code>.
+     */
+    public static boolean isValid(String value, String regex, boolean 
caseSensitive) {
+        int flags = caseSensitive ?  0 : Pattern.CASE_INSENSITIVE;
+        return RegexValidator.isValid(value, regex, flags);
+    }
+
+    /**
+     * Validate a value against a regular expression with the
+     * specified flags.
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @param flags Bit mask of matching flags - see [EMAIL PROTECTED] 
Pattern} for values
+     * @return <code>true</code> if the value is valid 
+     * otherwise <code>false</code>.
+     */
+    private static boolean isValid(String value, String regex, int flags) {
+        if (regex == null || regex.length() == 0) {
+            throw new IllegalArgumentException(MISSING_REGEX);
+        }
+        if (value == null) {
+            return false;
+        } else {
+            return Pattern.compile(regex, flags).matcher(value).matches();
+        }
+    }
+
+    /**
+     * Validate a value against the set of regular expressions
+     * returning the array of matched groups.
+     *
+     * @param value The value to validate.
+     * @return String array of the <i>groups</i> matched if
+     * valid or <code>null</code> if invalid 
+     */
+    public String[] match(String value) {
+        if (value == null) {
+            return null;
+        } else if (pattern != null) {
+            return RegexValidator.match(value, pattern);
+        } else {
+            String[] result = null;
+            for (int i = 0; i < patterns.length; i++) {
+                result = RegexValidator.match(value, patterns[i]);
+                if (result != null) {
+                    return result;
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Validate a value against the specified regular expression
+     * returning the matched groups (<i>case sensitive</i>).
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @return String array of the <i>groups</i> matched if
+     * valid or <code>null</code> if invalid 
+     */
+    public static String[] match(String value, String regex) {
+        return RegexValidator.match(value, regex, 0);
+    }
+
+    /**
+     * Validate a value against a regular expression with the
+     * specified <i>case sensitivity</i> returning the matched groups.
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @param caseSensitive when <code>true</code> matching is <i>case
+     * sensitive</i>, otherwise matching is <i>case in-sensitive</i>
+     * @return String array of the <i>groups</i> matched if
+     * valid or <code>null</code> if invalid 
+     */
+    public static String[] match(String value, String regex, boolean 
caseSensitive) {
+        int flags = caseSensitive ?  0 : Pattern.CASE_INSENSITIVE;
+        return RegexValidator.match(value, regex, flags);
+    }
+
+    /**
+     * Validate a value against a regular expression with the
+     * specified flags returning the matched groups.
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @param caseSensitive when <code>true</code> matching is <i>case
+     * sensitive</i>, otherwise matching is <i>case in-sensitive</i>
+     * @return String array of the <i>groups</i> matched if
+     * valid or <code>null</code> if invalid 
+     */
+    private static String[] match(String value, String regex, int flags) {
+        if (regex == null || regex.length() == 0) {
+            throw new IllegalArgumentException(MISSING_REGEX);
+        }
+        if (value == null) {
+            return null;
+        }
+        return RegexValidator.match(value, Pattern.compile(regex, flags));
+    }
+
+    /**
+     * Validate a value against the specified pattern
+     * returning the matched groups.
+     *
+     * @param value Value to validate
+     * @param pattern The pattern to match against.
+     * @return String array of the <i>groups</i> matched if
+     * valid or <code>null</code> if invalid 
+     */
+    private static String[] match(String value, Pattern pattern) {
+        Matcher matcher = pattern.matcher(value);
+        if (matcher.matches()) {
+            int count = matcher.groupCount();
+            String[] groups = new String[count];
+            for (int i = 0; i < count; i++) {
+                groups[i] = matcher.group(i+1);
+            }
+            return groups;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Validate a value against the set of regular expressions
+     * returning a String value of the aggregated groups.
+     *
+     * @param value The value to validate.
+     * @return Aggregated String value comprised of the
+     * <i>groups</i> matched if valid or <code>null</code> if invalid
+     */
+    public String validate(String value) {
+        if (value == null) {
+            return null;
+        } else if (pattern != null) {
+            return RegexValidator.validate(value, pattern);
+        } else {
+            String result = null;
+            for (int i = 0; i < patterns.length; i++) {
+                result = RegexValidator.validate(value, patterns[i]);
+                if (result != null) {
+                    return result;
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Validate a value against the specified regular expression
+     * returning a String value of the aggregated groups
+     * (<i>case sensitive</i>).
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @return Aggregated String value comprised of the
+     * <i>groups</i> matched if valid or <code>null</code> if invalid
+     */
+    public static String validate(String value, String regex) {
+        return RegexValidator.validate(value, regex, 0);
+    }
+
+    /**
+     * Validate a value against a regular expression with the
+     * specified <i>case sensitivity</i> returning a String
+     * value of the aggregated groups.
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @param caseSensitive when <code>true</code> matching is <i>case
+     * sensitive</i>, otherwise matching is <i>case in-sensitive</i>
+     * @return Aggregated String value comprised of the
+     * <i>groups</i> matched if valid or <code>null</code> if invalid
+     */
+    public static String validate(String value, String regex, boolean 
caseSensitive) {
+        int flags = caseSensitive ?  0 : Pattern.CASE_INSENSITIVE;
+        return RegexValidator.validate(value, regex, flags);
+    }
+
+    /**
+     * Validate a value against a regular expression with the
+     * specified flags returning a String value of the aggregated
+     * groups.
+     *
+     * @param value Value to validate
+     * @param regex The regular expression to validate against.
+     * @param flags Bit mask of matching flags - see [EMAIL PROTECTED] 
Pattern} for values
+     * @return Aggregated String value comprised of the
+     * <i>groups</i> matched if valid or <code>null</code> if invalid
+     */
+    private static String validate(String value, String regex, int flags) {
+        if (regex == null || regex.length() == 0) {
+            throw new IllegalArgumentException(MISSING_REGEX);
+        }
+        if (value == null) {
+            return null;
+        }
+        return RegexValidator.validate(value, Pattern.compile(regex, flags));
+    }
+
+    /**
+     * Validate a value against the specified pattern
+     * returning a String value of the aggregated groups.
+     *
+     * @param value Value to validate
+     * @param pattern The pattern to validate against.
+     * @return Aggregated String value comprised of the
+     * <i>groups</i> matched if valid or <code>null</code> if invalid
+     */
+    private static String validate(String value, Pattern pattern) {
+        Matcher matcher = pattern.matcher(value);
+        if (matcher.matches()) {
+            int count = matcher.groupCount();
+            StringBuffer buffer = new StringBuffer();
+            for (int i = 0; i < count; i++) {
+                buffer.append(matcher.group(i+1));
+            }
+            return buffer.toString();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Provide a String representation of this validator.
+     * @return A String representation of this validator
+     */
+    public String toString() {
+        if (pattern != null) {
+            return "RegexValidator{" + pattern.toString() + "}";
+        } else {
+            return "RegexValidator[" + patterns.length + "]";
+        }
+    }
+
+}

Propchange: 
jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/validator/trunk/src/share/org/apache/commons/validator/routines/RegexValidator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java?view=auto&rev=484865
==============================================================================
--- 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java
 (added)
+++ 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java
 Fri Dec  8 16:33:59 2006
@@ -0,0 +1,376 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.validator.routines;
+
+import java.util.regex.PatternSyntaxException;
+
+import junit.framework.TestCase;
+
+/**
+ * Test Case for RegexValidatorTest.
+ *
+ * @version $Revision$ $Date$
+ * @since Validator 1.4
+ */
+public class RegexValidatorTest extends TestCase {
+
+    private static final String MISSING_REGEX = "Regular Expression is 
missing";
+    private static final String REGEX         = 
"^([abc]*)(?:\\-)([DEF]*)(?:\\-)([123])*$";
+
+    private static final String COMPONENT_1 = "([abc]{3})";
+    private static final String COMPONENT_2 = "([DEF]{3})";
+    private static final String COMPONENT_3 = "([123]{3})";
+    private static final String SEPARATOR_1  = "(?:\\-)";
+    private static final String SEPARATOR_2  = "(?:\\s)";
+    private static final String REGEX_1 = "^" + COMPONENT_1 + SEPARATOR_1 + 
COMPONENT_2 + SEPARATOR_1 + COMPONENT_3 + "$";
+    private static final String REGEX_2 = "^" + COMPONENT_1 + SEPARATOR_2 + 
COMPONENT_2 + SEPARATOR_2 + COMPONENT_3 + "$";
+    private static final String REGEX_3 = "^" + COMPONENT_1 + COMPONENT_2 + 
COMPONENT_3 + "$";
+    private static final String[] MULTIPLE_REGEX = new String[] {REGEX_1, 
REGEX_2, REGEX_3};
+
+    /**
+     * Constrct a new test case.
+     * @param name The name of the test
+     */
+    public RegexValidatorTest(String name) {
+        super(name);
+    }
+
+    /**
+     * Set Up.
+     */
+    protected void setUp() throws Exception {
+        super.setUp();
+    }
+
+    /**
+     * Tear Down.
+     */
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    /**
+     * Test static methods.
+     */
+    public void testStatic() {
+
+        // isValid()
+        assertEquals("Sensitive isValid() valid",     true,   
RegexValidator.isValid("ac-DE-1",  REGEX));
+        assertEquals("Sensitive isValid() invalid",   false,  
RegexValidator.isValid("AB-de-1",  REGEX));
+        assertEquals("Insensitive isValid() valid",   true,   
RegexValidator.isValid("AB-de-1",  REGEX, false));
+        assertEquals("Insensitive isValid() invalid", false,  
RegexValidator.isValid("ABd-de-1", REGEX, false));
+
+        // validate()
+        assertEquals("Sensitive validate() valid",     "acDE1", 
RegexValidator.validate("ac-DE-1",  REGEX));
+        assertEquals("Sensitive validate() invalid",   null,    
RegexValidator.validate("AB-de-1",  REGEX));
+        assertEquals("Insensitive validate() valid",   "ABde1", 
RegexValidator.validate("AB-de-1",  REGEX, false));
+        assertEquals("Insensitive validate() invalid", null,    
RegexValidator.validate("ABd-de-1", REGEX, false));
+
+        // match()
+        checkArray("Sensitive match() valid",     new String[] {"ac", "DE", 
"1"}, RegexValidator.match("ac-DE-1",  REGEX));
+        checkArray("Sensitive match() invalid",   null,                        
   RegexValidator.match("AB-de-1",  REGEX));
+        checkArray("Insensitive match() valid",   new String[] {"AB", "de", 
"1"}, RegexValidator.match("AB-de-1",  REGEX, false));
+        checkArray("Insensitive match() invalid", null,                        
   RegexValidator.match("ABd-de-1", REGEX, false));
+    }
+
+    /**
+     * Test instance methods with single regular expression.
+     */
+    public void testInstanceSingle() {
+        RegexValidator sensitive   = new RegexValidator(REGEX);
+        RegexValidator insensitive = new RegexValidator(REGEX, false);
+
+        // isValid()
+        assertEquals("Sensitive isValid() valid",     true,   
sensitive.isValid("ac-DE-1"));
+        assertEquals("Sensitive isValid() invalid",   false,  
sensitive.isValid("AB-de-1"));
+        assertEquals("Insensitive isValid() valid",   true,   
insensitive.isValid("AB-de-1"));
+        assertEquals("Insensitive isValid() invalid", false,  
insensitive.isValid("ABd-de-1"));
+
+        // validate()
+        assertEquals("Sensitive validate() valid",     "acDE1", 
sensitive.validate("ac-DE-1"));
+        assertEquals("Sensitive validate() invalid",   null,    
sensitive.validate("AB-de-1"));
+        assertEquals("Insensitive validate() valid",   "ABde1", 
insensitive.validate("AB-de-1"));
+        assertEquals("Insensitive validate() invalid", null,    
insensitive.validate("ABd-de-1"));
+
+        // match()
+        checkArray("Sensitive match() valid",     new String[] {"ac", "DE", 
"1"}, sensitive.match("ac-DE-1"));
+        checkArray("Sensitive match() invalid",   null,                        
   sensitive.match("AB-de-1"));
+        checkArray("Insensitive match() valid",   new String[] {"AB", "de", 
"1"}, insensitive.match("AB-de-1"));
+        checkArray("Insensitive match() invalid", null,                        
   insensitive.match("ABd-de-1"));
+    }
+
+    /**
+     * Test instance methods with multiple regular expressions.
+     */
+    public void testInstanceMultipleSensitive() {
+
+        // ------------ Set up Sensitive Validators
+        RegexValidator multiple   = new RegexValidator(MULTIPLE_REGEX);
+        RegexValidator single1   = new RegexValidator(REGEX_1);
+        RegexValidator single2   = new RegexValidator(REGEX_2);
+        RegexValidator single3   = new RegexValidator(REGEX_3);
+
+        // ------------ Set up test values
+        String value = "aac FDE 321";
+        String expect = "aacFDE321";
+        String[] array = new String[] {"aac", "FDE", "321"};
+
+        // isValid()
+        assertEquals("Sensitive isValid() Multiple", true,  
multiple.isValid(value));
+        assertEquals("Sensitive isValid() 1st",      false, 
single1.isValid(value));
+        assertEquals("Sensitive isValid() 2nd",      true,  
single2.isValid(value));
+        assertEquals("Sensitive isValid() 3rd",      false, 
single3.isValid(value));
+
+        // validate()
+        assertEquals("Sensitive validate() Multiple", expect, 
multiple.validate(value));
+        assertEquals("Sensitive validate() 1st",      null,   
single1.validate(value));
+        assertEquals("Sensitive validate() 2nd",      expect, 
single2.validate(value));
+        assertEquals("Sensitive validate() 3rd",      null,   
single3.validate(value));
+
+        // match()
+        checkArray("Sensitive match() Multiple", array, multiple.match(value));
+        checkArray("Sensitive match() 1st",      null,  single1.match(value));
+        checkArray("Sensitive match() 2nd",      array, single2.match(value));
+        checkArray("Sensitive match() 3rd",      null,  single3.match(value));
+
+        // All invalid
+        value = "AAC*FDE*321";
+        assertEquals("isValid() Invalid",  false, multiple.isValid(value));
+        assertEquals("validate() Invalid", null,  multiple.validate(value));
+        assertEquals("match() Multiple",   null,  multiple.match(value));
+    }
+
+    /**
+     * Test instance methods with multiple regular expressions.
+     */
+    public void testInstanceMultipleInsensitive() {
+
+        // ------------ Set up In-sensitive Validators
+        RegexValidator multiple = new RegexValidator(MULTIPLE_REGEX, false);
+        RegexValidator single1   = new RegexValidator(REGEX_1, false);
+        RegexValidator single2   = new RegexValidator(REGEX_2, false);
+        RegexValidator single3   = new RegexValidator(REGEX_3, false);
+
+        // ------------ Set up test values
+        String value = "AAC FDE 321";
+        String expect = "AACFDE321";
+        String[] array = new String[] {"AAC", "FDE", "321"};
+
+        // isValid()
+        assertEquals("isValid() Multiple", true,  multiple.isValid(value));
+        assertEquals("isValid() 1st",      false, single1.isValid(value));
+        assertEquals("isValid() 2nd",      true,  single2.isValid(value));
+        assertEquals("isValid() 3rd",      false, single3.isValid(value));
+
+        // validate()
+        assertEquals("validate() Multiple", expect, multiple.validate(value));
+        assertEquals("validate() 1st",      null,   single1.validate(value));
+        assertEquals("validate() 2nd",      expect, single2.validate(value));
+        assertEquals("validate() 3rd",      null,   single3.validate(value));
+
+        // match()
+        checkArray("match() Multiple", array, multiple.match(value));
+        checkArray("match() 1st",      null,  single1.match(value));
+        checkArray("match() 2nd",      array, single2.match(value));
+        checkArray("match() 3rd",      null,  single3.match(value));
+
+        // All invalid
+        value = "AAC*FDE*321";
+        assertEquals("isValid() Invalid",  false, multiple.isValid(value));
+        assertEquals("validate() Invalid", null,  multiple.validate(value));
+        assertEquals("match() Multiple",   null,  multiple.match(value));
+    }
+
+    /**
+     * Test Null value
+     */
+    public void testNullValue() {
+
+        // Test instance methods
+        RegexValidator validator = new RegexValidator(REGEX);
+        assertEquals("Instance isValid()",  false, validator.isValid(null));
+        assertEquals("Instance validate()", null,  validator.validate(null));
+        assertEquals("Instance match()",    null,  validator.match(null));
+
+        // Test static methods
+        assertEquals("Static isValid()",  false, RegexValidator.isValid(null, 
REGEX));
+        assertEquals("Static validate()", null,  RegexValidator.validate(null, 
REGEX));
+        assertEquals("Static match()",    null,  RegexValidator.match(null, 
REGEX));
+    }
+
+    /**
+     * Test exceptions
+     */
+    public void testStaicMissingRegex() {
+
+        // isValid() - Null regular expression
+        try {
+            RegexValidator.isValid("abc", null);
+            fail("isValid Null - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("isValid Null", MISSING_REGEX, e.getMessage());
+        }
+
+        // validate() - Null regular expression
+        try {
+            RegexValidator.validate("abc", null);
+            fail("validate Null - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("validate Null", MISSING_REGEX, e.getMessage());
+        }
+
+        // match() - Null regular expression
+        try {
+            RegexValidator.match("abc", null);
+            fail("match Null - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("match Null", MISSING_REGEX, e.getMessage());
+        }
+
+        // isValid() - Zero Length regular expression
+        try {
+            RegexValidator.isValid("abc", "");
+            fail("isValid Zero Length - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("isValid Zero Length", MISSING_REGEX, e.getMessage());
+        }
+
+        // validate() - Zero Length regular expression
+        try {
+            RegexValidator.validate("abc", "");
+            fail("validate Zero Length - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("validate Zero Length", MISSING_REGEX, 
e.getMessage());
+        }
+
+        // match() - Zero Length regular expression
+        try {
+            RegexValidator.match("abc", "");
+            fail("match Zero Length - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("match Zero Length", MISSING_REGEX, e.getMessage());
+        }
+    }
+
+    /**
+     * Test exceptions
+     */
+    public void testInstanceMissingRegex() {
+
+        // Single Regular Expression - null
+        try {
+            new RegexValidator((String)null);
+            fail("Single Null - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Single Null", MISSING_REGEX, e.getMessage());
+        }
+
+        // Single Regular Expression - Zero Length
+        try {
+            new RegexValidator("");
+            fail("Single Zero Length - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Single Zero Length", MISSING_REGEX, e.getMessage());
+        }
+
+        // Multiple Regular Expression - Null array
+        try {
+            new RegexValidator((String[])null);
+            fail("Null Array - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Null Array", "Regular expressions are missing", 
e.getMessage());
+        }
+
+        // Multiple Regular Expression - Zero Length array
+        try {
+            new RegexValidator(new String[0]);
+            fail("Zero Length Array - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Zero Length Array", "Regular expressions are 
missing", e.getMessage());
+        }
+
+        // Multiple Regular Expression - Array has Null
+        String[] expressions = new String[] {"ABC", null};
+        try {
+            new RegexValidator(expressions);
+            fail("Array has Null - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Array has Null", "Regular expression[1] is missing", 
e.getMessage());
+        }
+
+        // Multiple Regular Expression - Array has Zero Length
+        expressions = new String[] {"", "ABC"};
+        try {
+            new RegexValidator(expressions);
+            fail("Array has Zero Length - expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            assertEquals("Array has Zero Length", "Regular expression[0] is 
missing", e.getMessage());
+        }
+    }
+
+    /**
+     * Test exceptions
+     */
+    public void testExceptions() {
+        String invalidRegex = "^([abCD12]*$";
+        try {
+            RegexValidator.isValid("ab", invalidRegex);
+        } catch (PatternSyntaxException e) {
+            // expected
+        }
+    }
+
+    /**
+     * Test toString() method
+     */
+    public void testToString() {
+        RegexValidator single = new RegexValidator(REGEX);
+        assertEquals("Single", "RegexValidator{" + REGEX + "}", 
single.toString());
+
+        RegexValidator multiple = new RegexValidator(new String[] {REGEX, 
REGEX});
+        assertEquals("Multiple", "RegexValidator[2]", multiple.toString());
+    }
+
+    /**
+     * Compare two arrays
+     * @param label Label for the test
+     * @param expect Expected array
+     * @param result Actual array
+     */
+    private void checkArray(String label, String[] expect, String[] result) {
+
+        // Handle nulls
+        if (expect == null || result == null) {
+            if (expect == null && result == null) {
+                return; // valid, both null
+            } else {
+                fail(label + " Null expect=" + expect + " result=" + result);
+            }
+        }
+
+        // Check Length
+        if (expect.length != result.length) {
+            fail(label + " Length expect=" + expect.length + " result=" + 
result.length);
+        }
+
+        // Check Values
+        for (int i = 0; i < expect.length; i++) {
+            assertEquals(label +" value[" + i + "]", expect[i], result[i]);
+        }
+    }
+
+}

Propchange: 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RegexValidatorTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RoutinesTestSuite.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RoutinesTestSuite.java?view=diff&rev=484865&r1=484864&r2=484865
==============================================================================
--- 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RoutinesTestSuite.java
 (original)
+++ 
jakarta/commons/proper/validator/trunk/src/test/org/apache/commons/validator/routines/RoutinesTestSuite.java
 Fri Dec  8 16:33:59 2006
@@ -52,6 +52,7 @@
        suite.addTestSuite(IntegerValidatorTest.class);
        suite.addTestSuite(LongValidatorTest.class);
        suite.addTestSuite(PercentValidatorTest.class);
+       suite.addTestSuite(RegexValidatorTest.class);
        suite.addTestSuite(ShortValidatorTest.class);
        suite.addTestSuite(TimeValidatorTest.class);
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to