js/src/tests/ecma/String/15.5.4.11-4.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-2.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-2";
    29 var VERSION = "ECMA_1";
    30 startTest();
    31 var TITLE   = "String.prototype.toLowerCase()";
    33 writeHeaderToLog( SECTION + " "+ TITLE);
    35 // Hiragana (no upper / lower case)
    36 // Range: U+3040 to U+309F
    38 for ( var i = 0x3040; i <= 0x309F; i++ ) {
    39   var U = new Unicode( i );
    40 /*
    41   new TestCase(   SECTION,
    42   "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()",
    43   String.fromCharCode(U.lower),
    44   eval("var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()") );
    45 */
    46   new TestCase(   SECTION,
    47 		  "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase().charCodeAt(0)",
    48 		  U.lower,
    49 		  eval("var s = new String( String.fromCharCode(i) ); s.toLowerCase().charCodeAt(0)") );
    50 }
    52 test();
    54 function MyObject( value ) {
    55   this.value = value;
    56   this.substring = String.prototype.substring;
    57   this.toString = new Function ( "return this.value+''" );
    58 }
    59 function Unicode( c ) {
    60   this.upper = c;
    61   this.lower = c;
    63   // upper case Basic Latin
    65   if ( c >= 0x0041 && c <= 0x005A) {
    66     this.upper = c;
    67     this.lower = c + 32;
    68     return this;
    69   }
    71   // lower case Basic Latin
    72   if ( c >= 0x0061 && c <= 0x007a ) {
    73     this.upper = c - 32;
    74     this.lower = c;
    75     return this;
    76   }
    78   // upper case Latin-1 Supplement
    79   if ( (c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE) ) {
    80     this.upper = c;
    81     this.lower = c + 32;
    82     return this;
    83   }
    85   // lower case Latin-1 Supplement
    86   if ( (c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE) ) {
    87     this.upper = c - 32;
    88     this.lower = c;
    89     return this;
    90   }
    91   if ( c == 0x00FF ) {
    92     this.upper = 0x0178;
    93     this.lower = c;
    94     return this;
    95   }
    96   // Latin Extended A
    97   if ( (c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178) ) {
    98     // special case for capital I
    99     if ( c == 0x0130 ) {
   100       this.upper = c;
   101       this.lower = 0x0069;
   102       return this;
   103     }
   104     if ( c == 0x0131 ) {
   105       this.upper = 0x0049;
   106       this.lower = c;
   107       return this;
   108     }
   110     if ( c % 2 == 0 ) {
   111       // if it's even, it's a capital and the lower case is c +1
   112       this.upper = c;
   113       this.lower = c+1;
   114     } else {
   115       // if it's odd, it's a lower case and upper case is c-1
   116       this.upper = c-1;
   117       this.lower = c;
   118     }
   119     return this;
   120   }
   121   if ( c == 0x0178 ) {
   122     this.upper = c;
   123     this.lower = 0x00FF;
   124     return this;
   125   }
   127   if ( (c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F) ) {
   128     if ( c % 2 == 1 ) {
   129       // if it's odd, it's a capital and the lower case is c +1
   130       this.upper = c;
   131       this.lower = c+1;
   132     } else {
   133       // if it's even, it's a lower case and upper case is c-1
   134       this.upper = c-1;
   135       this.lower = c;
   136     }
   137     return this;
   138   }
   139   if ( c == 0x017F ) {
   140     this.upper = 0x0053;
   141     this.lower = c;
   142   }
   144   // Latin Extended B
   145   // need to improve this set
   147   if ( c >= 0x0200 && c <= 0x0217 ) {
   148     if ( c % 2 == 0 ) {
   149       this.upper = c;
   150       this.lower = c+1;
   151     } else {
   152       this.upper = c-1;
   153       this.lower = c;
   154     }
   155     return this;
   156   }
   158   // Latin Extended Additional
   159   // Range: U+1E00 to U+1EFF
   160   // http://www.unicode.org/Unicode.charts/glyphless/U1E00.html
   162   // Spacing Modifier Leters
   163   // Range: U+02B0 to U+02FF
   165   // Combining Diacritical Marks
   166   // Range: U+0300 to U+036F
   168   // skip Greek for now
   169   // Greek
   170   // Range: U+0370 to U+03FF
   172   // Cyrillic
   173   // Range: U+0400 to U+04FF
   175   if ( (c >= 0x0401 && c <= 0x040C) || ( c>= 0x040E && c <= 0x040F ) ) {
   176     this.upper = c;
   177     this.lower = c + 80;
   178     return this;
   179   }
   182   if ( c >= 0x0410  && c <= 0x042F ) {
   183     this.upper = c;
   184     this.lower = c + 32;
   185     return this;
   186   }
   188   if ( c >= 0x0430 && c<= 0x044F ) {
   189     this.upper = c - 32;
   190     this.lower = c;
   191     return this;
   193   }
   194   if ( (c >= 0x0451 && c <= 0x045C) || (c >=0x045E && c<= 0x045F) ) {
   195     this.upper = c -80;
   196     this.lower = c;
   197     return this;
   198   }
   200   if ( c >= 0x0460 && c <= 0x047F ) {
   201     if ( c % 2 == 0 ) {
   202       this.upper = c;
   203       this.lower = c +1;
   204     } else {
   205       this.upper = c - 1;
   206       this.lower = c;
   207     }
   208     return this;
   209   }
   211   // Armenian
   212   // Range: U+0530 to U+058F
   213   if ( c >= 0x0531 && c <= 0x0556 ) {
   214     this.upper = c;
   215     this.lower = c + 48;
   216     return this;
   217   }
   218   if ( c >= 0x0561 && c < 0x0587 ) {
   219     this.upper = c - 48;
   220     this.lower = c;
   221     return this;
   222   }
   224   // Hebrew
   225   // Range: U+0590 to U+05FF
   228   // Arabic
   229   // Range: U+0600 to U+06FF
   231   // Devanagari
   232   // Range: U+0900 to U+097F
   235   // Bengali
   236   // Range: U+0980 to U+09FF
   239   // Gurmukhi
   240   // Range: U+0A00 to U+0A7F
   243   // Gujarati
   244   // Range: U+0A80 to U+0AFF
   247   // Oriya
   248   // Range: U+0B00 to U+0B7F
   249   // no capital / lower case
   252   // Tamil
   253   // Range: U+0B80 to U+0BFF
   254   // no capital / lower case
   257   // Telugu
   258   // Range: U+0C00 to U+0C7F
   259   // no capital / lower case
   262   // Kannada
   263   // Range: U+0C80 to U+0CFF
   264   // no capital / lower case
   267   // Malayalam
   268   // Range: U+0D00 to U+0D7F
   270   // Thai
   271   // Range: U+0E00 to U+0E7F
   274   // Lao
   275   // Range: U+0E80 to U+0EFF
   278   // Tibetan
   279   // Range: U+0F00 to U+0FBF
   281   // Georgian
   282   // Range: U+10A0 to U+10F0
   283   if ( c >= 0x10A0 && c <= 0x10C5 ) {
   284     this.upper = c;
   285     this.lower = c + 48;
   286     return this;
   287   }
   288   if ( c >= 0x10D0 && c <= 0x10F5 ) {
   289     this.upper = c;
   290     this.lower = c;
   291     return this;
   292   }
   294   // Hangul Jamo
   295   // Range: U+1100 to U+11FF
   297   // Greek Extended
   298   // Range: U+1F00 to U+1FFF
   299   // skip for now
   302   // General Punctuation
   303   // Range: U+2000 to U+206F
   305   // Superscripts and Subscripts
   306   // Range: U+2070 to U+209F
   308   // Currency Symbols
   309   // Range: U+20A0 to U+20CF
   312   // Combining Diacritical Marks for Symbols
   313   // Range: U+20D0 to U+20FF
   314   // skip for now
   317   // Number Forms
   318   // Range: U+2150 to U+218F
   319   // skip for now
   322   // Arrows
   323   // Range: U+2190 to U+21FF
   325   // Mathematical Operators
   326   // Range: U+2200 to U+22FF
   328   // Miscellaneous Technical
   329   // Range: U+2300 to U+23FF
   331   // Control Pictures
   332   // Range: U+2400 to U+243F
   334   // Optical Character Recognition
   335   // Range: U+2440 to U+245F
   337   // Enclosed Alphanumerics
   338   // Range: U+2460 to U+24FF
   340   // Box Drawing
   341   // Range: U+2500 to U+257F
   343   // Block Elements
   344   // Range: U+2580 to U+259F
   346   // Geometric Shapes
   347   // Range: U+25A0 to U+25FF
   349   // Miscellaneous Symbols
   350   // Range: U+2600 to U+26FF
   352   // Dingbats
   353   // Range: U+2700 to U+27BF
   355   // CJK Symbols and Punctuation
   356   // Range: U+3000 to U+303F
   358   // Hiragana
   359   // Range: U+3040 to U+309F
   361   // Katakana
   362   // Range: U+30A0 to U+30FF
   364   // Bopomofo
   365   // Range: U+3100 to U+312F
   367   // Hangul Compatibility Jamo
   368   // Range: U+3130 to U+318F
   370   // Kanbun
   371   // Range: U+3190 to U+319F
   374   // Enclosed CJK Letters and Months
   375   // Range: U+3200 to U+32FF
   377   // CJK Compatibility
   378   // Range: U+3300 to U+33FF
   380   // Hangul Syllables
   381   // Range: U+AC00 to U+D7A3
   383   // High Surrogates
   384   // Range: U+D800 to U+DB7F
   386   // Private Use High Surrogates
   387   // Range: U+DB80 to U+DBFF
   389   // Low Surrogates
   390   // Range: U+DC00 to U+DFFF
   392   // Private Use Area
   393   // Range: U+E000 to U+F8FF
   395   // CJK Compatibility Ideographs
   396   // Range: U+F900 to U+FAFF
   398   // Alphabetic Presentation Forms
   399   // Range: U+FB00 to U+FB4F
   401   // Arabic Presentation Forms-A
   402   // Range: U+FB50 to U+FDFF
   404   // Combining Half Marks
   405   // Range: U+FE20 to U+FE2F
   407   // CJK Compatibility Forms
   408   // Range: U+FE30 to U+FE4F
   410   // Small Form Variants
   411   // Range: U+FE50 to U+FE6F
   413   // Arabic Presentation Forms-B
   414   // Range: U+FE70 to U+FEFF
   416   // Halfwidth and Fullwidth Forms
   417   // Range: U+FF00 to U+FFEF
   419   if ( c >= 0xFF21 && c <= 0xFF3A ) {
   420     this.upper = c;
   421     this.lower = c + 32;
   422     return this;
   423   }
   425   if ( c >= 0xFF41 && c <= 0xFF5A ) {
   426     this.upper = c - 32;
   427     this.lower = c;
   428     return this;
   429   }
   431   // Specials
   432   // Range: U+FFF0 to U+FFFF
   434   return this;
   435 }
   437 function DecimalToHexString( n ) {
   438   n = Number( n );
   439   var h = "0x";
   441   for ( var i = 3; i >= 0; i-- ) {
   442     if ( n >= Math.pow(16, i) ){
   443       var t = Math.floor( n  / Math.pow(16, i));
   444       n -= t * Math.pow(16, i);
   445       if ( t >= 10 ) {
   446 	if ( t == 10 ) {
   447 	  h += "A";
   448 	}
   449 	if ( t == 11 ) {
   450 	  h += "B";
   451 	}
   452 	if ( t == 12 ) {
   453 	  h += "C";
   454 	}
   455 	if ( t == 13 ) {
   456 	  h += "D";
   457 	}
   458 	if ( t == 14 ) {
   459 	  h += "E";
   460 	}
   461 	if ( t == 15 ) {
   462 	  h += "F";
   463 	}
   464       } else {
   465 	h += String( t );
   466       }
   467     } else {
   468       h += "0";
   469     }
   470   }
   472   return h;
   473 }

mercurial