1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
15 * The Original Code is Mozilla Communicator client code, released
18 * The Initial Developer of the Original Code is
19 * Netscape Communications Corporation.
20 * Portions created by the Initial Developer are Copyright (C) 1998
21 * the Initial Developer. All Rights Reserved.
25 * Alternatively, the contents of this file may be used under the terms of
26 * either the GNU General Public License Version 2 or later (the "GPL"), or
27 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28 * in which case the provisions of the GPL or the LGPL are applicable instead
29 * of those above. If you wish to allow use of your version of this file only
30 * under the terms of either the GPL or the LGPL, and not to allow others to
31 * use your version of this file under the terms of the MPL, indicate your
32 * decision by deleting the provisions above and replace them with the notice
33 * and other provisions required by the GPL or the LGPL. If you do not delete
34 * the provisions above, a recipient may use your version of this file under
35 * the terms of any one of the MPL, the GPL or the LGPL.
37 * ***** END LICENSE BLOCK ***** */
41 File Name: 15.5.4.11-2.js
42 ECMA Section: 15.5.4.11 String.prototype.toLowerCase()
45 Returns a string equal in length to the length of the result of converting
46 this object to a string. The result is a string value, not a String object.
48 Every character of the result is equal to the corresponding character of the
49 string, unless that character has a Unicode 2.0 uppercase equivalent, in which
50 case the uppercase equivalent is used instead. (The canonical Unicode 2.0 case
51 mapping shall be used, which does not depend on implementation or locale.)
53 Note that the toLowerCase function is intentionally generic; it does not require
54 that its this value be a String object. Therefore it can be transferred to other
55 kinds of objects for use as a method.
57 Author: christine@netscape.com
58 Date: 12 november 1997
61 var SECTION = "15.5.4.11-2";
62 var VERSION = "ECMA_1";
64 var TITLE = "String.prototype.toLowerCase()";
66 writeHeaderToLog( SECTION + " "+ TITLE);
68 // Hiragana (no upper / lower case)
69 // Range: U+3040 to U+309F
71 for ( var i = 0x3040; i <= 0x309F; i++ ) {
72 var U = new Unicode( i );
74 new TestCase( SECTION,
75 "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()",
76 String.fromCharCode(U.lower),
77 eval("var s = new String( String.fromCharCode("+i+") ); s.toLowerCase()") );
79 new TestCase( SECTION,
80 "var s = new String( String.fromCharCode("+i+") ); s.toLowerCase().charCodeAt(0)",
82 eval("var s = new String( String.fromCharCode(i) ); s.toLowerCase().charCodeAt(0)") );
87 function MyObject( value ) {
89 this.substring = String.prototype.substring;
90 this.toString = new Function ( "return this.value+''" );
92 function Unicode( c ) {
96 // upper case Basic Latin
98 if ( c >= 0x0041 && c <= 0x005A) {
104 // lower case Basic Latin
105 if ( c >= 0x0061 && c <= 0x007a ) {
111 // upper case Latin-1 Supplement
112 if ( (c >= 0x00C0 && c <= 0x00D6) || (c >= 0x00D8 && c<=0x00DE) ) {
118 // lower case Latin-1 Supplement
119 if ( (c >= 0x00E0 && c <= 0x00F6) || (c >= 0x00F8 && c <= 0x00FE) ) {
130 if ( (c >= 0x0100 && c < 0x0138) || (c > 0x0149 && c < 0x0178) ) {
131 // special case for capital I
144 // if it's even, it's a capital and the lower case is c +1
148 // if it's odd, it's a lower case and upper case is c-1
160 if ( (c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F) ) {
162 // if it's odd, it's a capital and the lower case is c +1
166 // if it's even, it's a lower case and upper case is c-1
178 // need to improve this set
180 if ( c >= 0x0200 && c <= 0x0217 ) {
191 // Latin Extended Additional
192 // Range: U+1E00 to U+1EFF
193 // http://www.unicode.org/Unicode.charts/glyphless/U1E00.html
195 // Spacing Modifier Leters
196 // Range: U+02B0 to U+02FF
198 // Combining Diacritical Marks
199 // Range: U+0300 to U+036F
201 // skip Greek for now
203 // Range: U+0370 to U+03FF
206 // Range: U+0400 to U+04FF
208 if ( (c >= 0x0401 && c <= 0x040C) || ( c>= 0x040E && c <= 0x040F ) ) {
215 if ( c >= 0x0410 && c <= 0x042F ) {
221 if ( c >= 0x0430 && c<= 0x044F ) {
227 if ( (c >= 0x0451 && c <= 0x045C) || (c >=0x045E && c<= 0x045F) ) {
233 if ( c >= 0x0460 && c <= 0x047F ) {
245 // Range: U+0530 to U+058F
246 if ( c >= 0x0531 && c <= 0x0556 ) {
251 if ( c >= 0x0561 && c < 0x0587 ) {
258 // Range: U+0590 to U+05FF
262 // Range: U+0600 to U+06FF
265 // Range: U+0900 to U+097F
269 // Range: U+0980 to U+09FF
273 // Range: U+0A00 to U+0A7F
277 // Range: U+0A80 to U+0AFF
281 // Range: U+0B00 to U+0B7F
282 // no capital / lower case
286 // Range: U+0B80 to U+0BFF
287 // no capital / lower case
291 // Range: U+0C00 to U+0C7F
292 // no capital / lower case
296 // Range: U+0C80 to U+0CFF
297 // no capital / lower case
301 // Range: U+0D00 to U+0D7F
304 // Range: U+0E00 to U+0E7F
308 // Range: U+0E80 to U+0EFF
312 // Range: U+0F00 to U+0FBF
315 // Range: U+10A0 to U+10F0
316 if ( c >= 0x10A0 && c <= 0x10C5 ) {
321 if ( c >= 0x10D0 && c <= 0x10F5 ) {
328 // Range: U+1100 to U+11FF
331 // Range: U+1F00 to U+1FFF
335 // General Punctuation
336 // Range: U+2000 to U+206F
338 // Superscripts and Subscripts
339 // Range: U+2070 to U+209F
342 // Range: U+20A0 to U+20CF
345 // Combining Diacritical Marks for Symbols
346 // Range: U+20D0 to U+20FF
351 // Range: U+2150 to U+218F
356 // Range: U+2190 to U+21FF
358 // Mathematical Operators
359 // Range: U+2200 to U+22FF
361 // Miscellaneous Technical
362 // Range: U+2300 to U+23FF
365 // Range: U+2400 to U+243F
367 // Optical Character Recognition
368 // Range: U+2440 to U+245F
370 // Enclosed Alphanumerics
371 // Range: U+2460 to U+24FF
374 // Range: U+2500 to U+257F
377 // Range: U+2580 to U+259F
380 // Range: U+25A0 to U+25FF
382 // Miscellaneous Symbols
383 // Range: U+2600 to U+26FF
386 // Range: U+2700 to U+27BF
388 // CJK Symbols and Punctuation
389 // Range: U+3000 to U+303F
392 // Range: U+3040 to U+309F
395 // Range: U+30A0 to U+30FF
398 // Range: U+3100 to U+312F
400 // Hangul Compatibility Jamo
401 // Range: U+3130 to U+318F
404 // Range: U+3190 to U+319F
407 // Enclosed CJK Letters and Months
408 // Range: U+3200 to U+32FF
411 // Range: U+3300 to U+33FF
414 // Range: U+AC00 to U+D7A3
417 // Range: U+D800 to U+DB7F
419 // Private Use High Surrogates
420 // Range: U+DB80 to U+DBFF
423 // Range: U+DC00 to U+DFFF
426 // Range: U+E000 to U+F8FF
428 // CJK Compatibility Ideographs
429 // Range: U+F900 to U+FAFF
431 // Alphabetic Presentation Forms
432 // Range: U+FB00 to U+FB4F
434 // Arabic Presentation Forms-A
435 // Range: U+FB50 to U+FDFF
437 // Combining Half Marks
438 // Range: U+FE20 to U+FE2F
440 // CJK Compatibility Forms
441 // Range: U+FE30 to U+FE4F
443 // Small Form Variants
444 // Range: U+FE50 to U+FE6F
446 // Arabic Presentation Forms-B
447 // Range: U+FE70 to U+FEFF
449 // Halfwidth and Fullwidth Forms
450 // Range: U+FF00 to U+FFEF
452 if ( c >= 0xFF21 && c <= 0xFF3A ) {
458 if ( c >= 0xFF41 && c <= 0xFF5A ) {
465 // Range: U+FFF0 to U+FFFF
470 function DecimalToHexString( n ) {
474 for ( var i = 3; i >= 0; i-- ) {
475 if ( n >= Math.pow(16, i) ){
476 var t = Math.floor( n / Math.pow(16, i));
477 n -= t * Math.pow(16, i);