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