You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2011/04/07 07:22:01 UTC

svn commit: r1089742 - /commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringUtilsTest.java

Author: bayard
Date: Thu Apr  7 05:22:01 2011
New Revision: 1089742

URL: http://svn.apache.org/viewvc?rev=1089742&view=rev
Log:
Adding a test to enforce the CharSequence vs String contract for StringUtils. LANG-687

Modified:
    commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringUtilsTest.java

Modified: commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringUtilsTest.java?rev=1089742&r1=1089741&r2=1089742&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringUtilsTest.java (original)
+++ commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/StringUtilsTest.java Thu Apr  7 05:22:01 2011
@@ -17,6 +17,7 @@
 package org.apache.commons.lang3;
 
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.nio.CharBuffer;
 import java.util.Arrays;
@@ -1887,4 +1888,32 @@ public class StringUtilsTest extends Tes
         assertEquals("12",StringUtils.stripEnd("120.00", ".0"));
         assertEquals("121",StringUtils.stripEnd("121.00", ".0"));
     }
+
+    // Methods on StringUtils that are immutable in spirit (i.e. calculate the length) 
+    // should take a CharSequence parameter. Methods that are mutable in spirit (i.e. capitalize) 
+    // should take a String or String[] parameter and return String or String[].
+    // This test enforces that this is done.
+    public void testStringUtilsCharSequenceContract() {
+        Class c = StringUtils.class;
+        Method[] methods = c.getMethods();
+        for (int i=0; i<methods.length; i++) {
+            Method m = methods[i];
+            if (m.getReturnType() == String.class || m.getReturnType() == String[].class) {
+                // Assume this is mutable and ensure the first parameter is not CharSequence.
+                // It may be String or it may be something else (String[], Object, Object[]) so 
+                // don't actively test for that.
+                Class[] params = m.getParameterTypes();
+                if ( params.length > 0 && (params[0] == CharSequence.class || params[0] == CharSequence[].class)) {
+                    fail("The method " + m + " appears to be mutable in spirit and therefore must not accept a CharSequence");
+                }
+            } else {
+                // Assume this is immutable in spirit and ensure the first parameter is not String.
+                // As above, it may be something other than CharSequence.
+                Class[] params = m.getParameterTypes();
+                if ( params.length > 0 && (params[0] == String.class || params[0] == String[].class)) {
+                    fail("The method " + m + " appears to be immutable in spirit and therefore must not accept a String");
+                }
+            }
+        }
+    }
 }