Repository: commons-lang
Updated Branches:
  refs/heads/master ebe7bb58a -> ef3015cc9


[LANG-1304] StringUtils method to check for mixed case in string (closes #223)


Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/ef3015cc
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/ef3015cc
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/ef3015cc

Branch: refs/heads/master
Commit: ef3015cc99f7bd51862c1d95014e8332d24c2341
Parents: ebe7bb5
Author: Andy Klimczak <andyklimc...@fastmail.com>
Authored: Thu Dec 29 21:01:12 2016 -0500
Committer: pascalschumacher <pascalschumac...@gmx.net>
Committed: Thu May 25 16:14:46 2017 +0200

----------------------------------------------------------------------
 src/changes/changes.xml                         |  1 +
 .../org/apache/commons/lang3/StringUtils.java   | 41 ++++++++++++++++++++
 .../apache/commons/lang3/StringUtilsTest.java   | 23 +++++++++++
 3 files changed, 65 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/ef3015cc/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 1761d8e..cb2cbf3 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -46,6 +46,7 @@ The <action> type attribute can be add,update,fix,remove.
   <body>
 
   <release version="3.6" date="2017-MM-DD" description="TBD">
+    <action issue="LANG-1304" type="add" dev="pschumacher" due-to="Andy 
Klimczak">Add method in StringUtils to determine if string contains both mixed 
cased characters</action>
     <action issue="LANG-1334" type="update" dev="djones">Deprecate 
CharEncoding in favour of java.nio.charset.StandardCharsets</action>
     <action issue="LANG-1319" type="fix" 
dev="djones">MultilineRecursiveToStringStyle StackOverflowError when object is 
an array</action>
     <action issue="LANG-1325" type="add" dev="kinow" due-to="Arshad 
Basha">Increase test coverage of ToStringBuilder class to 100%</action>

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/ef3015cc/src/main/java/org/apache/commons/lang3/StringUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java 
b/src/main/java/org/apache/commons/lang3/StringUtils.java
index 7134853..7f64322 100644
--- a/src/main/java/org/apache/commons/lang3/StringUtils.java
+++ b/src/main/java/org/apache/commons/lang3/StringUtils.java
@@ -7303,6 +7303,47 @@ public class StringUtils {
         return true;
     }
 
+    /**
+     * <p>Checks if the CharSequence contains mixed casing of both uppercase 
and lowercase characters.</p>
+     *
+     * <p>{@code null} will return {@code false}. An empty CharSequence 
({@code length()=0}) will return
+     * {@code false}.</p>
+     *
+     * <pre>
+     * StringUtils.isMixedCase(null)    = false
+     * StringUtils.isMixedCase("")      = false
+     * StringUtils.isMixedCase("ABC")   = false
+     * StringUtils.isMixedCase("abc")   = false
+     * StringUtils.isMixedCase("aBc")   = true
+     * StringUtils.isMixedCase("A c")   = true
+     * StringUtils.isMixedCase("A1c")   = true
+     * StringUtils.isMixedCase("a/C")   = true
+     * StringUtils.isMixedCase("aC\t")  = true
+     * </pre>
+     *
+     * @param cs the CharSequence to check, may be null
+     * @return {@code true} if the CharSequence contains both uppercase and 
lowercase characters
+     * @since 3.5
+     */
+    public static boolean isMixedCase(final CharSequence cs) {
+        if (isEmpty(cs) || cs.length() == 1) {
+            return false;
+        }
+        boolean containsUppercase = false;
+        boolean containsLowercase = false;
+        final int sz = cs.length();
+        for (int i = 0; i < sz; i++) {
+            if (containsUppercase && containsLowercase) {
+                return true;
+            } else if (Character.isUpperCase(cs.charAt(i))) {
+                containsUppercase = true;
+            } else if (Character.isLowerCase(cs.charAt(i))) {
+                containsLowercase = true;
+            }
+        }
+        return containsUppercase && containsLowercase;
+    }
+
     // Defaults
     //-----------------------------------------------------------------------
     /**

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/ef3015cc/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
index 3051b47..2b49669 100644
--- a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
@@ -2581,6 +2581,29 @@ public class StringUtilsTest {
         assertFalse(StringUtils.isAllUpperCase("A/C"));
     }
 
+    /**
+     * Test for {@link StringUtils#isMixedCase(CharSequence)}.
+     */
+    @Test
+    public void testIsMixedCase() {
+        assertFalse(StringUtils.isMixedCase(null));
+        assertFalse(StringUtils.isMixedCase(StringUtils.EMPTY));
+        assertFalse(StringUtils.isMixedCase(" "));
+        assertFalse(StringUtils.isMixedCase("A"));
+        assertFalse(StringUtils.isMixedCase("a"));
+        assertFalse(StringUtils.isMixedCase("/"));
+        assertFalse(StringUtils.isMixedCase("A/"));
+        assertFalse(StringUtils.isMixedCase("/b"));
+        assertFalse(StringUtils.isMixedCase("abc"));
+        assertFalse(StringUtils.isMixedCase("ABC"));
+        assertTrue(StringUtils.isMixedCase("aBc"));
+        assertTrue(StringUtils.isMixedCase("aBc "));
+        assertTrue(StringUtils.isMixedCase("A c"));
+        assertTrue(StringUtils.isMixedCase("aBc\n"));
+        assertTrue(StringUtils.isMixedCase("A1c"));
+        assertTrue(StringUtils.isMixedCase("a/C"));
+    }
+
     @Test
     public void testRemoveStart() {
         // StringUtils.removeStart("", *)        = ""

Reply via email to