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