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