Skip to content

Commit f5b055b

Browse files
perf(component): reset state / trigger CD only if necessary (#3328)
1 parent 888eb56 commit f5b055b

19 files changed

+1058
-466
lines changed

modules/component/spec/core/cd-aware/cd-aware_creator.spec.ts

Lines changed: 0 additions & 168 deletions
This file was deleted.

modules/component/spec/core/cd-aware/render_creator.spec.ts

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { of } from 'rxjs';
2+
import { TestScheduler } from 'rxjs/testing';
3+
import { fromPotentialObservable } from '../../src/core/potential-observable';
4+
5+
describe('fromPotentialObservable', () => {
6+
function setup() {
7+
return {
8+
testScheduler: new TestScheduler((actual, expected) =>
9+
expect(actual).toEqual(expected)
10+
),
11+
};
12+
}
13+
14+
function testNullishInput(input: null | undefined): void {
15+
it(`should create observable from ${input}`, () => {
16+
const { testScheduler } = setup();
17+
18+
testScheduler.run(({ expectObservable }) => {
19+
const obs$ = fromPotentialObservable(input);
20+
expectObservable(obs$).toBe('(x|)', { x: input });
21+
});
22+
});
23+
}
24+
25+
testNullishInput(null);
26+
27+
testNullishInput(undefined);
28+
29+
it('should create observable from array', () => {
30+
const { testScheduler } = setup();
31+
const array = [1, 2, 3];
32+
33+
testScheduler.run(({ expectObservable }) => {
34+
const obs$ = fromPotentialObservable(array);
35+
expectObservable(obs$).toBe('(xyz|)', { x: 1, y: 2, z: 3 });
36+
});
37+
});
38+
39+
it('should create observable from promise', (done) => {
40+
const promise = Promise.resolve(100);
41+
const obs$ = fromPotentialObservable(promise);
42+
43+
// promises cannot be tested with test scheduler
44+
obs$.subscribe((value) => {
45+
expect(value).toBe(100);
46+
done();
47+
});
48+
});
49+
50+
it('should return passed observable', () => {
51+
const obs1$ = of('ngrx');
52+
const obs2$ = fromPotentialObservable(obs1$);
53+
expect(obs1$).toBe(obs2$);
54+
});
55+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { combineRenderEventHandlers } from '../../../src/core/render-event/handlers';
2+
import {
3+
CompleteRenderEvent,
4+
ErrorRenderEvent,
5+
NextRenderEvent,
6+
RenderEvent,
7+
ResetRenderEvent,
8+
} from '../../../src/core/render-event/models';
9+
10+
describe('combineRenderEventHandlers', () => {
11+
function testRenderEvent<T>(event: RenderEvent<T>): void {
12+
describe(`when ${event.type} is emitted`, () => {
13+
it(`should call ${event.type} handler`, () => {
14+
const mockHandler = jest.fn();
15+
const handleRenderEvent = combineRenderEventHandlers({
16+
[event.type]: mockHandler,
17+
});
18+
19+
handleRenderEvent(event);
20+
expect(mockHandler).toHaveBeenCalledWith(event);
21+
});
22+
23+
it(`should not throw error if ${event.type} handler is not defined`, () => {
24+
const handleRenderEvent = combineRenderEventHandlers({});
25+
expect(() => handleRenderEvent(event)).not.toThrowError();
26+
});
27+
});
28+
}
29+
30+
const resetEvent: ResetRenderEvent = {
31+
type: 'reset',
32+
reset: true,
33+
};
34+
testRenderEvent(resetEvent);
35+
36+
const nextEvent: NextRenderEvent<number> = {
37+
type: 'next',
38+
value: 1,
39+
reset: true,
40+
};
41+
testRenderEvent(nextEvent);
42+
43+
const errorEvent: ErrorRenderEvent = {
44+
type: 'error',
45+
error: 'ERROR!',
46+
reset: false,
47+
};
48+
testRenderEvent(errorEvent);
49+
50+
const completeEvent: CompleteRenderEvent = {
51+
type: 'complete',
52+
reset: false,
53+
};
54+
testRenderEvent(completeEvent);
55+
});

0 commit comments

Comments
 (0)