1+ /* eslint-disable @typescript-eslint/no-unused-expressions */ // chai's expect allows you to use dot-property assertions like `.is.empty`
2+ namespace ts {
3+ describe ( "unittests:: createPerformanceHooksShim" , ( ) => {
4+ it ( "has expected API" , ( ) => {
5+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( Date . now ) ;
6+ expect ( performance ) . to . be . an ( "object" ) ;
7+ expect ( performance . timeOrigin ) . to . be . a ( "number" ) ;
8+ expect ( performance . clearMarks ) . to . be . a ( "function" ) ;
9+ expect ( performance . mark ) . to . be . a ( "function" ) ;
10+ expect ( performance . measure ) . to . be . a ( "function" ) ;
11+ expect ( performance . now ) . to . be . a ( "function" ) ;
12+ expect ( PerformanceObserver ) . to . be . a ( "function" ) ;
13+ let list ! : PerformanceObserverEntryList ;
14+ let observer2 ! : PerformanceObserver ;
15+ const observer = new PerformanceObserver ( ( _list , observer ) => { list = _list ; observer2 = observer ; } ) ;
16+ expect ( list ) . to . be . an ( "object" ) ;
17+ expect ( observer2 ) . to . be . an ( "object" ) ;
18+ expect ( observer2 ) . to . equal ( observer ) ;
19+ expect ( observer2 . disconnect ) . to . be . a ( "function" ) ;
20+ expect ( observer2 . observe ) . to . be . a ( "function" ) ;
21+ expect ( list . getEntries ) . to . be . a ( "function" ) ;
22+ expect ( list . getEntriesByName ) . to . be . a ( "function" ) ;
23+ expect ( list . getEntriesByType ) . to . be . a ( "function" ) ;
24+ } ) ;
25+ it ( "only listens for events while connected" , ( ) => {
26+ let timestamp = 0 ;
27+ const now = ( ) => timestamp ++ ;
28+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
29+ let list ! : PerformanceObserverEntryList ;
30+ const observer = new PerformanceObserver ( _list => list = _list ) ;
31+
32+ performance . mark ( "a" ) ;
33+ const entries1 = list . getEntries ( ) ;
34+ observer . observe ( { entryTypes : [ "mark" ] } ) ;
35+ performance . mark ( "b" ) ;
36+ const entries2 = list . getEntries ( ) ;
37+ observer . disconnect ( ) ;
38+ performance . mark ( "c" ) ;
39+ const entries3 = list . getEntries ( ) ;
40+
41+ expect ( entries1 ) . to . be . empty ;
42+ expect ( entries2 ) . to . not . be . empty ;
43+ expect ( entries3 ) . to . be . empty ;
44+ } ) ;
45+ it ( "Can get entries by name and type (mark)" , ( ) => {
46+ let timestamp = 0 ;
47+ const now = ( ) => timestamp ++ ;
48+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
49+ let list ! : PerformanceObserverEntryList ;
50+ const observer = new PerformanceObserver ( _list => list = _list ) ;
51+ observer . observe ( { entryTypes : [ "mark" , "measure" ] } ) ;
52+ performance . mark ( "a" ) ;
53+ performance . measure ( "b" , "a" ) ;
54+ const entries = list . getEntriesByName ( "a" , "mark" ) ;
55+ const entries2 = list . getEntriesByName ( "b" , "mark" ) ;
56+ observer . disconnect ( ) ;
57+ expect ( entries ) . to . have . lengthOf ( 1 ) ;
58+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
59+ expect ( entries [ 0 ] . name ) . to . equal ( "a" ) ;
60+ expect ( entries [ 0 ] . entryType ) . to . equal ( "mark" ) ;
61+ expect ( entries2 ) . to . be . empty ;
62+ } ) ;
63+ it ( "Can get entries by name and type (measure)" , ( ) => {
64+ let timestamp = 0 ;
65+ const now = ( ) => timestamp ++ ;
66+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
67+ let list ! : PerformanceObserverEntryList ;
68+ const observer = new PerformanceObserver ( _list => list = _list ) ;
69+ observer . observe ( { entryTypes : [ "mark" , "measure" ] } ) ;
70+ performance . mark ( "a" ) ;
71+ performance . measure ( "b" , "a" ) ;
72+ const entries = list . getEntriesByName ( "b" , "measure" ) ;
73+ const entries2 = list . getEntriesByName ( "a" , "measure" ) ;
74+ observer . disconnect ( ) ;
75+ expect ( entries ) . to . have . lengthOf ( 1 ) ;
76+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
77+ expect ( entries [ 0 ] . name ) . to . equal ( "b" ) ;
78+ expect ( entries [ 0 ] . entryType ) . to . equal ( "measure" ) ;
79+ expect ( entries2 ) . to . be . empty ;
80+ } ) ;
81+ it ( "Can get entries by name" , ( ) => {
82+ let timestamp = 0 ;
83+ const now = ( ) => timestamp ++ ;
84+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
85+ let list ! : PerformanceObserverEntryList ;
86+ const observer = new PerformanceObserver ( _list => list = _list ) ;
87+ observer . observe ( { entryTypes : [ "mark" , "measure" ] } ) ;
88+ performance . mark ( "a" ) ;
89+ performance . measure ( "b" , "a" ) ;
90+ const entries = list . getEntriesByName ( "a" ) ;
91+ const entries2 = list . getEntriesByName ( "b" ) ;
92+ observer . disconnect ( ) ;
93+ expect ( entries ) . to . not . be . empty ;
94+ expect ( entries ) . to . have . lengthOf ( 1 ) ;
95+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
96+ expect ( entries [ 0 ] . name ) . to . equal ( "a" ) ;
97+ expect ( entries [ 0 ] . entryType ) . to . equal ( "mark" ) ;
98+ expect ( entries2 ) . to . have . lengthOf ( 1 ) ;
99+ expect ( entries2 [ 0 ] ) . to . be . an ( "object" ) ;
100+ expect ( entries2 [ 0 ] . name ) . to . equal ( "b" ) ;
101+ expect ( entries2 [ 0 ] . entryType ) . to . equal ( "measure" ) ;
102+ } ) ;
103+ it ( "Can get entries by type" , ( ) => {
104+ let timestamp = 0 ;
105+ const now = ( ) => timestamp ++ ;
106+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
107+ let list ! : PerformanceObserverEntryList ;
108+ const observer = new PerformanceObserver ( _list => list = _list ) ;
109+ observer . observe ( { entryTypes : [ "mark" , "measure" ] } ) ;
110+ performance . mark ( "a" ) ;
111+ performance . measure ( "b" , "a" ) ;
112+ const entries = list . getEntriesByType ( "mark" ) ;
113+ const entries2 = list . getEntriesByType ( "measure" ) ;
114+ observer . disconnect ( ) ;
115+ expect ( entries ) . to . have . lengthOf ( 1 ) ;
116+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
117+ expect ( entries [ 0 ] . name ) . to . equal ( "a" ) ;
118+ expect ( entries [ 0 ] . entryType ) . to . equal ( "mark" ) ;
119+ expect ( entries2 ) . to . have . lengthOf ( 1 ) ;
120+ expect ( entries2 [ 0 ] ) . to . be . an ( "object" ) ;
121+ expect ( entries2 [ 0 ] . name ) . to . equal ( "b" ) ;
122+ expect ( entries2 [ 0 ] . entryType ) . to . equal ( "measure" ) ;
123+ } ) ;
124+ it ( "Can get entries" , ( ) => {
125+ let timestamp = 0 ;
126+ const now = ( ) => timestamp ++ ;
127+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
128+ let list ! : PerformanceObserverEntryList ;
129+ const observer = new PerformanceObserver ( _list => list = _list ) ;
130+ observer . observe ( { entryTypes : [ "mark" , "measure" ] } ) ;
131+ performance . mark ( "a" ) ;
132+ performance . measure ( "b" , "a" ) ;
133+ const entries = list . getEntries ( ) ;
134+ observer . disconnect ( ) ;
135+ expect ( entries ) . to . have . lengthOf ( 2 ) ;
136+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
137+ expect ( entries [ 0 ] . name ) . to . equal ( "a" ) ;
138+ expect ( entries [ 0 ] . entryType ) . to . equal ( "mark" ) ;
139+ expect ( entries [ 1 ] ) . to . be . an ( "object" ) ;
140+ expect ( entries [ 1 ] . name ) . to . equal ( "b" ) ;
141+ expect ( entries [ 1 ] . entryType ) . to . equal ( "measure" ) ;
142+ } ) ;
143+ it ( "Unobserved entries are ignored" , ( ) => {
144+ let timestamp = 0 ;
145+ const now = ( ) => timestamp ++ ;
146+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
147+ let list ! : PerformanceObserverEntryList ;
148+ const observer = new PerformanceObserver ( _list => list = _list ) ;
149+ observer . observe ( { entryTypes : [ "mark" ] } ) ;
150+ performance . mark ( "a" ) ;
151+ performance . measure ( "b" , "a" ) ;
152+ const entries = list . getEntries ( ) ;
153+ observer . disconnect ( ) ;
154+ expect ( entries ) . to . have . lengthOf ( 1 ) ;
155+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
156+ expect ( entries [ 0 ] . name ) . to . equal ( "a" ) ;
157+ expect ( entries [ 0 ] . entryType ) . to . equal ( "mark" ) ;
158+ } ) ;
159+ it ( "Changing what's observed only affects new entries" , ( ) => {
160+ let timestamp = 0 ;
161+ const now = ( ) => timestamp ++ ;
162+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
163+ let list ! : PerformanceObserverEntryList ;
164+ const observer = new PerformanceObserver ( _list => list = _list ) ;
165+ observer . observe ( { entryTypes : [ "mark" ] } ) ;
166+ performance . mark ( "a" ) ;
167+ performance . measure ( "b" , "a" ) ;
168+ observer . observe ( { entryTypes : [ "measure" ] } ) ;
169+ performance . mark ( "c" ) ;
170+ performance . measure ( "d" , "c" ) ;
171+ const entries = list . getEntries ( ) ;
172+ observer . disconnect ( ) ;
173+ expect ( entries ) . to . have . lengthOf ( 2 ) ;
174+ expect ( entries [ 0 ] ) . to . be . an ( "object" ) ;
175+ expect ( entries [ 0 ] . name ) . to . equal ( "a" ) ;
176+ expect ( entries [ 0 ] . entryType ) . to . equal ( "mark" ) ;
177+ expect ( entries [ 1 ] ) . to . be . an ( "object" ) ;
178+ expect ( entries [ 1 ] . name ) . to . equal ( "d" ) ;
179+ expect ( entries [ 1 ] . entryType ) . to . equal ( "measure" ) ;
180+ } ) ;
181+ it ( "mark tracks current time" , ( ) => {
182+ let timestamp = 0 ;
183+ const now = ( ) => timestamp ;
184+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
185+ let list ! : PerformanceObserverEntryList ;
186+ const observer = new PerformanceObserver ( _list => list = _list ) ;
187+ observer . observe ( { entryTypes : [ "mark" ] } ) ;
188+ const ts1 = timestamp ;
189+ performance . mark ( "a" ) ;
190+ timestamp ++ ;
191+ const ts2 = timestamp ;
192+ performance . mark ( "b" ) ;
193+ const entries = list . getEntries ( ) ;
194+ observer . disconnect ( ) ;
195+ expect ( entries [ 0 ] . startTime ) . to . equal ( ts1 ) ;
196+ expect ( entries [ 0 ] . duration ) . to . equal ( 0 ) ;
197+ expect ( entries [ 1 ] . startTime ) . to . equal ( ts2 ) ;
198+ expect ( entries [ 1 ] . duration ) . to . equal ( 0 ) ;
199+ } ) ;
200+ it ( "measure tracks time between marks" , ( ) => {
201+ let timestamp = 0 ;
202+ const now = ( ) => timestamp ;
203+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
204+ let list ! : PerformanceObserverEntryList ;
205+ const observer = new PerformanceObserver ( _list => list = _list ) ;
206+ observer . observe ( { entryTypes : [ "mark" , "measure" ] } ) ;
207+ const ts1 = timestamp ;
208+ performance . mark ( "a" ) ;
209+ timestamp ++ ;
210+ const ts2 = timestamp ;
211+ performance . mark ( "b" ) ;
212+ performance . measure ( "c" , "a" , "b" ) ;
213+ const entries = list . getEntriesByType ( "measure" ) ;
214+ observer . disconnect ( ) ;
215+ expect ( entries [ 0 ] . startTime ) . to . equal ( ts1 ) ;
216+ expect ( entries [ 0 ] . duration ) . to . equal ( ts2 - ts1 ) ;
217+ } ) ;
218+ it ( "measure tracks time between unobserved marks" , ( ) => {
219+ let timestamp = 0 ;
220+ const now = ( ) => timestamp ;
221+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
222+ let list ! : PerformanceObserverEntryList ;
223+ const observer = new PerformanceObserver ( _list => list = _list ) ;
224+ observer . observe ( { entryTypes : [ "measure" ] } ) ;
225+ const ts1 = timestamp ;
226+ performance . mark ( "a" ) ;
227+ timestamp ++ ;
228+ const ts2 = timestamp ;
229+ performance . mark ( "b" ) ;
230+ performance . measure ( "c" , "a" , "b" ) ;
231+ const entries = list . getEntries ( ) ;
232+ observer . disconnect ( ) ;
233+ expect ( entries [ 0 ] . startTime ) . to . equal ( ts1 ) ;
234+ expect ( entries [ 0 ] . duration ) . to . equal ( ts2 - ts1 ) ;
235+ } ) ;
236+ it ( "marks can be counted" , ( ) => {
237+ let timestamp = 0 ;
238+ const now = ( ) => timestamp ++ ;
239+ const { performance, PerformanceObserver } = ShimPerformance . createPerformanceHooksShim ( now ) ;
240+ let list ! : PerformanceObserverEntryList ;
241+ const observer = new PerformanceObserver ( _list => list = _list ) ;
242+ observer . observe ( { entryTypes : [ "mark" ] } ) ;
243+ performance . mark ( "a" ) ;
244+ performance . mark ( "a" ) ;
245+ performance . mark ( "a" ) ;
246+ const entries = list . getEntries ( ) ;
247+ observer . disconnect ( ) ;
248+ expect ( entries ) . to . have . lengthOf ( 3 ) ;
249+ } ) ;
250+ } ) ;
251+ }
0 commit comments