159151504615d929945dc59db37bf1166937748c6Steve Block// Copyright 2010 the V8 project authors. All rights reserved.
259151504615d929945dc59db37bf1166937748c6Steve Block// Redistribution and use in source and binary forms, with or without
359151504615d929945dc59db37bf1166937748c6Steve Block// modification, are permitted provided that the following conditions are
459151504615d929945dc59db37bf1166937748c6Steve Block// met:
559151504615d929945dc59db37bf1166937748c6Steve Block//
659151504615d929945dc59db37bf1166937748c6Steve Block//     * Redistributions of source code must retain the above copyright
759151504615d929945dc59db37bf1166937748c6Steve Block//       notice, this list of conditions and the following disclaimer.
859151504615d929945dc59db37bf1166937748c6Steve Block//     * Redistributions in binary form must reproduce the above
959151504615d929945dc59db37bf1166937748c6Steve Block//       copyright notice, this list of conditions and the following
1059151504615d929945dc59db37bf1166937748c6Steve Block//       disclaimer in the documentation and/or other materials provided
1159151504615d929945dc59db37bf1166937748c6Steve Block//       with the distribution.
1259151504615d929945dc59db37bf1166937748c6Steve Block//     * Neither the name of Google Inc. nor the names of its
1359151504615d929945dc59db37bf1166937748c6Steve Block//       contributors may be used to endorse or promote products derived
1459151504615d929945dc59db37bf1166937748c6Steve Block//       from this software without specific prior written permission.
1559151504615d929945dc59db37bf1166937748c6Steve Block//
1659151504615d929945dc59db37bf1166937748c6Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1759151504615d929945dc59db37bf1166937748c6Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1859151504615d929945dc59db37bf1166937748c6Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1959151504615d929945dc59db37bf1166937748c6Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2059151504615d929945dc59db37bf1166937748c6Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2159151504615d929945dc59db37bf1166937748c6Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2259151504615d929945dc59db37bf1166937748c6Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2359151504615d929945dc59db37bf1166937748c6Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2459151504615d929945dc59db37bf1166937748c6Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2559151504615d929945dc59db37bf1166937748c6Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2659151504615d929945dc59db37bf1166937748c6Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2759151504615d929945dc59db37bf1166937748c6Steve Block
2859151504615d929945dc59db37bf1166937748c6Steve Block// Test String.fromCharCode.
2959151504615d929945dc59db37bf1166937748c6Steve Block
3059151504615d929945dc59db37bf1166937748c6Steve Block
3159151504615d929945dc59db37bf1166937748c6Steve Block// Test various receivers and arguments passed to String.fromCharCode.
3259151504615d929945dc59db37bf1166937748c6Steve Block
3359151504615d929945dc59db37bf1166937748c6Steve BlockObject.prototype.fromCharCode = function(x) { return this; };
3459151504615d929945dc59db37bf1166937748c6Steve Block
3559151504615d929945dc59db37bf1166937748c6Steve Blockvar fcc = String.fromCharCode;
3659151504615d929945dc59db37bf1166937748c6Steve Blockvar fcc2 = fcc;
3759151504615d929945dc59db37bf1166937748c6Steve Block
3859151504615d929945dc59db37bf1166937748c6Steve Blockfunction constFun(x) { return function(y) { return x; }; }
3959151504615d929945dc59db37bf1166937748c6Steve Block
4059151504615d929945dc59db37bf1166937748c6Steve Blockfunction test(num) {
4159151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20));
4259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20 + 0x10000));
4359151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20 - 0x10000));
4459151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", String.fromCharCode(0x20 + 0.5));
4559151504615d929945dc59db37bf1166937748c6Steve Block
4659151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234));
4759151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234 + 0x10000));
4859151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234 - 0x10000));
4959151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", String.fromCharCode(0x1234 + 0.5));
5059151504615d929945dc59db37bf1166937748c6Steve Block
5159151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", String.fromCharCode(0x20, 0x20));
5259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", String.fromCharCode(0x20 + 0.5, 0x20));
5359151504615d929945dc59db37bf1166937748c6Steve Block
5459151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20));
5559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20 + 0x10000));
5659151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20 - 0x10000));
5759151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(" ", fcc(0x20 + 0.5));
5859151504615d929945dc59db37bf1166937748c6Steve Block
5959151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234));
6059151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234 + 0x10000));
6159151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234 - 0x10000));
6259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("\u1234", fcc(0x1234 + 0.5));
6359151504615d929945dc59db37bf1166937748c6Steve Block
6459151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", fcc(0x20, 0x20));
6559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals("  ", fcc(0x20 + 0.5, 0x20));
6659151504615d929945dc59db37bf1166937748c6Steve Block
6759151504615d929945dc59db37bf1166937748c6Steve Block  var receiver = (num < 5) ? String : (num < 9) ? "dummy" : 42;
68257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  fcc2 = (num < 5) ? fcc
69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                   : (num < 9) ? constFun(Object("dummy"))
70257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                               : constFun(Object(42));
71257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  var expected = (num < 5) ? " " : (num < 9) ? Object("dummy") : Object(42);
7259151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, receiver.fromCharCode(0x20));
7359151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, receiver.fromCharCode(0x20 - 0x10000));
7459151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, receiver.fromCharCode(0x20 + 0.5));
7559151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, fcc2(0x20));
7659151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, fcc2(0x20 - 0x10000));
7759151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, fcc2(0x20 + 0.5));
7859151504615d929945dc59db37bf1166937748c6Steve Block}
7959151504615d929945dc59db37bf1166937748c6Steve Block
8059151504615d929945dc59db37bf1166937748c6Steve Block// Use loop to test the custom IC.
8159151504615d929945dc59db37bf1166937748c6Steve Blockfor (var i = 0; i < 10; i++) {
8259151504615d929945dc59db37bf1166937748c6Steve Block  test(i);
8359151504615d929945dc59db37bf1166937748c6Steve Block}
8459151504615d929945dc59db37bf1166937748c6Steve Block
8559151504615d929945dc59db37bf1166937748c6Steve Block
8659151504615d929945dc59db37bf1166937748c6Steve Block// Test the custom IC works correctly when the map changes.
8759151504615d929945dc59db37bf1166937748c6Steve Blockfor (var i = 0; i < 10; i++) {
8859151504615d929945dc59db37bf1166937748c6Steve Block  var expected = (i < 5) ? " " : 42;
8959151504615d929945dc59db37bf1166937748c6Steve Block  if (i == 5) String.fromCharCode = function() { return 42; };
9059151504615d929945dc59db37bf1166937748c6Steve Block  assertEquals(expected, String.fromCharCode(0x20));
9159151504615d929945dc59db37bf1166937748c6Steve Block}
92