You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
2.5 KiB

/*===
basic
string 3 foo
string 3 foo
string 12 fooundefined
string 16 fooundefinednull
string 20 fooundefinednulltrue
string 25 fooundefinednulltruefalse
string 28 fooundefinednulltruefalse123
string 31 fooundefinednulltruefalse123bar
string 34 fooundefinednulltruefalse123bar1,2
string 49 fooundefinednulltruefalse123bar1,2[object Object]
string 3 foo
===*/
print('basic');
function concatTest() {
var str = String('foo');
function pv(x) {
print(typeof x, x.length, x);
}
pv(str);
pv(str.concat());
pv(str.concat(undefined));
pv(str.concat(undefined, null));
pv(str.concat(undefined, null, true));
pv(str.concat(undefined, null, true, false));
pv(str.concat(undefined, null, true, false, 123));
pv(str.concat(undefined, null, true, false, 123, 'bar'));
pv(str.concat(undefined, null, true, false, 123, 'bar', [1,2]));
pv(str.concat(undefined, null, true, false, 123, 'bar', [1,2], { foo: 1, bar: 2 }));
pv(str);
}
try {
concatTest();
} catch (e) {
print(e);
}
/*===
unicode
102
111
111
4660
2046
128
102
111
111
65535
===*/
print('unicode');
function unicodeTest() {
var str = new String('foo\u1234');
var t;
var i;
t = str.concat('\u07fe', '\u0080foo', '\uffff');
for (i = 0; i < t.length; i++) {
print(t.charCodeAt(i));
}
}
try {
unicodeTest();
} catch (e) {
print(e);
}
/*===
coercion
TypeError
TypeError
string 7 truebar
string 8 falsebar
string 6 123bar
string 6 foobar
string 6 1,2bar
string 18 [object Object]bar
toString() obj1
toString() obj2
toString() obj3
string 15 firstfoobarquux
===*/
print('coercion');
function coercionTest() {
var t;
function test(x) {
var t;
try {
t = String.prototype.concat.call(x, 'bar');
print(typeof t, t.length, t);
} catch (e) {
print(e.name);
}
}
function mkObj(name, strval) {
return {
toString: function() { print('toString()', name); return strval; },
valueOf: function() { print('valueOf()', name); return 'unexpected'; }
};
}
// expect TypeError for these
test(undefined);
test(null);
// and a ToString() coercion for these
test(true);
test(false);
test(123);
test('foo');
test([1,2]);
test({ foo: 1, bar: 2 });
// coercion side effect test
t = String.prototype.concat.call('first', mkObj('obj1', 'foo'), mkObj('obj2', 'bar'), mkObj('obj3', 'quux'));
print(typeof t, t.length, t);
}
try {
coercionTest();
} catch (e) {
print(e);
}