add more test for rest and default

pull/4548/head
Tan Li Hau 6 years ago
parent 96156d0f07
commit 968dc8d58e

@ -56,7 +56,11 @@ function get_context_from_expression(node: Pattern, result: string[]): string[]
return result;
case 'ObjectPattern':
for (const property of node.properties) {
if (property.type === 'Property') {
get_context_from_expression(property.value, result);
} else {
get_context_from_expression(property, result);
}
}
return result;
case 'MemberExpression':

@ -275,12 +275,17 @@ export default class AwaitBlockWrapper extends Wrapper {
function replace_context(block: Block, pattern: Pattern) {
if (pattern.type === 'ObjectPattern') {
for (const property of pattern.properties) {
if (property.type === 'Property') {
if (property.value.type === 'Identifier') {
// @ts-ignore
property.value = x`#ctx[${block.renderer.context_lookup.get(property.value.name).index}]`;
} else {
replace_context(block, property.value);
}
} else {
// @ts-ignore
replace_context(block, property);
}
}
} else if (pattern.type === 'ArrayPattern') {
for (let i=0; i<pattern.elements.length; i++) {

@ -305,7 +305,7 @@ export default function mustache(parser: Parser) {
const await_block_shorthand = type === 'AwaitBlock' && parser.eat('then');
if (await_block_shorthand) {
parser.require_whitespace();
block.value = parser.read_identifier();
block.value = parser.read_destructure_pattern();
parser.allow_whitespace();
}

@ -1,6 +1,6 @@
export default {
props: {
thePromise: new Promise(resolve => {}),
thePromise: new Promise(resolve => {})
},
html: `
@ -8,22 +8,54 @@ export default {
`,
async test({ assert, component, target }) {
let promise = Promise.resolve([1, 2]);
component.thePromise = promise;
await (component.thePromise = Promise.resolve([1, 2]));
await promise;
assert.htmlEqual(target.innerHTML, `
assert.htmlEqual(
target.innerHTML,
`
<p>a: 1</p>
<p>b: 2</p>
`);
`
);
promise = Promise.resolve([4, 5]);
component.thePromise = promise;
await (component.thePromise = Promise.resolve([4, 5]));
await promise;
assert.htmlEqual(target.innerHTML, `
assert.htmlEqual(
target.innerHTML,
`
<p>a: 4</p>
<p>b: 5</p>
`);
`
);
try {
await (component.thePromise = Promise.reject(['a', [6, 7]]));
} catch {
// do nothing
}
assert.htmlEqual(
target.innerHTML,
`
<p>c: a</p>
<p>d: 6</p>
<p>e: 7</p>
`
);
try {
await (component.thePromise = Promise.reject(['b', [8, 9]]));
} catch {
// do nothing
}
assert.htmlEqual(
target.innerHTML,
`
<p>c: b</p>
<p>d: 8</p>
<p>e: 9</p>
`
);
}
};

@ -7,4 +7,8 @@
{:then [ a, b ]}
<p>a: {a}</p>
<p>b: {b}</p>
{:catch [c, [d, e]]}
<p>c: {c}</p>
<p>d: {d}</p>
<p>e: {e}</p>
{/await}

@ -0,0 +1,23 @@
export default {
async test({ assert, component, target }) {
await Promise.resolve();
assert.htmlEqual(
target.innerHTML,
`
<p>a: 3</p>
<p>b: 2</p>
<p>c: 3</p>
<p>a: 1</p>
<p>b: 2</p>
<p>c: 3</p>
<p>a: 3</p>
<p>b: 2</p>
<p>c: 3</p>
<p>a: 1</p>
<p>b: 2</p>
<p>c: 3</p>
`
);
}
};

@ -0,0 +1,34 @@
<script>
let object = Promise.resolve({ b: 2, c: 3 });
let array = Promise.resolve([1, 2]);
let objectReject = Promise.reject({ b: 2, c: 3 });
let arrayReject = Promise.reject([1, 2]);
</script>
{#await object then { a = 3, b = 4, c }}
<p>a: {a}</p>
<p>b: {b}</p>
<p>c: {c}</p>
{/await}
{#await array then [a, b, c = 3]}
<p>a: {a}</p>
<p>b: {b}</p>
<p>c: {c}</p>
{/await}
{#await objectReject then value}
resolved
{:catch { a = 3, b = 4, c }}
<p>a: {a}</p>
<p>b: {b}</p>
<p>c: {c}</p>
{/await}
{#await arrayReject then value}
resolved
{:catch [a, b, c = 3]}
<p>a: {a}</p>
<p>b: {b}</p>
<p>c: {c}</p>
{/await}

@ -1,6 +1,6 @@
export default {
props: {
thePromise: new Promise(resolve => {}),
thePromise: new Promise(resolve => {})
},
html: `
@ -8,20 +8,56 @@ export default {
`,
async test({ assert, component, target }) {
let promise = Promise.resolve({ error: 'error message' });
component.thePromise = promise;
await (component.thePromise = Promise.resolve({ error: "error message" }));
await promise;
assert.htmlEqual(target.innerHTML, `
assert.htmlEqual(
target.innerHTML,
`
<p>error: error message</p>
`);
<p>result: undefined</p>
`
);
promise = Promise.resolve({ result: '42' });
component.thePromise = promise;
await (component.thePromise = Promise.resolve({ result: "42" }));
await promise;
assert.htmlEqual(target.innerHTML, `
assert.htmlEqual(
target.innerHTML,
`
<p>error: undefined</p>
<p>result: 42</p>
`);
`
);
try {
await (component.thePromise = Promise.reject({
error: { message: "oops", code: "123" }
}));
} catch {
// do nothing
}
assert.htmlEqual(
target.innerHTML,
`
<p>message: oops</p>
<p>code: 123</p>
`
);
try {
await (component.thePromise = Promise.reject({
error: { message: "timeout", code: "456" }
}));
} catch {
// do nothing
}
assert.htmlEqual(
target.innerHTML,
`
<p>message: timeout</p>
<p>code: 456</p>
`
);
}
};

@ -5,9 +5,9 @@
{#await thePromise}
loading...
{:then { result, error }}
{#if error}
<p>error: {error}</p>
{:else}
<p>result: {result}</p>
{/if}
{:catch { error: { message, code } }}
<p>message: {message}</p>
<p>code: {code}</p>
{/await}

@ -0,0 +1,21 @@
export default {
async test({ assert, component, target }) {
await Promise.resolve();
assert.htmlEqual(
target.innerHTML,
`
<p>a: 1</p>
<p>rest: {"b":2,"c":3}</p>
<p>a: 1</p>
<p>b: 2</p>
<p>rest: [3,4,5,6]</p>
<p>a: 1</p>
<p>rest: {"b":2,"c":3}</p>
<p>a: 1</p>
<p>b: 2</p>
<p>rest: [3,4,5,6]</p>
`
);
}
};

@ -0,0 +1,32 @@
<script>
let object = Promise.resolve({ a: 1, b: 2, c: 3 });
let array = Promise.resolve([1, 2, 3, 4, 5, 6]);
let objectReject = Promise.reject({ a: 1, b: 2, c: 3 });
let arrayReject = Promise.reject([1, 2, 3, 4, 5, 6]);
</script>
{#await object then { a, ...rest }}
<p>a: {a}</p>
<p>rest: {JSON.stringify(rest)}</p>
{/await}
{#await array then [a, b, ...rest]}
<p>a: {a}</p>
<p>b: {b}</p>
<p>rest: {JSON.stringify(rest)}</p>
{/await}
{#await objectReject then value}
resolved
{:catch { a, ...rest }}
<p>a: {a}</p>
<p>rest: {JSON.stringify(rest)}</p>
{/await}
{#await arrayReject then value}
resolved
{:catch [a, b, ...rest]}
<p>a: {a}</p>
<p>b: {b}</p>
<p>rest: {JSON.stringify(rest)}</p>
{/await}
Loading…
Cancel
Save