fixed CharSequenceUtils to check for supplementary chars

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

Branch: refs/heads/master
Commit: b5f5449cf338376d12404d0190054525987f4276
Parents: cde4c52
Author: MarkDacek <mark.da...@richmond.edu>
Authored: Sat Mar 4 23:16:44 2017 -0500
Committer: MarkDacek <mark.da...@richmond.edu>
Committed: Sat Mar 4 23:16:44 2017 -0500

----------------------------------------------------------------------
 .../apache/commons/lang3/CharSequenceUtils.java | 34 ++++++++++++++++----
 .../commons/lang3/CharSequenceUtilsTest.java    | 16 +++++++++
 2 files changed, 43 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/b5f5449c/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java 
b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
index 007449e..6d1403b 100644
--- a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
+++ b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
@@ -75,10 +75,27 @@ public class CharSequenceUtils {
         if (start < 0) {
             start = 0;
         }
-        for (int i = start; i < sz; i++) {
-            if (cs.charAt(i) == searchChar) {
-                return i;
-            }
+        if(searchChar < Character.MIN_SUPPLEMENTARY_CODE_POINT){
+               for (int i = start; i < sz; i++) {
+                       if (cs.charAt(i) == searchChar) {
+                               return i;
+                       }
+               }
+        }
+        
+        //supplementary characters
+        if(searchChar <= Character.MAX_CODE_POINT){
+               char[] chars = Character.toChars(searchChar);
+               for(int i = start; i < sz; i++){
+                       if(cs.charAt(i) == chars[0]){
+                               if(i+1 == sz){
+                                       break;
+                               }
+                               if(cs.charAt(i+1) == chars[1]){
+                                       return i;
+                               }
+                       }
+               }
         }
         return NOT_FOUND;
     }
@@ -134,9 +151,12 @@ public class CharSequenceUtils {
         
         if(searchChar <= Character.MAX_CODE_POINT){
             char[] chars = Character.toChars(searchChar);
-            for(int i = start; i>0; --i){
-               if(cs.charAt(i) == chars[1]){
-                       if(cs.charAt(i-1) == chars[0]){
+            for(int i = start; i >= 0; --i){
+               if(cs.charAt(i) == chars[0]){
+                       if(i + 1 == cs.length()){
+                               break;
+                       }
+                       if(cs.charAt(i+1) == chars[1]){
                                return i;
                        }
                }

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/b5f5449c/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java 
b/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java
index 6ab9aae..a9acaf7 100644
--- a/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/CharSequenceUtilsTest.java
@@ -188,5 +188,21 @@ public class CharSequenceUtilsTest {
         assertArrayEquals(expected, CharSequenceUtils.toCharArray(builder));
         assertArrayEquals(expected, 
CharSequenceUtils.toCharArray(builder.toString()));
     }
+    
+    @Test
+    public void testLastIndexOfSupplementaryCharacters(){
+       final int CODE_POINT = 0x2070E;
+       StringBuilder builder = new StringBuilder();
+       builder.appendCodePoint(CODE_POINT);
+       assertEquals(0, CharSequenceUtils.lastIndexOf(builder, CODE_POINT, 0));
+    }
+    
+    @Test
+    public void testIndexOfSupplementaryCharacters(){
+       final int CODE_POINT = 0x2070E;
+       StringBuilder builder = new StringBuilder();
+       builder.appendCodePoint(CODE_POINT);
+       assertEquals(0, CharSequenceUtils.indexOf(builder, CODE_POINT, 0));
+    }
 
 }

Reply via email to