
var obj;

function prS(x) {
    print(typeof x, x);
}

function prO(x) {
    print(typeof x, x.toString());
}

/*===
string 
string undefined
string null
string true
string false
string -Infinity
string -123
string 0
string 0
string 123
string Infinity
string 
string foo
string obj.toString()
string 1,2,3
===*/

/* Called as a function, returns string (not object).
 *
 * Note that implementation MUST distinguish between an argument "not given",
 * vs. "given as undefined".  This is currently handled by using varargs.
 */

// empty string result
prS(String());
prS(String(undefined));

prS(String(null));
prS(String(true));
prS(String(false));

prS(String(Number.NEGATIVE_INFINITY));
prS(String(-123));
prS(String(-0));
prS(String(+0));
prS(String(+123));
prS(String(Number.POSITIVE_INFINITY));

prS(String(''));
prS(String('foo'));

obj = {
    toString: function() { return 'obj.toString()' }
}
prS(String(obj));

prS(String([1,2,3]));

/*===
object 
object undefined
object null
object true
object false
object -Infinity
object -123
object 0
object 0
object 123
object Infinity
object 
object foo
object obj.toString()
object 1,2,3
===*/

/* Called as a constructor, returns String object */

// empty string result
prS(new String());
prS(new String(undefined));

prS(new String(null));
prS(new String(true));
prS(new String(false));

prS(new String(Number.NEGATIVE_INFINITY));
prS(new String(-123));
prS(new String(-0));
prS(new String(+0));
prS(new String(+123));
prS(new String(Number.POSITIVE_INFINITY));

prS(new String(''));
prS(new String('foo'));

obj = {
    toString: function() { return 'obj.toString()' }
}
prS(new String(obj));

prS(new String([1,2,3]));

