1// Copyright 2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// Flags: --random-seed=17 --allow-natives-syntax
29// Flags: --expose-externalize-string
30
31assertEquals("ΚΟΣΜΟΣ ΚΟΣΜΟΣ".toLowerCase(), "κοσμος κοσμος");
32
33var A_CODE = "A".charCodeAt(0);
34var Z_CODE = "Z".charCodeAt(0);
35var a_CODE = "a".charCodeAt(0);
36var z_CODE = "z".charCodeAt(0);
37
38function charCodeToLower(charCode) {
39  if (A_CODE <= charCode && charCode <= Z_CODE) {
40    return charCode + a_CODE - A_CODE;
41  }
42  return charCode;
43}
44
45function charCodeToUpper(charCode) {
46  if (a_CODE <= charCode && charCode <= z_CODE) {
47    return charCode - (a_CODE - A_CODE);
48  }
49  return charCode;
50}
51
52function test(length) {
53  var str = "";
54  var strLower = "";
55  var strUpper = "";
56  for (var i = 0; i < length; i++) {
57    var c = Math.round(0x7f * Math.random());
58    str += String.fromCharCode(c);
59    strLower += String.fromCharCode(charCodeToLower(c));
60    strUpper += String.fromCharCode(charCodeToUpper(c));
61  }
62  %FlattenString(strLower);
63  %FlattenString(strUpper);
64  // Sequential string.
65  assertEquals(strLower, str.toLowerCase());
66  assertEquals(strUpper, str.toUpperCase());
67  // Cons string.
68  assertEquals(strLower + strLower, (str + str).toLowerCase());
69  assertEquals(strUpper + strUpper, (str + str).toUpperCase());
70  // Sliced string.
71  assertEquals(strLower.substring(1), str.substring(1).toLowerCase());
72  assertEquals(strUpper.substring(1), str.substring(1).toUpperCase());
73  // External string.
74  externalizeString(str, false);
75  assertEquals(strLower, str.toLowerCase());
76  assertEquals(strUpper, str.toUpperCase());
77}
78
79for (var i = 1; i <= 128; i <<= 1); {
80  for (var j = 0; j < 8; j++) {
81    for (var k = 0; k < 3; k++) {
82      test(i + j);
83    }
84  }
85}
86