# HG changeset patch # User Jaroslav Tulach # Date 1355680175 -3600 # Node ID 23b4a344fe0287f29d5a501778d0fa8e6b0a7344 # Parent acba19bef0223c02cd83d5464c5eb7c7a03ca063 Implementing basic operations on characters diff -r acba19bef022 -r 23b4a344fe02 emul/src/main/java/java/lang/Character.java --- a/emul/src/main/java/java/lang/Character.java Sun Dec 16 18:48:57 2012 +0100 +++ b/emul/src/main/java/java/lang/Character.java Sun Dec 16 18:49:35 2012 +0100 @@ -25,6 +25,8 @@ package java.lang; +import org.apidesign.bck2brwsr.core.JavaScriptBody; + /** * The {@code Character} class wraps a value of the primitive * type {@code char} in an object. An object of type @@ -1525,7 +1527,7 @@ * @see Character#getType(char) */ public static boolean isLowerCase(char ch) { - throw new UnsupportedOperationException(); + return ch == toLowerCase(ch); } /** @@ -1560,7 +1562,7 @@ * @since 1.0 */ public static boolean isUpperCase(char ch) { - throw new UnsupportedOperationException(); + return ch == toUpperCase(ch); } /** @@ -1676,7 +1678,7 @@ * @see Character#getType(char) */ public static boolean isDigit(char ch) { - return isDigit((int)ch); + return String.valueOf(ch).matches("\\d"); } /** @@ -1710,8 +1712,11 @@ * @since 1.5 */ public static boolean isDigit(int codePoint) { - return getType(codePoint) == Character.DECIMAL_DIGIT_NUMBER; + return fromCodeChars(codePoint).matches("\\d"); } + + @JavaScriptBody(args = "c", body = "return String.fromCharCode(c);") + private native static String fromCodeChars(int codePoint); /** * Determines if a character is defined in Unicode. @@ -1802,7 +1807,7 @@ * @see Character#isUpperCase(char) */ public static boolean isLetter(char ch) { - return isLetter((int)ch); + return String.valueOf(ch).matches("\\w") && !isDigit(ch); } /** @@ -1835,12 +1840,7 @@ * @since 1.5 */ public static boolean isLetter(int codePoint) { - return ((((1 << Character.UPPERCASE_LETTER) | - (1 << Character.LOWERCASE_LETTER) | - (1 << Character.TITLECASE_LETTER) | - (1 << Character.MODIFIER_LETTER) | - (1 << Character.OTHER_LETTER)) >> getType(codePoint)) & 1) - != 0; + return fromCodeChars(codePoint).matches("\\w") && !isDigit(codePoint); } /** @@ -1868,7 +1868,7 @@ * @since 1.0.2 */ public static boolean isLetterOrDigit(char ch) { - return isLetterOrDigit((int)ch); + return String.valueOf(ch).matches("\\w"); } /** @@ -1889,13 +1889,7 @@ * @since 1.5 */ public static boolean isLetterOrDigit(int codePoint) { - return ((((1 << Character.UPPERCASE_LETTER) | - (1 << Character.LOWERCASE_LETTER) | - (1 << Character.TITLECASE_LETTER) | - (1 << Character.MODIFIER_LETTER) | - (1 << Character.OTHER_LETTER) | - (1 << Character.DECIMAL_DIGIT_NUMBER)) >> getType(codePoint)) & 1) - != 0; + return fromCodeChars(codePoint).matches("\\w"); } static int getType(int x) { @@ -1930,7 +1924,7 @@ * @see String#toLowerCase() */ public static char toLowerCase(char ch) { - throw new UnsupportedOperationException(); + return String.valueOf(ch).toLowerCase().charAt(0); } /** @@ -1961,7 +1955,7 @@ * @see String#toUpperCase() */ public static char toUpperCase(char ch) { - throw new UnsupportedOperationException(); + return String.valueOf(ch).toUpperCase().charAt(0); } /** diff -r acba19bef022 -r 23b4a344fe02 emul/src/main/java/java/lang/String.java --- a/emul/src/main/java/java/lang/String.java Sun Dec 16 18:48:57 2012 +0100 +++ b/emul/src/main/java/java/lang/String.java Sun Dec 16 18:49:35 2012 +0100 @@ -2143,6 +2143,12 @@ * @since 1.4 * @spec JSR-51 */ + @JavaScriptBody(args = { "self", "regex" }, body = + "self = self.toString();\n" + + "var re = new RegExp(regex.toString());\n" + + "var r = re.exec(self);\n" + + "return r != null && r.length > 0 && self.length == r[0].length;" + ) public boolean matches(String regex) { throw new UnsupportedOperationException(); } @@ -2555,6 +2561,7 @@ * @return the String, converted to lowercase. * @see java.lang.String#toLowerCase(Locale) */ + @JavaScriptBody(args = "self", body = "return self.toLowerCase();") public String toLowerCase() { throw new UnsupportedOperationException("Should be supported but without connection to locale"); } @@ -2720,6 +2727,7 @@ * @return the String, converted to uppercase. * @see java.lang.String#toUpperCase(Locale) */ + @JavaScriptBody(args = "self", body = "return self.toUpperCase();") public String toUpperCase() { throw new UnsupportedOperationException(); } diff -r acba19bef022 -r 23b4a344fe02 vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java --- a/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Sun Dec 16 18:48:57 2012 +0100 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Sun Dec 16 18:49:35 2012 +0100 @@ -17,7 +17,6 @@ */ package org.apidesign.vm4brwsr.tck; -import java.lang.reflect.Method; import org.apidesign.vm4brwsr.Compare; import org.apidesign.vm4brwsr.CompareVMs; import org.testng.annotations.Factory; @@ -43,6 +42,49 @@ @Compare public String nameOfArrayClass() throws Exception { return Class.forName("org.apidesign.vm4brwsr.Array").getName(); } + + @Compare public String lowerHello() { + return "HeLlO".toLowerCase(); + } + + @Compare public String lowerA() { + return String.valueOf(Character.toLowerCase('A')).toString(); + } + @Compare public String upperHello() { + return "hello".toUpperCase(); + } + + @Compare public String upperA() { + return String.valueOf(Character.toUpperCase('a')).toString(); + } + + @Compare public boolean matchRegExp() throws Exception { + return "58038503".matches("\\d*"); + } + + @Compare public boolean doesNotMatchRegExp() throws Exception { + return "58038503GH".matches("\\d*"); + } + + @Compare public boolean doesNotMatchRegExpFully() throws Exception { + return "Hello".matches("Hell"); + } + + @Compare public String variousCharacterTests() throws Exception { + StringBuilder sb = new StringBuilder(); + + sb.append(Character.isUpperCase('a')); + sb.append(Character.isUpperCase('A')); + sb.append(Character.isLowerCase('a')); + sb.append(Character.isLowerCase('A')); + + sb.append(Character.isLetter('A')); + sb.append(Character.isLetterOrDigit('9')); + sb.append(Character.isLetterOrDigit('A')); + sb.append(Character.isLetter('0')); + + return sb.toString().toString(); + } @Factory public static Object[] create() {