Skip to content

Commit 9d0a18a

Browse files
committed
Add more shadowing tests
1 parent b540854 commit 9d0a18a

File tree

5 files changed

+94
-15
lines changed

5 files changed

+94
-15
lines changed

packages/@ember/-internals/glimmer/tests/integration/helpers/array-test.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { RenderingTestCase, moduleFor, strip, runTask } from 'internal-test-helpers';
1+
import {
2+
RenderingTestCase,
3+
defineComponent,
4+
moduleFor,
5+
runTask,
6+
strip,
7+
} from 'internal-test-helpers';
28

39
import { set } from '@ember/object';
410

@@ -20,6 +26,21 @@ moduleFor(
2026
this.assertStableRerender();
2127
}
2228

29+
['@test the array helper can be shadowed']() {
30+
function array(...list) {
31+
return list.map((n) => n * 2);
32+
}
33+
34+
let First = defineComponent({ array }, `{{#each (array 1 2 3) as |n|}}[{{n}}]{{/each}}`);
35+
36+
let Root = defineComponent(
37+
{ shadowArray: array, First },
38+
`{{#let shadowArray as |array|}}{{#each (array 5 10 15) as |n|}}[{{n}}]{{/each}}{{/let}}<First />`
39+
);
40+
41+
this.renderComponent(Root, { expect: '[10][20][30][2][4][6]' });
42+
}
43+
2344
['@test can have more than one value']() {
2445
this.render(strip`
2546
{{#let (array "Sergio" "Robert") as |people|}}

packages/@ember/-internals/glimmer/tests/integration/helpers/fn-test.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { set } from '@ember/object';
22
import { DEBUG } from '@glimmer/env';
3-
import { RenderingTestCase, moduleFor, runTask } from 'internal-test-helpers';
3+
import { RenderingTestCase, defineComponent, moduleFor, runTask } from 'internal-test-helpers';
44
import { Component } from '../../utils/helpers';
55

66
moduleFor(
@@ -22,6 +22,14 @@ moduleFor(
2222
});
2323
}
2424

25+
'@test fn can be shadowed'() {
26+
let First = defineComponent(
27+
{ fn: boundFn, boundFn, id, invoke },
28+
`[{{invoke (fn id 1)}}]{{#let boundFn as |fn|}}[{{invoke (fn id 2)}}{{/let}}]`
29+
);
30+
this.renderComponent(First, { expect: `[bound:1][bound:2]` });
31+
}
32+
2533
'@test updates when arguments change'() {
2634
this.render(`{{invoke (fn this.myFunc this.arg1 this.arg2)}}`, {
2735
myFunc(arg1, arg2) {
@@ -209,3 +217,13 @@ moduleFor(
209217
}
210218
}
211219
);
220+
221+
function invoke(fn) {
222+
return fn();
223+
}
224+
225+
function boundFn(fn, ...args) {
226+
return () => fn(...args.map((arg) => `bound:${arg}`));
227+
}
228+
229+
let id = (arg) => arg;

packages/@ember/-internals/glimmer/tests/integration/helpers/get-test.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RenderingTestCase, moduleFor, runTask } from 'internal-test-helpers';
1+
import { RenderingTestCase, defineComponent, moduleFor, runTask } from 'internal-test-helpers';
22

33
import { set, get } from '@ember/object';
44

@@ -32,6 +32,17 @@ moduleFor(
3232
this.assertText('[red] [red]');
3333
}
3434

35+
['@test can be shadowed']() {
36+
let get = (obj, key) => `obj.${key}=${obj[key]}`;
37+
let obj = { apple: 'red', banana: 'yellow' };
38+
let Root = defineComponent(
39+
{ get, outerGet: get, obj },
40+
`[{{get obj 'apple'}}][{{#let outerGet as |get|}}{{get obj 'banana'}}{{/let}}]`
41+
);
42+
43+
this.renderComponent(Root, { expect: '[obj.apple=red][obj.banana=yellow]' });
44+
}
45+
3546
['@test should be able to get an object value with nested static key']() {
3647
this.render(
3748
`[{{get this.colors "apple.gala"}}] [{{if true (get this.colors "apple.gala")}}]`,

packages/@ember/-internals/glimmer/tests/integration/helpers/hash-test.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { RenderingTestCase, moduleFor, runTask } from 'internal-test-helpers';
1+
import { RenderingTestCase, defineComponent, moduleFor, runTask } from 'internal-test-helpers';
22

33
import { Component } from '../../utils/helpers';
44

@@ -17,6 +17,21 @@ moduleFor(
1717
this.assertText('Sergio');
1818
}
1919

20+
['@test can be shadowed']() {
21+
let hash = (obj) =>
22+
Object.entries(obj)
23+
.map(([key, value]) => `hash:${key}=${value}`)
24+
.join(',');
25+
let Root = defineComponent(
26+
{ hash, shadowHash: hash },
27+
`({{hash apple='red' banana='yellow'}}) ({{#let shadowHash as |hash|}}{{hash apple='green'}}{{/let}})`
28+
);
29+
30+
this.renderComponent(Root, {
31+
expect: '(hash:apple=red,hash:banana=yellow) (hash:apple=green)',
32+
});
33+
}
34+
2035
['@test can have more than one key-value']() {
2136
this.render(
2237
`{{#let (hash name="Sergio" lastName="Arbeo") as |person|}}{{person.name}} {{person.lastName}}{{/let}}`

packages/internal-test-helpers/lib/test-cases/rendering.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
import type { EmberPrecompileOptions } from 'ember-template-compiler';
2-
import { compile } from 'ember-template-compiler';
3-
import { EventDispatcher } from '@ember/-internals/views';
41
import type { Renderer } from '@ember/-internals/glimmer';
2+
import { _resetRenderers, helper, Helper } from '@ember/-internals/glimmer';
3+
import { EventDispatcher } from '@ember/-internals/views';
54
import Component, { setComponentTemplate } from '@ember/component';
6-
import { helper, Helper, _resetRenderers } from '@ember/-internals/glimmer';
5+
import type { EmberPrecompileOptions } from 'ember-template-compiler';
6+
import { compile } from 'ember-template-compiler';
77
import type Resolver from '../test-resolver';
88
import { ModuleBasedResolver } from '../test-resolver';
99

10-
import AbstractTestCase from './abstract';
11-
import buildOwner from '../build-owner';
12-
import { runAppend, runDestroy, runTask } from '../run';
1310
import type { InternalFactory } from '@ember/-internals/owner';
14-
import type { BootOptions, EngineInstanceOptions } from '@ember/engine/instance';
15-
import type EngineInstance from '@ember/engine/instance';
1611
import templateOnly from '@ember/component/template-only';
12+
import type EngineInstance from '@ember/engine/instance';
13+
import type { BootOptions, EngineInstanceOptions } from '@ember/engine/instance';
14+
import buildOwner from '../build-owner';
15+
import { runAppend, runDestroy, runTask } from '../run';
16+
import AbstractTestCase from './abstract';
1717

1818
const TextNode = window.Text;
1919

@@ -172,6 +172,13 @@ export default abstract class RenderingTestCase extends AbstractTestCase {
172172
runAppend(this.component);
173173
}
174174

175+
renderComponent(component: object, options: { expect: string }) {
176+
this.registerComponent('root', { ComponentClass: component });
177+
this.render('<Root />');
178+
this.assertHTML(options.expect);
179+
this.assertStableRerender();
180+
}
181+
175182
rerender() {
176183
this.component!.rerender();
177184
}
@@ -195,14 +202,21 @@ export default abstract class RenderingTestCase extends AbstractTestCase {
195202

196203
registerComponent(
197204
name: string,
198-
{ ComponentClass = Component, template = null, resolveableTemplate = null }
205+
{
206+
ComponentClass = Component,
207+
template = null,
208+
resolveableTemplate = null,
209+
}: {
210+
ComponentClass?: object | null;
211+
template?: string | null;
212+
resolveableTemplate?: string | null;
213+
}
199214
) {
200215
let { owner } = this;
201216

202217
if (ComponentClass) {
203218
// We cannot set templates multiple times on a class
204219
if (ComponentClass === Component) {
205-
// @ts-expect-error - class/instance types in TS are hard
206220
ComponentClass = class extends Component {};
207221
}
208222

0 commit comments

Comments
 (0)