js/src/tests/ecma/String/15.5.4.11-1.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 /**
     8    File Name:          15.5.4.11-1.js
     9    ECMA Section:       15.5.4.11 String.prototype.toLowerCase()
    10    Description:
    12    Returns a string equal in length to the length of the result of converting
    13    this object to a string. The result is a string value, not a String object.
    15    Every character of the result is equal to the corresponding character of the
    16    string, unless that character has a Unicode 2.0 uppercase equivalent, in which
    17    case the uppercase equivalent is used instead. (The canonical Unicode 2.0 case
    18    mapping shall be used, which does not depend on implementation or locale.)
    20    Note that the toLowerCase function is intentionally generic; it does not require
    21    that its this value be a String object. Therefore it can be transferred to other
    22    kinds of objects for use as a method.
    24    Author:             christine@netscape.com
    25    Date:               12 november 1997
    26 */
    28 var SECTION = "15.5.4.11-1";
    29 var VERSION = "ECMA_1";
    30 startTest();
    31 var TITLE   = "String.prototype.toLowerCase()";
    33 writeHeaderToLog( SECTION + " "+ TITLE);
    35 new TestCase( SECTION,  "String.prototype.toLowerCase.length",        0,          String.prototype.toLowerCase.length );
    36 new TestCase( SECTION,  "delete String.prototype.toLowerCase.length", false,      delete String.prototype.toLowerCase.length );
    37 new TestCase( SECTION,  "delete String.prototype.toLowerCase.length; String.prototype.toLowerCase.length", 0,      eval("delete String.prototype.toLowerCase.length; String.prototype.toLowerCase.length") );
    39 // Basic Latin, Latin-1 Supplement, Latin Extended A
    40 for ( var i = 0; i <= 0x017f; i++ ) {
    41   var U = new Unicode(i);
    42 /*
    43   new TestCase(   SECTION,
    44   "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()",
    45   String.fromCharCode(U.lower),
    46   eval("var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()") );
    47 */
    48   new TestCase(   SECTION,
    49 		  "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase().charCodeAt(0)",
    50 		  U.lower,
    51 		  eval("var s = new String( String.fromCharCode(i) ); s.toLowerCase().charCodeAt(0)") );
    53 }
    55 test();
    57 function MyObject( value ) {
    58   this.value = value;
    59   this.substring = String.prototype.substring;
    60   this.toString = new Function ( "return this.value+''" );
    61 }
    62 function Unicode( c ) {
    63   u = GetUnicodeValues( c );
    64   this.upper = u[0];
    65   this.lower = u[1]
    66     return this;
    67 }
    68 function GetUnicodeValues( c ) {
    69   u = new Array();
    71   u[0] = c;
    72   u[1] = c;
    74   // upper case Basic Latin
    76   if ( c >= 0x0041 && c <= 0x005A) {
    77     u[0] = c;
    78     u[1] = c + 32;
    79     return u;
    80   }
    82   // lower case Basic Latin
    83   if ( c >= 0x0061 && c <= 0x007a ) {
    84     u[0] = c - 32;
    85     u[1] = c;
    86     return u;
    87   }
    89   // upper case Latin-1 Supplement
    90   if ( (c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE) ) {
    91     u[0] = c;
    92     u[1] = c + 32;
    93     return u;
    94   }
    96   // lower case Latin-1 Supplement
    97   if ( (c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE) ) {
    98     u[0] = c - 32;
    99     u[1] = c;
   100     return u;
   101   }
   102   if ( c == 0x00FF ) {
   103     u[0] = 0x0178;
   104     u[1] = c;
   105     return u;
   106   }
   107   // Latin Extended A
   108   if ( (c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178) ) {
   109     // special case for capital I
   110     if ( c == 0x0130 ) {
   111       u[0] = c;
   112       u[1] = 0x0069;
   113       return u;
   114     }
   115     if ( c == 0x0131 ) {
   116       u[0] = 0x0049;
   117       u[1] = c;
   118       return u;
   119     }
   121     if ( c % 2 == 0 ) {
   122       // if it's even, it's a capital and the lower case is c +1
   123       u[0] = c;
   124       u[1] = c+1;
   125     } else {
   126       // if it's odd, it's a lower case and upper case is c-1
   127       u[0] = c-1;
   128       u[1] = c;
   129     }
   130     return u;
   131   }
   132   if ( c == 0x0178 ) {
   133     u[0] = c;
   134     u[1] = 0x00FF;
   135     return u;
   136   }
   138   if ( (c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F) ) {
   139     if ( c % 2 == 1 ) {
   140       // if it's odd, it's a capital and the lower case is c +1
   141       u[0] = c;
   142       u[1] = c+1;
   143     } else {
   144       // if it's even, it's a lower case and upper case is c-1
   145       u[0] = c-1;
   146       u[1] = c;
   147     }
   148     return u;
   149   }
   150   if ( c == 0x017F ) {
   151     u[0] = 0x0053;
   152     u[1] = c;
   153   }
   155   // Latin Extended B
   156   // need to improve this set
   158   if ( c >= 0x0200 && c <= 0x0217 ) {
   159     if ( c % 2 == 0 ) {
   160       u[0] = c;
   161       u[1] = c+1;
   162     } else {
   163       u[0] = c-1;
   164       u[1] = c;
   165     }
   166     return u;
   167   }
   169   // Latin Extended Additional
   170   // Range: U+1E00 to U+1EFF
   171   // http://www.unicode.org/Unicode.charts/glyphless/U1E00.html
   173   // Spacing Modifier Leters
   174   // Range: U+02B0 to U+02FF
   176   // Combining Diacritical Marks
   177   // Range: U+0300 to U+036F
   179   // skip Greek for now
   180   // Greek
   181   // Range: U+0370 to U+03FF
   183   // Cyrillic
   184   // Range: U+0400 to U+04FF
   186   if ( (c >= 0x0401 && c <= 0x040C) || ( c>= 0x040E && c <= 0x040F ) ) {
   187     u[0] = c;
   188     u[1] = c + 80;
   189     return u;
   190   }
   193   if ( c >= 0x0410  && c <= 0x042F ) {
   194     u[0] = c;
   195     u[1] = c + 32;
   196     return u;
   197   }
   199   if ( c >= 0x0430 && c<= 0x044F ) {
   200     u[0] = c - 32;
   201     u[1] = c;
   202     return u;
   204   }
   205   if ( (c >= 0x0451 && c <= 0x045C) || (c >=0x045E && c<= 0x045F) ) {
   206     u[0] = c -80;
   207     u[1] = c;
   208     return u;
   209   }
   211   if ( c >= 0x0460 && c <= 0x047F ) {
   212     if ( c % 2 == 0 ) {
   213       u[0] = c;
   214       u[1] = c +1;
   215     } else {
   216       u[0] = c - 1;
   217       u[1] = c;
   218     }
   219     return u;
   220   }
   222   // Armenian
   223   // Range: U+0530 to U+058F
   224   if ( c >= 0x0531 && c <= 0x0556 ) {
   225     u[0] = c;
   226     u[1] = c + 48;
   227     return u;
   228   }
   229   if ( c >= 0x0561 && c < 0x0587 ) {
   230     u[0] = c - 48;
   231     u[1] = c;
   232     return u;
   233   }
   235   // Hebrew
   236   // Range: U+0590 to U+05FF
   239   // Arabic
   240   // Range: U+0600 to U+06FF
   242   // Devanagari
   243   // Range: U+0900 to U+097F
   246   // Bengali
   247   // Range: U+0980 to U+09FF
   250   // Gurmukhi
   251   // Range: U+0A00 to U+0A7F
   254   // Gujarati
   255   // Range: U+0A80 to U+0AFF
   258   // Oriya
   259   // Range: U+0B00 to U+0B7F
   260   // no capital / lower case
   263   // Tamil
   264   // Range: U+0B80 to U+0BFF
   265   // no capital / lower case
   268   // Telugu
   269   // Range: U+0C00 to U+0C7F
   270   // no capital / lower case
   273   // Kannada
   274   // Range: U+0C80 to U+0CFF
   275   // no capital / lower case
   278   // Malayalam
   279   // Range: U+0D00 to U+0D7F
   281   // Thai
   282   // Range: U+0E00 to U+0E7F
   285   // Lao
   286   // Range: U+0E80 to U+0EFF
   289   // Tibetan
   290   // Range: U+0F00 to U+0FBF
   292   // Georgian
   293   // Range: U+10A0 to U+10F0
   294   if ( c >= 0x10A0 && c <= 0x10C5 ) {
   295     u[0] = c;
   296     u[1] = c + 48;
   297     return u;
   298   }
   299   if ( c >= 0x10D0 && c <= 0x10F5 ) {
   300     u[0] = c;
   301     u[1] = c;
   302     return u;
   303   }
   305   // Hangul Jamo
   306   // Range: U+1100 to U+11FF
   308   // Greek Extended
   309   // Range: U+1F00 to U+1FFF
   310   // skip for now
   313   // General Punctuation
   314   // Range: U+2000 to U+206F
   316   // Superscripts and Subscripts
   317   // Range: U+2070 to U+209F
   319   // Currency Symbols
   320   // Range: U+20A0 to U+20CF
   323   // Combining Diacritical Marks for Symbols
   324   // Range: U+20D0 to U+20FF
   325   // skip for now
   328   // Number Forms
   329   // Range: U+2150 to U+218F
   330   // skip for now
   333   // Arrows
   334   // Range: U+2190 to U+21FF
   336   // Mathematical Operators
   337   // Range: U+2200 to U+22FF
   339   // Miscellaneous Technical
   340   // Range: U+2300 to U+23FF
   342   // Control Pictures
   343   // Range: U+2400 to U+243F
   345   // Optical Character Recognition
   346   // Range: U+2440 to U+245F
   348   // Enclosed Alphanumerics
   349   // Range: U+2460 to U+24FF
   351   // Box Drawing
   352   // Range: U+2500 to U+257F
   354   // Block Elements
   355   // Range: U+2580 to U+259F
   357   // Geometric Shapes
   358   // Range: U+25A0 to U+25FF
   360   // Miscellaneous Symbols
   361   // Range: U+2600 to U+26FF
   363   // Dingbats
   364   // Range: U+2700 to U+27BF
   366   // CJK Symbols and Punctuation
   367   // Range: U+3000 to U+303F
   369   // Hiragana
   370   // Range: U+3040 to U+309F
   372   // Katakana
   373   // Range: U+30A0 to U+30FF
   375   // Bopomofo
   376   // Range: U+3100 to U+312F
   378   // Hangul Compatibility Jamo
   379   // Range: U+3130 to U+318F
   381   // Kanbun
   382   // Range: U+3190 to U+319F
   385   // Enclosed CJK Letters and Months
   386   // Range: U+3200 to U+32FF
   388   // CJK Compatibility
   389   // Range: U+3300 to U+33FF
   391   // Hangul Syllables
   392   // Range: U+AC00 to U+D7A3
   394   // High Surrogates
   395   // Range: U+D800 to U+DB7F
   397   // Private Use High Surrogates
   398   // Range: U+DB80 to U+DBFF
   400   // Low Surrogates
   401   // Range: U+DC00 to U+DFFF
   403   // Private Use Area
   404   // Range: U+E000 to U+F8FF
   406   // CJK Compatibility Ideographs
   407   // Range: U+F900 to U+FAFF
   409   // Alphabetic Presentation Forms
   410   // Range: U+FB00 to U+FB4F
   412   // Arabic Presentation Forms-A
   413   // Range: U+FB50 to U+FDFF
   415   // Combining Half Marks
   416   // Range: U+FE20 to U+FE2F
   418   // CJK Compatibility Forms
   419   // Range: U+FE30 to U+FE4F
   421   // Small Form Variants
   422   // Range: U+FE50 to U+FE6F
   424   // Arabic Presentation Forms-B
   425   // Range: U+FE70 to U+FEFF
   427   // Halfwidth and Fullwidth Forms
   428   // Range: U+FF00 to U+FFEF
   430   if ( c >= 0xFF21 && c <= 0xFF3A ) {
   431     u[0] = c;
   432     u[1] = c + 32;
   433     return u;
   434   }
   436   if ( c >= 0xFF41 && c <= 0xFF5A ) {
   437     u[0] = c - 32;
   438     u[1] = c;
   439     return u;
   440   }
   442   // Specials
   443   // Range: U+FFF0 to U+FFFF
   445   return u;
   446 }
   448 function DecimalToHexString( n ) {
   449   n = Number( n );
   450   var h = "0x";
   452   for ( var i = 3; i >= 0; i-- ) {
   453     if ( n >= Math.pow(16, i) ){
   454       var t = Math.floor( n  / Math.pow(16, i));
   455       n -= t * Math.pow(16, i);
   456       if ( t >= 10 ) {
   457 	if ( t == 10 ) {
   458 	  h += "A";
   459 	}
   460 	if ( t == 11 ) {
   461 	  h += "B";
   462 	}
   463 	if ( t == 12 ) {
   464 	  h += "C";
   465 	}
   466 	if ( t == 13 ) {
   467 	  h += "D";
   468 	}
   469 	if ( t == 14 ) {
   470 	  h += "E";
   471 	}
   472 	if ( t == 15 ) {
   473 	  h += "F";
   474 	}
   475       } else {
   476 	h += String( t );
   477       }
   478     } else {
   479       h += "0";
   480     }
   481   }
   483   return h;
   484 }

mercurial