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