1.1 --- a/emul/src/main/java/java/lang/Character.java Sun Dec 16 18:48:57 2012 +0100
1.2 +++ b/emul/src/main/java/java/lang/Character.java Sun Dec 16 18:49:35 2012 +0100
1.3 @@ -25,6 +25,8 @@
1.4
1.5 package java.lang;
1.6
1.7 +import org.apidesign.bck2brwsr.core.JavaScriptBody;
1.8 +
1.9 /**
1.10 * The {@code Character} class wraps a value of the primitive
1.11 * type {@code char} in an object. An object of type
1.12 @@ -1525,7 +1527,7 @@
1.13 * @see Character#getType(char)
1.14 */
1.15 public static boolean isLowerCase(char ch) {
1.16 - throw new UnsupportedOperationException();
1.17 + return ch == toLowerCase(ch);
1.18 }
1.19
1.20 /**
1.21 @@ -1560,7 +1562,7 @@
1.22 * @since 1.0
1.23 */
1.24 public static boolean isUpperCase(char ch) {
1.25 - throw new UnsupportedOperationException();
1.26 + return ch == toUpperCase(ch);
1.27 }
1.28
1.29 /**
1.30 @@ -1676,7 +1678,7 @@
1.31 * @see Character#getType(char)
1.32 */
1.33 public static boolean isDigit(char ch) {
1.34 - return isDigit((int)ch);
1.35 + return String.valueOf(ch).matches("\\d");
1.36 }
1.37
1.38 /**
1.39 @@ -1710,8 +1712,11 @@
1.40 * @since 1.5
1.41 */
1.42 public static boolean isDigit(int codePoint) {
1.43 - return getType(codePoint) == Character.DECIMAL_DIGIT_NUMBER;
1.44 + return fromCodeChars(codePoint).matches("\\d");
1.45 }
1.46 +
1.47 + @JavaScriptBody(args = "c", body = "return String.fromCharCode(c);")
1.48 + private native static String fromCodeChars(int codePoint);
1.49
1.50 /**
1.51 * Determines if a character is defined in Unicode.
1.52 @@ -1802,7 +1807,7 @@
1.53 * @see Character#isUpperCase(char)
1.54 */
1.55 public static boolean isLetter(char ch) {
1.56 - return isLetter((int)ch);
1.57 + return String.valueOf(ch).matches("\\w") && !isDigit(ch);
1.58 }
1.59
1.60 /**
1.61 @@ -1835,12 +1840,7 @@
1.62 * @since 1.5
1.63 */
1.64 public static boolean isLetter(int codePoint) {
1.65 - return ((((1 << Character.UPPERCASE_LETTER) |
1.66 - (1 << Character.LOWERCASE_LETTER) |
1.67 - (1 << Character.TITLECASE_LETTER) |
1.68 - (1 << Character.MODIFIER_LETTER) |
1.69 - (1 << Character.OTHER_LETTER)) >> getType(codePoint)) & 1)
1.70 - != 0;
1.71 + return fromCodeChars(codePoint).matches("\\w") && !isDigit(codePoint);
1.72 }
1.73
1.74 /**
1.75 @@ -1868,7 +1868,7 @@
1.76 * @since 1.0.2
1.77 */
1.78 public static boolean isLetterOrDigit(char ch) {
1.79 - return isLetterOrDigit((int)ch);
1.80 + return String.valueOf(ch).matches("\\w");
1.81 }
1.82
1.83 /**
1.84 @@ -1889,13 +1889,7 @@
1.85 * @since 1.5
1.86 */
1.87 public static boolean isLetterOrDigit(int codePoint) {
1.88 - return ((((1 << Character.UPPERCASE_LETTER) |
1.89 - (1 << Character.LOWERCASE_LETTER) |
1.90 - (1 << Character.TITLECASE_LETTER) |
1.91 - (1 << Character.MODIFIER_LETTER) |
1.92 - (1 << Character.OTHER_LETTER) |
1.93 - (1 << Character.DECIMAL_DIGIT_NUMBER)) >> getType(codePoint)) & 1)
1.94 - != 0;
1.95 + return fromCodeChars(codePoint).matches("\\w");
1.96 }
1.97
1.98 static int getType(int x) {
1.99 @@ -1930,7 +1924,7 @@
1.100 * @see String#toLowerCase()
1.101 */
1.102 public static char toLowerCase(char ch) {
1.103 - throw new UnsupportedOperationException();
1.104 + return String.valueOf(ch).toLowerCase().charAt(0);
1.105 }
1.106
1.107 /**
1.108 @@ -1961,7 +1955,7 @@
1.109 * @see String#toUpperCase()
1.110 */
1.111 public static char toUpperCase(char ch) {
1.112 - throw new UnsupportedOperationException();
1.113 + return String.valueOf(ch).toUpperCase().charAt(0);
1.114 }
1.115
1.116 /**
2.1 --- a/emul/src/main/java/java/lang/String.java Sun Dec 16 18:48:57 2012 +0100
2.2 +++ b/emul/src/main/java/java/lang/String.java Sun Dec 16 18:49:35 2012 +0100
2.3 @@ -2143,6 +2143,12 @@
2.4 * @since 1.4
2.5 * @spec JSR-51
2.6 */
2.7 + @JavaScriptBody(args = { "self", "regex" }, body =
2.8 + "self = self.toString();\n"
2.9 + + "var re = new RegExp(regex.toString());\n"
2.10 + + "var r = re.exec(self);\n"
2.11 + + "return r != null && r.length > 0 && self.length == r[0].length;"
2.12 + )
2.13 public boolean matches(String regex) {
2.14 throw new UnsupportedOperationException();
2.15 }
2.16 @@ -2555,6 +2561,7 @@
2.17 * @return the <code>String</code>, converted to lowercase.
2.18 * @see java.lang.String#toLowerCase(Locale)
2.19 */
2.20 + @JavaScriptBody(args = "self", body = "return self.toLowerCase();")
2.21 public String toLowerCase() {
2.22 throw new UnsupportedOperationException("Should be supported but without connection to locale");
2.23 }
2.24 @@ -2720,6 +2727,7 @@
2.25 * @return the <code>String</code>, converted to uppercase.
2.26 * @see java.lang.String#toUpperCase(Locale)
2.27 */
2.28 + @JavaScriptBody(args = "self", body = "return self.toUpperCase();")
2.29 public String toUpperCase() {
2.30 throw new UnsupportedOperationException();
2.31 }
3.1 --- a/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Sun Dec 16 18:48:57 2012 +0100
3.2 +++ b/vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java Sun Dec 16 18:49:35 2012 +0100
3.3 @@ -17,7 +17,6 @@
3.4 */
3.5 package org.apidesign.vm4brwsr.tck;
3.6
3.7 -import java.lang.reflect.Method;
3.8 import org.apidesign.vm4brwsr.Compare;
3.9 import org.apidesign.vm4brwsr.CompareVMs;
3.10 import org.testng.annotations.Factory;
3.11 @@ -43,6 +42,49 @@
3.12 @Compare public String nameOfArrayClass() throws Exception {
3.13 return Class.forName("org.apidesign.vm4brwsr.Array").getName();
3.14 }
3.15 +
3.16 + @Compare public String lowerHello() {
3.17 + return "HeLlO".toLowerCase();
3.18 + }
3.19 +
3.20 + @Compare public String lowerA() {
3.21 + return String.valueOf(Character.toLowerCase('A')).toString();
3.22 + }
3.23 + @Compare public String upperHello() {
3.24 + return "hello".toUpperCase();
3.25 + }
3.26 +
3.27 + @Compare public String upperA() {
3.28 + return String.valueOf(Character.toUpperCase('a')).toString();
3.29 + }
3.30 +
3.31 + @Compare public boolean matchRegExp() throws Exception {
3.32 + return "58038503".matches("\\d*");
3.33 + }
3.34 +
3.35 + @Compare public boolean doesNotMatchRegExp() throws Exception {
3.36 + return "58038503GH".matches("\\d*");
3.37 + }
3.38 +
3.39 + @Compare public boolean doesNotMatchRegExpFully() throws Exception {
3.40 + return "Hello".matches("Hell");
3.41 + }
3.42 +
3.43 + @Compare public String variousCharacterTests() throws Exception {
3.44 + StringBuilder sb = new StringBuilder();
3.45 +
3.46 + sb.append(Character.isUpperCase('a'));
3.47 + sb.append(Character.isUpperCase('A'));
3.48 + sb.append(Character.isLowerCase('a'));
3.49 + sb.append(Character.isLowerCase('A'));
3.50 +
3.51 + sb.append(Character.isLetter('A'));
3.52 + sb.append(Character.isLetterOrDigit('9'));
3.53 + sb.append(Character.isLetterOrDigit('A'));
3.54 + sb.append(Character.isLetter('0'));
3.55 +
3.56 + return sb.toString().toString();
3.57 + }
3.58
3.59 @Factory
3.60 public static Object[] create() {