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)); + } }