@@ -30,41 +30,78 @@ describe('addStrategy', () => {
3030} )
3131
3232describe ( 'lazyDefine' , ( ) => {
33- it ( 'scans the whole document on first call' , async ( ) => {
34- const onDefine = spy ( )
35- lazyDefine ( 'scan-document-test' , onDefine )
36- await fixture ( html `< scan-document-test > </ scan-document-test > ` )
33+ describe ( 'ready strategy' , ( ) => {
34+ it ( 'calls define for a lazy component' , async ( ) => {
35+ const onDefine = spy ( )
36+ lazyDefine ( 'scan-document-test' , onDefine )
37+ await fixture ( html `< scan-document-test > </ scan-document-test > ` )
3738
38- await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
39+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
3940
40- expect ( onDefine ) . to . be . callCount ( 1 )
41+ expect ( onDefine ) . to . be . callCount ( 1 )
42+ } )
43+
44+ it ( 'initializes dynamic elements that are defined after the document is ready' , async ( ) => {
45+ const onDefine = spy ( )
46+ await fixture ( html `< later-defined-element-test > </ later-defined-element-test > ` )
47+ lazyDefine ( 'later-defined-element-test' , onDefine )
48+
49+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
50+
51+ expect ( onDefine ) . to . be . callCount ( 1 )
52+ } )
53+
54+ it ( "doesn't call the same callback twice" , async ( ) => {
55+ const onDefine = spy ( )
56+ lazyDefine ( 'twice-defined-element' , onDefine )
57+ lazyDefine ( 'once-defined-element' , onDefine )
58+ lazyDefine ( 'twice-defined-element' , onDefine )
59+ await fixture ( html `
60+ < once-defined-element > </ once-defined-element >
61+ < once-defined-element > </ once-defined-element >
62+ < once-defined-element > </ once-defined-element >
63+ < twice-defined-element > </ twice-defined-element >
64+ < twice-defined-element > </ twice-defined-element >
65+ < twice-defined-element > </ twice-defined-element >
66+ < twice-defined-element > </ twice-defined-element >
67+ ` )
68+
69+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
70+
71+ expect ( onDefine ) . to . be . callCount ( 2 )
72+ } )
4173 } )
42- it ( 'initializes dynamic elements that are defined after the document is ready' , async ( ) => {
43- const onDefine = spy ( )
44- await fixture ( html `< later-defined-element-test > </ later-defined-element-test > ` )
45- lazyDefine ( 'later-defined-element-test' , onDefine )
4674
47- await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
75+ describe ( 'firstInteraction strategy' , ( ) => {
76+ it ( 'calls define for a lazy component' , async ( ) => {
77+ const onDefine = spy ( )
78+ lazyDefine ( 'scan-document-test' , onDefine )
79+ await fixture ( html `< scan-document-test data-load-on ="firstInteraction "> </ scan-document-test > ` )
4880
49- expect ( onDefine ) . to . be . callCount ( 1 )
81+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
82+ expect ( onDefine ) . to . be . callCount ( 0 )
83+
84+ document . dispatchEvent ( new Event ( 'mousedown' ) )
85+
86+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
87+ expect ( onDefine ) . to . be . callCount ( 1 )
88+ } )
5089 } )
51- it ( "doesn't call the same callback twice" , async ( ) => {
52- const onDefine = spy ( )
53- lazyDefine ( 'twice-defined-element' , onDefine )
54- lazyDefine ( 'once-defined-element' , onDefine )
55- lazyDefine ( 'twice-defined-element' , onDefine )
56- await fixture ( html `
57- < once-defined-element > </ once-defined-element >
58- < once-defined-element > </ once-defined-element >
59- < once-defined-element > </ once-defined-element >
60- < twice-defined-element > </ twice-defined-element >
61- < twice-defined-element > </ twice-defined-element >
62- < twice-defined-element > </ twice-defined-element >
63- < twice-defined-element > </ twice-defined-element >
64- ` )
65-
66- await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
67-
68- expect ( onDefine ) . to . be . callCount ( 2 )
90+ describe ( 'visible strategy' , ( ) => {
91+ it ( 'calls define for a lazy component' , async ( ) => {
92+ const onDefine = spy ( )
93+ lazyDefine ( 'scan-document-test' , onDefine )
94+ await fixture (
95+ html `< div style ="height: calc(100vh + 256px) "> </ div >
96+ < scan-document-test data-load-on ="visible "> </ scan-document-test > `
97+ )
98+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
99+ expect ( onDefine ) . to . be . callCount ( 0 )
100+
101+ document . documentElement . scrollTo ( { top : 10 } )
102+
103+ await new Promise < unknown > ( resolve => requestAnimationFrame ( resolve ) )
104+ expect ( onDefine ) . to . be . callCount ( 1 )
105+ } )
69106 } )
70107} )
0 commit comments