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