initial import
[vuplus_webkit] / Source / JavaScriptCore / tests / mozilla / ecma / String / 15.5.4.11-3.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.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@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 }