# 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.

This test checks that using the typeof operator on a JavaScript value and comparing it to a constant string works as expected.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


PASS isUndefined(undefined) is true
PASS isUndefined(1) is false
PASS isUndefinedStrict(undefined) is true
PASS isUndefinedStrict(1) is false
PASS isBoolean(true) is true
PASS isBoolean(false) is true
PASS isBoolean(1) is false
PASS isBooleanStrict(true) is true
PASS isBooleanStrict(false) is true
PASS isBooleanStrict(1) is false
PASS isNumber(1) is true
PASS isNumber(undefined) is false
PASS isNumberStrict(1) is true
PASS isNumberStrict(undefined) is false
PASS isString('string') is true
PASS isString(1) is false
PASS isStringStrict('string') is true
PASS isStringStrict(1) is false
PASS isObject({ }) is true
PASS isObject(1) is false
PASS isObjectStrict({ }) is true
PASS isObjectStrict(1) is false
PASS isFunction(function () { }) is true
PASS isFunction(1) is false
PASS isFunctionStrict(function () { }) is true
PASS isFunctionStrict(1) is false
PASS complexIsUndefinedTest() is 'PASS'
PASS complexIsBooleanTest() is 'PASS'
PASS complexIsNumberTest() is 'PASS'
PASS complexIsStringTest() is 'PASS'
PASS complexIsObjectTest() is 'PASS'
PASS complexIsFunctionTest() is 'PASS'
PASS complexIsUndefinedStrictTest() is 'PASS'
PASS complexIsBooleanStrictTest() is 'PASS'
PASS complexIsNumberStrictTest() is 'PASS'
PASS complexIsStringStrictTest() is 'PASS'
PASS complexIsObjectStrictTest() is 'PASS'
PASS complexIsFunctionStrictTest() is 'PASS'
PASS successfullyParsed is true

TEST COMPLETE

