// Copyright 2013 the V8 project authors. All rights reserved.
// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1.  Redistributions of source code must retain the above copyright
//     notice, this list of conditions and the following disclaimer.
// 2.  Redistributions in binary form must reproduce the above copyright
//     notice, this list of conditions and the following disclaimer in the
//     documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

description("KDE JS Test");
var _array = new Array(1,2,3);
_array.toString = Object.prototype.toString;
shouldBe("_array.toString()","\"[object Array]\"");
var _string = new String("test");
_string.toString = Object.prototype.toString;
shouldBe("_string.toString()","\"[object String]\"");
var _boolean = new Boolean(true);
_boolean.toString = Object.prototype.toString;
shouldBe("_boolean.toString()","\"[object Boolean]\"");
var _number = new Number(4);
_number.toString = Object.prototype.toString;
shouldBe("_number.toString()","\"[object Number]\"");
var _object = new Object();
_object.toString = Object.prototype.toString;
shouldBe("_object.toString()","\"[object Object]\"");
var _date = new Date();
_date.toString = Object.prototype.toString;
shouldBe("_date.toString()","\"[object Date]\"");
var _regexp = new RegExp();
_regexp.toString = Object.prototype.toString;
shouldBe("_regexp.toString()","\"[object RegExp]\"");
var _error = new Error();
_error.toString = Object.prototype.toString;
shouldBe("_error.toString()","\"[object Error]\"");
var _function = new Function();
_function.toString = Object.prototype.toString;
shouldBe("_function.toString()","\"[object Function]\"");
