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