Home | History | Annotate | Download | only in String
      1 /* The contents of this file are subject to the Netscape Public
      2  * License Version 1.1 (the "License"); you may not use this file
      3  * except in compliance with the License. You may obtain a copy of
      4  * the License at http://www.mozilla.org/NPL/
      5  *
      6  * Software distributed under the License is distributed on an "AS
      7  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
      8  * implied. See the License for the specific language governing
      9  * rights and limitations under the License.
     10  *
     11  * The Original Code is Mozilla Communicator client code, released March
     12  * 31, 1998.
     13  *
     14  * The Initial Developer of the Original Code is Netscape Communications
     15  * Corporation. Portions created by Netscape are
     16  * Copyright (C) 1998 Netscape Communications Corporation. All
     17  * Rights Reserved.
     18  *
     19  * Contributor(s):
     20  *
     21  */
     22 /**
     23     File Name:          15.5.4.12-1.js
     24     ECMA Section:       15.5.4.12 String.prototype.toUpperCase()
     25     Description:
     26 
     27     Returns a string equal in length to the length of the result of converting
     28     this object to a string. The result is a string value, not a String object.
     29 
     30     Every character of the result is equal to the corresponding character of the
     31     string, unless that character has a Unicode 2.0 uppercase equivalent, in which
     32     case the uppercase equivalent is used instead. (The canonical Unicode 2.0 case
     33     mapping shall be used, which does not depend on implementation or locale.)
     34 
     35     Note that the toUpperCase function is intentionally generic; it does not require
     36     that its this value be a String object. Therefore it can be transferred to other
     37     kinds of objects for use as a method.
     38 
     39     Author:             christine (at) netscape.com
     40     Date:               12 november 1997
     41 */
     42 
     43     var SECTION = "15.5.4.12-1";
     44     var VERSION = "ECMA_1";
     45     startTest();
     46     var TITLE   = "String.prototype.toUpperCase()";
     47 
     48     writeHeaderToLog( SECTION + " "+ TITLE);
     49 
     50     var testcases = getTestCases();
     51     test();
     52 
     53 function getTestCases() {
     54     var array = new Array();
     55     var item = 0;
     56 
     57     array[item++] = new TestCase( SECTION,  "String.prototype.toUpperCase.length",        0,          String.prototype.toUpperCase.length );
     58     array[item++] = new TestCase( SECTION,  "delete String.prototype.toUpperCase.length", false,      delete String.prototype.toUpperCase.length );
     59     array[item++] = new TestCase( SECTION,  "delete String.prototype.toupperCase.length; String.prototype.toupperCase.length", 0,      eval("delete String.prototype.toUpperCase.length; String.prototype.toUpperCase.length") );
     60 
     61     // Basic Latin, Latin-1 Supplement, Latin Extended A
     62     for ( var i = 0; i <= 0x017f; i++ ) {
     63         var U = new Unicode( i );
     64 
     65         // XXX DF fails in java
     66 
     67         if ( i == 0x00DF ) {
     68             continue;
     69         }
     70 
     71 
     72         array[item++] = new TestCase(   SECTION,
     73                                         "var s = new String( String.fromCharCode("+i+") ); s.toUpperCase().charCodeAt(0)",
     74                                         U.upper,
     75                                         eval("var s = new String( String.fromCharCode(i) ); s.toUpperCase().charCodeAt(0)") );
     76     }
     77 
     78     return array;
     79 }
     80 function test() {
     81     for ( tc=0; tc < testcases.length; tc++ ) {
     82         testcases[tc].passed = writeTestCaseResult(
     83                             testcases[tc].expect,
     84                             testcases[tc].actual,
     85                             testcases[tc].description +" = "+
     86                             testcases[tc].actual );
     87 
     88         testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
     89     }
     90     stopTest();
     91     return ( testcases );
     92 }
     93 function MyObject( value ) {
     94     this.value = value;
     95     this.substring = String.prototype.substring;
     96     this.toString = new Function ( "return this.value+''" );
     97 }
     98 function Unicode( c ) {
     99     u = GetUnicodeValues( c );
    100     this.upper = u[0];
    101     this.lower = u[1]
    102     return this;
    103 }
    104 function GetUnicodeValues( c ) {
    105     u = new Array();
    106 
    107     u[0] = c;
    108     u[1] = c;
    109 
    110     // upper case Basic Latin
    111 
    112     if ( c >= 0x0041 && c <= 0x005A) {
    113         u[0] = c;
    114         u[1] = c + 32;
    115         return u;
    116     }
    117 
    118     // lower case Basic Latin
    119     if ( c >= 0x0061 && c <= 0x007a ) {
    120         u[0] = c - 32;
    121         u[1] = c;
    122         return u;
    123     }
    124 
    125     // upper case Latin-1 Supplement
    126     if ( c == 0x00B5 ) {
    127         u[0] = 0x039C;
    128         u[1] = c;
    129         return u;
    130     }
    131     if ( (c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE) ) {
    132         u[0] = c;
    133         u[1] = c + 32;
    134         return u;
    135     }
    136 
    137     // lower case Latin-1 Supplement
    138     if ( (c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE) ) {
    139         u[0] = c - 32;
    140         u[1] = c;
    141         return u;
    142     }
    143     if ( c == 0x00FF ) {
    144         u[0] = 0x0178;
    145         u[1] = c;
    146         return u;
    147     }
    148     // Latin Extended A
    149     if ( (c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178) ) {
    150         // special case for capital I
    151         if ( c == 0x0130 ) {
    152             u[0] = c;
    153             u[1] = 0x0069;
    154             return u;
    155         }
    156         if ( c == 0x0131 ) {
    157             u[0] = 0x0049;
    158             u[1] = c;
    159             return u;
    160         }
    161 
    162         if ( c % 2 == 0 ) {
    163         // if it's even, it's a capital and the lower case is c +1
    164             u[0] = c;
    165             u[1] = c+1;
    166         } else {
    167         // if it's odd, it's a lower case and upper case is c-1
    168             u[0] = c-1;
    169             u[1] = c;
    170         }
    171         return u;
    172     }
    173     if ( c == 0x0178 ) {
    174         u[0] = c;
    175         u[1] = 0x00FF;
    176         return u;
    177     }
    178 
    179     // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE, uppercase takes two code points
    180     if (c == 0x0149) {
    181         u[0] = 0x02bc;
    182         u[1] = c;
    183         return u;
    184     }
    185 
    186     if ( (c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F) ) {
    187         if ( c % 2 == 1 ) {
    188         // if it's odd, it's a capital and the lower case is c +1
    189             u[0] = c;
    190             u[1] = c+1;
    191         } else {
    192         // if it's even, it's a lower case and upper case is c-1
    193             u[0] = c-1;
    194             u[1] = c;
    195         }
    196         return u;
    197     }
    198     if ( c == 0x017F ) {
    199         u[0] = 0x0053;
    200         u[1] = c;
    201     }
    202 
    203     // Latin Extended B
    204     // need to improve this set
    205 
    206     if ( c >= 0x0200 && c <= 0x0217 ) {
    207         if ( c % 2 == 0 ) {
    208             u[0] = c;
    209             u[1] = c+1;
    210         } else {
    211             u[0] = c-1;
    212             u[1] = c;
    213         }
    214         return u;
    215     }
    216 
    217     // Latin Extended Additional
    218     // Range: U+1E00 to U+1EFF
    219     // http://www.unicode.org/Unicode.charts/glyphless/U1E00.html
    220 
    221     // Spacing Modifier Leters
    222     // Range: U+02B0 to U+02FF
    223 
    224     // Combining Diacritical Marks
    225     // Range: U+0300 to U+036F
    226 
    227     // skip Greek for now
    228     // Greek
    229     // Range: U+0370 to U+03FF
    230 
    231     // Cyrillic
    232     // Range: U+0400 to U+04FF
    233 
    234     if ( c >= 0x0400 && c <= 0x040F) {
    235         u[0] = c;
    236         u[1] = c + 80;
    237         return u;
    238     }
    239 
    240 
    241     if ( c >= 0x0410  && c <= 0x042F ) {
    242         u[0] = c;
    243         u[1] = c + 32;
    244         return u;
    245     }
    246 
    247     if ( c >= 0x0430 && c<= 0x044F ) {
    248         u[0] = c - 32;
    249         u[1] = c;
    250         return u;
    251 
    252     }
    253     if ( c >= 0x0450 && c<= 0x045F ) {
    254         u[0] = c -80;
    255         u[1] = c;
    256         return u;
    257     }
    258 
    259     if ( c >= 0x0460 && c <= 0x047F ) {
    260         if ( c % 2 == 0 ) {
    261             u[0] = c;
    262             u[1] = c +1;
    263         } else {
    264             u[0] = c - 1;
    265             u[1] = c;
    266         }
    267         return u;
    268     }
    269 
    270     // Armenian
    271     // Range: U+0530 to U+058F
    272     if ( c >= 0x0531 && c <= 0x0556 ) {
    273         u[0] = c;
    274         u[1] = c + 48;
    275         return u;
    276     }
    277     if ( c >= 0x0561 && c < 0x0587 ) {
    278         u[0] = c - 48;
    279         u[1] = c;
    280         return u;
    281     }
    282     if (c == 0x0587) {
    283         u[0] = 0x0535;
    284         u[1] = c;
    285         return u;
    286     }
    287 
    288     // Hebrew
    289     // Range: U+0590 to U+05FF
    290 
    291 
    292     // Arabic
    293     // Range: U+0600 to U+06FF
    294 
    295     // Devanagari
    296     // Range: U+0900 to U+097F
    297 
    298 
    299     // Bengali
    300     // Range: U+0980 to U+09FF
    301 
    302 
    303     // Gurmukhi
    304     // Range: U+0A00 to U+0A7F
    305 
    306 
    307     // Gujarati
    308     // Range: U+0A80 to U+0AFF
    309 
    310 
    311     // Oriya
    312     // Range: U+0B00 to U+0B7F
    313     // no capital / lower case
    314 
    315 
    316     // Tamil
    317     // Range: U+0B80 to U+0BFF
    318     // no capital / lower case
    319 
    320 
    321     // Telugu
    322     // Range: U+0C00 to U+0C7F
    323     // no capital / lower case
    324 
    325 
    326     // Kannada
    327     // Range: U+0C80 to U+0CFF
    328     // no capital / lower case
    329 
    330 
    331     // Malayalam
    332     // Range: U+0D00 to U+0D7F
    333 
    334     // Thai
    335     // Range: U+0E00 to U+0E7F
    336 
    337 
    338     // Lao
    339     // Range: U+0E80 to U+0EFF
    340 
    341 
    342     // Tibetan
    343     // Range: U+0F00 to U+0FBF
    344 
    345     // Georgian
    346     // Range: U+10A0 to U+10F0
    347 
    348     // Hangul Jamo
    349     // Range: U+1100 to U+11FF
    350 
    351     // Greek Extended
    352     // Range: U+1F00 to U+1FFF
    353     // skip for now
    354 
    355 
    356     // General Punctuation
    357     // Range: U+2000 to U+206F
    358 
    359     // Superscripts and Subscripts
    360     // Range: U+2070 to U+209F
    361 
    362     // Currency Symbols
    363     // Range: U+20A0 to U+20CF
    364 
    365 
    366     // Combining Diacritical Marks for Symbols
    367     // Range: U+20D0 to U+20FF
    368     // skip for now
    369 
    370 
    371     // Number Forms
    372     // Range: U+2150 to U+218F
    373     // skip for now
    374 
    375 
    376     // Arrows
    377     // Range: U+2190 to U+21FF
    378 
    379     // Mathematical Operators
    380     // Range: U+2200 to U+22FF
    381 
    382     // Miscellaneous Technical
    383     // Range: U+2300 to U+23FF
    384 
    385     // Control Pictures
    386     // Range: U+2400 to U+243F
    387 
    388     // Optical Character Recognition
    389     // Range: U+2440 to U+245F
    390 
    391     // Enclosed Alphanumerics
    392     // Range: U+2460 to U+24FF
    393 
    394     // Box Drawing
    395     // Range: U+2500 to U+257F
    396 
    397     // Block Elements
    398     // Range: U+2580 to U+259F
    399 
    400     // Geometric Shapes
    401     // Range: U+25A0 to U+25FF
    402 
    403     // Miscellaneous Symbols
    404     // Range: U+2600 to U+26FF
    405 
    406     // Dingbats
    407     // Range: U+2700 to U+27BF
    408 
    409     // CJK Symbols and Punctuation
    410     // Range: U+3000 to U+303F
    411 
    412     // Hiragana
    413     // Range: U+3040 to U+309F
    414 
    415     // Katakana
    416     // Range: U+30A0 to U+30FF
    417 
    418     // Bopomofo
    419     // Range: U+3100 to U+312F
    420 
    421     // Hangul Compatibility Jamo
    422     // Range: U+3130 to U+318F
    423 
    424     // Kanbun
    425     // Range: U+3190 to U+319F
    426 
    427 
    428     // Enclosed CJK Letters and Months
    429     // Range: U+3200 to U+32FF
    430 
    431     // CJK Compatibility
    432     // Range: U+3300 to U+33FF
    433 
    434     // Hangul Syllables
    435     // Range: U+AC00 to U+D7A3
    436 
    437     // High Surrogates
    438     // Range: U+D800 to U+DB7F
    439 
    440     // Private Use High Surrogates
    441     // Range: U+DB80 to U+DBFF
    442 
    443     // Low Surrogates
    444     // Range: U+DC00 to U+DFFF
    445 
    446     // Private Use Area
    447     // Range: U+E000 to U+F8FF
    448 
    449     // CJK Compatibility Ideographs
    450     // Range: U+F900 to U+FAFF
    451 
    452     // Alphabetic Presentation Forms
    453     // Range: U+FB00 to U+FB4F
    454 
    455     // Arabic Presentation Forms-A
    456     // Range: U+FB50 to U+FDFF
    457 
    458     // Combining Half Marks
    459     // Range: U+FE20 to U+FE2F
    460 
    461     // CJK Compatibility Forms
    462     // Range: U+FE30 to U+FE4F
    463 
    464     // Small Form Variants
    465     // Range: U+FE50 to U+FE6F
    466 
    467     // Arabic Presentation Forms-B
    468     // Range: U+FE70 to U+FEFF
    469 
    470     // Halfwidth and Fullwidth Forms
    471     // Range: U+FF00 to U+FFEF
    472 
    473     if ( c >= 0xFF21 && c <= 0xFF3A ) {
    474         u[0] = c;
    475         u[1] = c + 32;
    476         return u;
    477     }
    478 
    479     if ( c >= 0xFF41 && c <= 0xFF5A ) {
    480         u[0] = c - 32;
    481         u[1] = c;
    482         return u;
    483     }
    484 
    485     // Specials
    486     // Range: U+FFF0 to U+FFFF
    487 
    488     return u;
    489 }
    490 
    491 function DecimalToHexString( n ) {
    492     n = Number( n );
    493     var h = "0x";
    494 
    495     for ( var i = 3; i >= 0; i-- ) {
    496         if ( n >= Math.pow(16, i) ){
    497             var t = Math.floor( n  / Math.pow(16, i));
    498             n -= t * Math.pow(16, i);
    499             if ( t >= 10 ) {
    500                 if ( t == 10 ) {
    501                     h += "A";
    502                 }
    503                 if ( t == 11 ) {
    504                     h += "B";
    505                 }
    506                 if ( t == 12 ) {
    507                     h += "C";
    508                 }
    509                 if ( t == 13 ) {
    510                     h += "D";
    511                 }
    512                 if ( t == 14 ) {
    513                     h += "E";
    514                 }
    515                 if ( t == 15 ) {
    516                     h += "F";
    517                 }
    518             } else {
    519                 h += String( t );
    520             }
    521         } else {
    522             h += "0";
    523         }
    524     }
    525 
    526     return h;
    527 }