Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion packages/internal-test-helpers/lib/test-cases/rendering.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Renderer } from '@ember/-internals/glimmer';
import { _resetRenderers, helper, Helper } from '@ember/-internals/glimmer';
import { isClassicDecorator, tracked } from '@ember/-internals/metal';
import { EventDispatcher } from '@ember/-internals/views';
import Component from '@ember/component';
import type { EmberPrecompileOptions } from 'ember-template-compiler';
Expand All @@ -17,6 +18,28 @@ import AbstractTestCase from './abstract';

const TextNode = window.Text;

/**
* Test state reaches templates through the top-level component, and tests
* update it with `set(this.context, ...)`. That only drives a rerender
* because non-tracked reads currently entangle a per-property tag, which
* is a legacy read path on its way out (and which the async scheduler's
* end state removes). Declaring the properties tracked makes the same
* `set` calls reactive under modern semantics, so the suite stops
* depending on the legacy path.
*
* Values that are already decorators (computed properties, injections)
* define their own reactivity and are passed through untouched.
*/
function trackedContext(context: object): Record<string, unknown> {
let attrs: Record<string, unknown> = {};

for (let [key, value] of Object.entries(context)) {
attrs[key] = isClassicDecorator(value) ? value : tracked({ value });
}

return attrs;
}

export default abstract class RenderingTestCase extends AbstractTestCase {
owner: EngineInstance;
renderer: Renderer;
Expand Down Expand Up @@ -106,7 +129,7 @@ export default abstract class RenderingTestCase extends AbstractTestCase {
})
);

let attrs = Object.assign({}, context, {
let attrs = Object.assign(trackedContext(context), {
tagName: '',
layoutName: '-top-level',
});
Expand Down
Loading