108 lines
2.1 KiB
JavaScript
108 lines
2.1 KiB
JavaScript
description("Test default values in destructuring patterns: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-destructuring-binding-patterns");
|
|
function assert(a, b) {
|
|
if (b === a)
|
|
testPassed(a + "," + b);
|
|
else
|
|
testFailed(a + "," + b);
|
|
}
|
|
|
|
function test1() {
|
|
var {x = 40} = {};
|
|
var {prop: y = 40} = {};
|
|
var {prop: {z} = {z: 100}} = {};
|
|
assert(x, 40);
|
|
assert(y, 40);
|
|
assert(z, 100);
|
|
}
|
|
test1();
|
|
|
|
function arr() { return [undefined, 20, undefined]; }
|
|
|
|
function test2() {
|
|
var [x = "Hello", y = 40, z = 30] = [undefined, 20, undefined];
|
|
assert(x, "Hello");
|
|
assert(y, 20);
|
|
assert(z, 30);
|
|
var [x = "Hello", y = 40, z = 30] = arr();
|
|
assert(x, "Hello");
|
|
assert(y, 20);
|
|
assert(z, 30);
|
|
}
|
|
test2();
|
|
|
|
|
|
function test3() {
|
|
var z = "z";
|
|
var [x = z] = [];
|
|
assert(x, "z");
|
|
z = "zz";
|
|
var [x = eval("z")] = [];
|
|
assert(x, "zz");
|
|
|
|
var [{a} = {a: 40}] = [undefined];
|
|
assert(a, 40);
|
|
var [{a = 50}] = [{a: undefined}];
|
|
assert(a, 50);
|
|
}
|
|
test3();
|
|
|
|
|
|
function test4() {
|
|
var [{prop: {b = 40}}] = [{prop: {b: undefined}}];
|
|
var [{prop: [c = 50]}] = [{prop: []}];
|
|
var [{prop: [d = 60]} = {prop: [100]}] = [];
|
|
assert(b, 40);
|
|
assert(c, 50);
|
|
assert(d, 100)
|
|
}
|
|
test4();
|
|
|
|
|
|
function test5() {
|
|
var {x = undefined} = {x: null};
|
|
assert(x, null);
|
|
var {x = undefined} = {x: false};
|
|
assert(x, false);
|
|
var {x = undefined} = {x: 0};
|
|
assert(x, 0);
|
|
}
|
|
test5();
|
|
|
|
|
|
function test6() {
|
|
var [x = 50, y = x + 1] = [];
|
|
assert(x, 50);
|
|
assert(y, 51);
|
|
|
|
var [x = y, y = x + 1] = [];
|
|
assert(x, 51);
|
|
assert(y, 52);
|
|
|
|
// FIXME: make tests for TDZ failures when we land block scoping 'let' and 'const'.
|
|
var [a = b, b = a] = [];
|
|
assert(a, undefined);
|
|
assert(b, undefined);
|
|
}
|
|
test6();
|
|
|
|
|
|
function test7(a, b) {
|
|
var {c = a, d = c + b} = {};
|
|
assert(c, 10);
|
|
assert(d, 30);
|
|
}
|
|
test7(10, 20);
|
|
|
|
|
|
function test8(x) {
|
|
// How much uglier can we make a factorial function?
|
|
if (x <= 0)
|
|
return {p: 1};
|
|
|
|
var {p = {p: x * test8(x - 1).p}} = {};
|
|
return p;
|
|
}
|
|
assert(test8(5).p, 120);
|
|
assert(test8(10).p, 3628800);
|
|
assert(test8(0).p, 1);
|