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