Skip to content

Commit 2c94075

Browse files
committed
test: add tests for SharedResizeObserver
1 parent 08afaa3 commit 2c94075

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed

src/material/form-field/BUILD.bazel

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ load(
22
"//tools:defaults.bzl",
33
"markdown_to_html",
44
"ng_module",
5+
"ng_test_library",
6+
"ng_web_test_suite",
57
"sass_binary",
68
"sass_library",
79
)
@@ -79,3 +81,21 @@ filegroup(
7981
name = "source-files",
8082
srcs = glob(["**/*.ts"]),
8183
)
84+
85+
ng_test_library(
86+
name = "form_field_tests_lib",
87+
srcs = glob(
88+
["**/*.spec.ts"],
89+
exclude = ["**/*.e2e.spec.ts"],
90+
),
91+
deps = [
92+
":form-field",
93+
],
94+
)
95+
96+
ng_web_test_suite(
97+
name = "unit_tests",
98+
deps = [
99+
":form_field_tests_lib",
100+
],
101+
)
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing';
2+
import {Component, ElementRef, inject, ViewChild} from '@angular/core';
3+
import {SharedResizeObserver} from './shared-resize-observer';
4+
5+
describe('SharedResizeObserver', () => {
6+
let fixture: ComponentFixture<TestComponent>;
7+
let instance: TestComponent;
8+
let resizeObserver: SharedResizeObserver;
9+
let el1: Element;
10+
let el2: Element;
11+
12+
async function waitForResize() {
13+
fixture.detectChanges();
14+
await new Promise(r => setTimeout(r, 16));
15+
}
16+
17+
beforeEach(() => {
18+
TestBed.configureTestingModule({
19+
declarations: [TestComponent],
20+
});
21+
fixture = TestBed.createComponent(TestComponent);
22+
fixture.detectChanges();
23+
instance = fixture.componentInstance;
24+
resizeObserver = instance.resizeObserver;
25+
el1 = instance.el1.nativeElement;
26+
el2 = instance.el2.nativeElement;
27+
});
28+
29+
it('should return the same observable for the same element and same box', () => {
30+
const observable1 = resizeObserver.observe(el1);
31+
const observable2 = resizeObserver.observe(el1);
32+
expect(observable1).toBe(observable2);
33+
});
34+
35+
it('should return different observables for different elements', () => {
36+
const observable1 = resizeObserver.observe(el1);
37+
const observable2 = resizeObserver.observe(el2);
38+
expect(observable1).not.toBe(observable2);
39+
});
40+
41+
it('should return different observables for different boxes', () => {
42+
const observable1 = resizeObserver.observe(el1, {box: 'content-box'});
43+
const observable2 = resizeObserver.observe(el1, {box: 'border-box'});
44+
expect(observable1).not.toBe(observable2);
45+
});
46+
47+
it('should return different observable after all subscriptions unsubscribed', () => {
48+
const observable1 = resizeObserver.observe(el1);
49+
const subscription1 = observable1.subscribe(() => {});
50+
const subscription2 = observable1.subscribe(() => {});
51+
subscription1.unsubscribe();
52+
const observable2 = resizeObserver.observe(el1);
53+
expect(observable1).toBe(observable2);
54+
subscription2.unsubscribe();
55+
const observable3 = resizeObserver.observe(el1);
56+
expect(observable1).not.toBe(observable3);
57+
});
58+
59+
it('should receive an initial size on subscription', waitForAsync(async () => {
60+
const observable = resizeObserver.observe(el1);
61+
const resizeSpy1 = jasmine.createSpy('resize handler 1');
62+
observable.subscribe(resizeSpy1);
63+
await waitForResize();
64+
expect(resizeSpy1).toHaveBeenCalled();
65+
const resizeSpy2 = jasmine.createSpy('resize handler 2');
66+
observable.subscribe(resizeSpy2);
67+
await waitForResize();
68+
expect(resizeSpy2).toHaveBeenCalled();
69+
}));
70+
71+
it('should receive events on resize', waitForAsync(async () => {
72+
const resizeSpy = jasmine.createSpy('resize handler');
73+
resizeObserver.observe(el1).subscribe(resizeSpy);
74+
await waitForResize();
75+
resizeSpy.calls.reset();
76+
instance.el1Width = 1;
77+
await waitForResize();
78+
expect(resizeSpy).toHaveBeenCalled();
79+
}));
80+
81+
it('should not receive events for other elements', waitForAsync(async () => {
82+
const resizeSpy1 = jasmine.createSpy('resize handler 1');
83+
const resizeSpy2 = jasmine.createSpy('resize handler 2');
84+
resizeObserver.observe(el1).subscribe(resizeSpy1);
85+
resizeObserver.observe(el2).subscribe(resizeSpy2);
86+
await waitForResize();
87+
resizeSpy1.calls.reset();
88+
resizeSpy2.calls.reset();
89+
instance.el1Width = 1;
90+
await waitForResize();
91+
expect(resizeSpy1).toHaveBeenCalled();
92+
expect(resizeSpy2).not.toHaveBeenCalled();
93+
}));
94+
});
95+
96+
@Component({
97+
template: `
98+
<div #el1 [style.height.px]="1" [style.width.px]="el1Width"></div>
99+
<div #el2 [style.height.px]="1" [style.width.px]="el2Width"></div>
100+
`,
101+
})
102+
export class TestComponent {
103+
@ViewChild('el1') el1: ElementRef<Element>;
104+
@ViewChild('el2') el2: ElementRef<Element>;
105+
resizeObserver = inject(SharedResizeObserver);
106+
el1Width = 0;
107+
el2Width = 0;
108+
}

0 commit comments

Comments
 (0)