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