
/*===
constructor as a function
string 
string undefined
string null
string true
string false
string -Infinity
string -123
string 0
string 0
string 123
string Infinity
string NaN
string 1,2
string [object Object]
string noval
===*/

print('constructor as a function');

function constructorAsFunctionTest() {
    function pv(x, noval) {
        print(typeof x, (noval ? 'noval' : x));
    }

    // No argument is handled different from undefined
    pv(String());

    pv(String(undefined));
    pv(String(null));
    pv(String(true));
    pv(String(false));
    pv(String(Number.NEGATIVE_INFINITY));
    pv(String(-123.0));
    pv(String(-0.0));
    pv(String(0.0));
    pv(String(123.0));
    pv(String(Number.POSITIVE_INFINITY));
    pv(String(Number.NaN));
    pv(String([1,2]));
    pv(String({ foo: 1, bar: 2 }));

    // the ToString() conversion of a function is implementation
    // specific so just check the type
    pv(String(function(){}), true);
}

try {
    constructorAsFunctionTest();
} catch (e) {
    print(e);
}

/*===
constructor
object  [object String] true
object undefined [object String] true
object null [object String] true
object true [object String] true
object false [object String] true
object -Infinity [object String] true
object -123 [object String] true
object 0 [object String] true
object 0 [object String] true
object 123 [object String] true
object Infinity [object String] true
object NaN [object String] true
object 1,2 [object String] true
object [object Object] [object String] true
object noval [object String] true
===*/

print('constructor');

function constructorTest() {
    function pv(x, noval) {
        print(typeof x, (noval ? 'noval' : x), Object.prototype.toString.call(x), Object.isExtensible(x));
    }

    // No argument is handled different from undefined
    pv(new String());

    pv(new String(undefined));
    pv(new String(null));
    pv(new String(true));
    pv(new String(false));
    pv(new String(Number.NEGATIVE_INFINITY));
    pv(new String(-123.0));
    pv(new String(-0.0));
    pv(new String(0.0));
    pv(new String(123.0));
    pv(new String(Number.POSITIVE_INFINITY));
    pv(new String(Number.NaN));
    pv(new String([1,2]));
    pv(new String({ foo: 1, bar: 2 }));

    // the ToString() conversion of a function is implementation
    // specific so just check the type
    pv(new String(function(){}), true);
}

try {
    constructorTest();
} catch (e) {
    print(e);
}

