Implementing basic operations on characters
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 16 Dec 2012 18:49:35 +0100
changeset 32623b4a344fe02
parent 325 acba19bef022
child 328 086121d2690a
child 333 4a653c70ca20
Implementing basic operations on characters
emul/src/main/java/java/lang/Character.java
emul/src/main/java/java/lang/String.java
vm/src/test/java/org/apidesign/vm4brwsr/tck/CompareStringsTest.java
     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() {