initial import
[vuplus_webkit] / Source / JavaScriptCore / tests / mozilla / ecma / String / 15.5.4.12-5.js
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-1.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-1";
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     // Armenian
58     // Range: U+0530 to U+058F
59     for ( var i = 0x0530; i <= 0x058F; 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     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] = 0x039C;
124         u[1] = c;
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     // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE, uppercase takes two code points
176     if (c == 0x0149) {
177         u[0] = 0x02bc;
178         u[1] = c;
179         return u;
180     }
181     
182     if ( (c >= 0x0139 && c < 0x0149) || (c > 0x0178 && c < 0x017F) ) {
183         if ( c % 2 == 1 ) {
184         // if it's odd, it's a capital and the lower case is c +1
185             u[0] = c;
186             u[1] = c+1;
187         } else {
188         // if it's even, it's a lower case and upper case is c-1
189             u[0] = c-1;
190             u[1] = c;
191         }
192         return u;
193     }
194     if ( c == 0x017F ) {
195         u[0] = 0x0053;
196         u[1] = c;
197     }
198
199     // Latin Extended B
200     // need to improve this set
201
202     if ( c >= 0x0200 && c <= 0x0217 ) {
203         if ( c % 2 == 0 ) {
204             u[0] = c;
205             u[1] = c+1;
206         } else {
207             u[0] = c-1;
208             u[1] = c;
209         }
210         return u;
211     }
212
213     // Latin Extended Additional
214     // Range: U+1E00 to U+1EFF
215     // http://www.unicode.org/Unicode.charts/glyphless/U1E00.html
216
217     // Spacing Modifier Leters
218     // Range: U+02B0 to U+02FF
219
220     // Combining Diacritical Marks
221     // Range: U+0300 to U+036F
222
223     // skip Greek for now
224     // Greek
225     // Range: U+0370 to U+03FF
226
227     // Cyrillic
228     // Range: U+0400 to U+04FF
229
230     if ( c >= 0x0400 && c <= 0x040F) {
231         u[0] = c;
232         u[1] = c + 80;
233         return u;
234     }
235
236
237     if ( c >= 0x0410  && c <= 0x042F ) {
238         u[0] = c;
239         u[1] = c + 32;
240         return u;
241     }
242
243     if ( c >= 0x0430 && c<= 0x044F ) {
244         u[0] = c - 32;
245         u[1] = c;
246         return u;
247
248     }
249     if ( c >= 0x0450 && c<= 0x045F ) {
250         u[0] = c -80;
251         u[1] = c;
252         return u;
253     }
254
255     if ( c >= 0x0460 && c <= 0x047F ) {
256         if ( c % 2 == 0 ) {
257             u[0] = c;
258             u[1] = c +1;
259         } else {
260             u[0] = c - 1;
261             u[1] = c;
262         }
263         return u;
264     }
265
266     // Armenian
267     // Range: U+0530 to U+058F
268     if ( c >= 0x0531 && c <= 0x0556 ) {
269         u[0] = c;
270         u[1] = c + 48;
271         return u;
272     }
273     if ( c >= 0x0561 && c < 0x0587 ) {
274         u[0] = c - 48;
275         u[1] = c;
276         return u;
277     }
278     if (c == 0x0587) {
279         u[0] = 0x0535;
280         u[1] = c;
281         return u;
282     }
283
284     // Hebrew
285     // Range: U+0590 to U+05FF
286
287
288     // Arabic
289     // Range: U+0600 to U+06FF
290
291     // Devanagari
292     // Range: U+0900 to U+097F
293
294
295     // Bengali
296     // Range: U+0980 to U+09FF
297
298
299     // Gurmukhi
300     // Range: U+0A00 to U+0A7F
301
302
303     // Gujarati
304     // Range: U+0A80 to U+0AFF
305
306
307     // Oriya
308     // Range: U+0B00 to U+0B7F
309     // no capital / lower case
310
311
312     // Tamil
313     // Range: U+0B80 to U+0BFF
314     // no capital / lower case
315
316
317     // Telugu
318     // Range: U+0C00 to U+0C7F
319     // no capital / lower case
320
321
322     // Kannada
323     // Range: U+0C80 to U+0CFF
324     // no capital / lower case
325
326
327     // Malayalam
328     // Range: U+0D00 to U+0D7F
329
330     // Thai
331     // Range: U+0E00 to U+0E7F
332
333
334     // Lao
335     // Range: U+0E80 to U+0EFF
336
337
338     // Tibetan
339     // Range: U+0F00 to U+0FBF
340
341     // Georgian
342     // Range: U+10A0 to U+10F0
343
344     // Hangul Jamo
345     // Range: U+1100 to U+11FF
346
347     // Greek Extended
348     // Range: U+1F00 to U+1FFF
349     // skip for now
350
351
352     // General Punctuation
353     // Range: U+2000 to U+206F
354
355     // Superscripts and Subscripts
356     // Range: U+2070 to U+209F
357
358     // Currency Symbols
359     // Range: U+20A0 to U+20CF
360
361
362     // Combining Diacritical Marks for Symbols
363     // Range: U+20D0 to U+20FF
364     // skip for now
365
366
367     // Number Forms
368     // Range: U+2150 to U+218F
369     // skip for now
370
371
372     // Arrows
373     // Range: U+2190 to U+21FF
374
375     // Mathematical Operators
376     // Range: U+2200 to U+22FF
377
378     // Miscellaneous Technical
379     // Range: U+2300 to U+23FF
380
381     // Control Pictures
382     // Range: U+2400 to U+243F
383
384     // Optical Character Recognition
385     // Range: U+2440 to U+245F
386
387     // Enclosed Alphanumerics
388     // Range: U+2460 to U+24FF
389
390     // Box Drawing
391     // Range: U+2500 to U+257F
392
393     // Block Elements
394     // Range: U+2580 to U+259F
395
396     // Geometric Shapes
397     // Range: U+25A0 to U+25FF
398
399     // Miscellaneous Symbols
400     // Range: U+2600 to U+26FF
401
402     // Dingbats
403     // Range: U+2700 to U+27BF
404
405     // CJK Symbols and Punctuation
406     // Range: U+3000 to U+303F
407
408     // Hiragana
409     // Range: U+3040 to U+309F
410
411     // Katakana
412     // Range: U+30A0 to U+30FF
413
414     // Bopomofo
415     // Range: U+3100 to U+312F
416
417     // Hangul Compatibility Jamo
418     // Range: U+3130 to U+318F
419
420     // Kanbun
421     // Range: U+3190 to U+319F
422
423
424     // Enclosed CJK Letters and Months
425     // Range: U+3200 to U+32FF
426
427     // CJK Compatibility
428     // Range: U+3300 to U+33FF
429
430     // Hangul Syllables
431     // Range: U+AC00 to U+D7A3
432
433     // High Surrogates
434     // Range: U+D800 to U+DB7F
435
436     // Private Use High Surrogates
437     // Range: U+DB80 to U+DBFF
438
439     // Low Surrogates
440     // Range: U+DC00 to U+DFFF
441
442     // Private Use Area
443     // Range: U+E000 to U+F8FF
444
445     // CJK Compatibility Ideographs
446     // Range: U+F900 to U+FAFF
447
448     // Alphabetic Presentation Forms
449     // Range: U+FB00 to U+FB4F
450
451     // Arabic Presentation Forms-A
452     // Range: U+FB50 to U+FDFF
453
454     // Combining Half Marks
455     // Range: U+FE20 to U+FE2F
456
457     // CJK Compatibility Forms
458     // Range: U+FE30 to U+FE4F
459
460     // Small Form Variants
461     // Range: U+FE50 to U+FE6F
462
463     // Arabic Presentation Forms-B
464     // Range: U+FE70 to U+FEFF
465
466     // Halfwidth and Fullwidth Forms
467     // Range: U+FF00 to U+FFEF
468
469     if ( c >= 0xFF21 && c <= 0xFF3A ) {
470         u[0] = c;
471         u[1] = c + 32;
472         return u;
473     }
474
475     if ( c >= 0xFF41 && c <= 0xFF5A ) {
476         u[0] = c - 32;
477         u[1] = c;
478         return u;
479     }
480
481     // Specials
482     // Range: U+FFF0 to U+FFFF
483
484     return u;
485 }
486
487 function DecimalToHexString( n ) {
488     n = Number( n );
489     var h = "0x";
490
491     for ( var i = 3; i >= 0; i-- ) {
492         if ( n >= Math.pow(16, i) ){
493             var t = Math.floor( n  / Math.pow(16, i));
494             n -= t * Math.pow(16, i);
495             if ( t >= 10 ) {
496                 if ( t == 10 ) {
497                     h += "A";
498                 }
499                 if ( t == 11 ) {
500                     h += "B";
501                 }
502                 if ( t == 12 ) {
503                     h += "C";
504                 }
505                 if ( t == 13 ) {
506                     h += "D";
507                 }
508                 if ( t == 14 ) {
509                     h += "E";
510                 }
511                 if ( t == 15 ) {
512                     h += "F";
513                 }
514             } else {
515                 h += String( t );
516             }
517         } else {
518             h += "0";
519         }
520     }
521
522     return h;
523 }