LANG-1300: changed CharSequence lastIndexOf for Supplementary Characters

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

Branch: refs/heads/master
Commit: b45435c950e6f6864671bdffde29e26cdc8ce15b
Parents: 12e597a
Author: MarkDacek <mark.da...@richmond.edu>
Authored: Wed Mar 8 23:18:10 2017 -0500
Committer: MarkDacek <mark.da...@richmond.edu>
Committed: Wed Mar 8 23:18:10 2017 -0500

----------------------------------------------------------------------
 .../apache/commons/lang3/CharSequenceUtils.java | 26 ++++++++++++++------
 .../lang3/StringUtilsEqualsIndexOfTest.java     | 11 +++++++++
 2 files changed, 29 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/b45435c9/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 cc39202..01cbca7 100644
--- a/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
+++ b/src/main/java/org/apache/commons/lang3/CharSequenceUtils.java
@@ -153,15 +153,25 @@ public class CharSequenceUtils {
         //NOTE - we must do a forward traversal for this to avoid duplicating 
code points
         if (searchChar <= Character.MAX_CODE_POINT) {
             char[] chars = Character.toChars(searchChar);
-            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;
-                    }
+            //make sure it's not the last index
+            if (start == sz - 1) {
+                return NOT_FOUND;
+            }
+            int maxInd = -1;
+            int ind = 0;
+            for (int i = 0; i < cs.length() - 1; i++) {
+                char high = cs.charAt(i);
+                char low = cs.charAt(i + 1);
+                if (chars[0] == high && chars[1] == low) {
+                    maxInd = ind;
+                    i++;
+                } else if (Character.isSurrogatePair(high, low)) {
+                    i++; //skip over one
                 }
+                ind++;
+            }
+            if (maxInd >= start) {
+                return maxInd;
             }
         }
         return NOT_FOUND;

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/b45435c9/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java 
b/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
index 8326061..701f022 100644
--- a/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
+++ b/src/test/java/org/apache/commons/lang3/StringUtilsEqualsIndexOfTest.java
@@ -545,11 +545,22 @@ public class StringUtilsEqualsIndexOfTest  {
        StringBuilder builder = new StringBuilder();
        builder.appendCodePoint(CODE_POINT);
        assertEquals(0, StringUtils.lastIndexOf(builder, CODE_POINT, 0));
+       builder.appendCodePoint(CODE_POINT);
+       assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 0));
+       assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 1));
+
+
+       builder.append("aaaaa");
+       assertEquals(-1, StringUtils.lastIndexOf(builder, CODE_POINT, 4));
        //inner branch on the supplementary character block
        char[] tmp = {(char) 55361};
        builder = new StringBuilder();
        builder.append(tmp);
        assertEquals(-1, StringUtils.lastIndexOf(builder, CODE_POINT, 0));
+       builder.appendCodePoint(CODE_POINT);
+       assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 0 ));
+        assertEquals(1, StringUtils.lastIndexOf(builder, CODE_POINT, 1 ));
+
     }
 
     @Test

Reply via email to