1
+ describe ( 'native timer' , ( ) => {
2
+
3
+ /** @type {global.setTimeout } */
4
+ let setTimeout = global . __ns__setTimeout ;
5
+ /** @type {global.setInterval } */
6
+ let setInterval = global . __ns__setInterval ; /** @type global.setTimeout */
7
+ /** @type {global.clearTimeout } */
8
+ let clearTimeout = global . __ns__clearTimeout ;
9
+ /** @type {global.clearInterval } */
10
+ let clearInterval = global . __ns__clearInterval ;
11
+
12
+ it ( 'exists' , ( ) => {
13
+ expect ( setTimeout ) . toBeDefined ( ) ;
14
+ expect ( setInterval ) . toBeDefined ( ) ;
15
+ expect ( clearTimeout ) . toBeDefined ( ) ;
16
+ expect ( clearInterval ) . toBeDefined ( ) ;
17
+ } ) ;
18
+
19
+ it ( 'triggers timeout' , ( done ) => {
20
+ const now = Date . now ( ) ;
21
+ setTimeout ( ( ) => {
22
+ expect ( Date . now ( ) - now ) . not . toBeLessThan ( 100 ) ;
23
+ done ( ) ;
24
+ } , 100 ) ;
25
+ } ) ;
26
+
27
+ it ( 'triggers timeout' , ( done ) => {
28
+ const now = Date . now ( ) ;
29
+ setTimeout ( ( ) => {
30
+ expect ( Date . now ( ) - now ) . not . toBeLessThan ( 100 ) ;
31
+ done ( ) ;
32
+ } , 100 ) ;
33
+ } ) ;
34
+
35
+ it ( 'triggers interval' , ( done ) => {
36
+ let calls = 0 ;
37
+ const itv = setInterval ( ( ) => {
38
+ calls ++ ;
39
+ } , 100 ) ;
40
+ setTimeout ( ( ) => {
41
+ clearInterval ( itv ) ;
42
+ expect ( calls ) . toBe ( 10 ) ;
43
+ done ( ) ;
44
+ } , 1000 ) ;
45
+ } ) ;
46
+
47
+ it ( 'cancels timeout' , ( done ) => {
48
+ let triggered = false ;
49
+ const now = Date . now ( ) ;
50
+ const timeout = setTimeout ( ( ) => {
51
+ triggered = true ;
52
+ } , 100 ) ;
53
+ clearTimeout ( timeout ) ;
54
+ setTimeout ( ( ) => {
55
+ expect ( triggered ) . toBe ( false ) ;
56
+ done ( ) ;
57
+ } , 200 ) ;
58
+ } ) ;
59
+
60
+ it ( 'cancels interval' , ( done ) => {
61
+ let triggered = false ;
62
+ const now = Date . now ( ) ;
63
+ const timeout = setInterval ( ( ) => {
64
+ triggered = true ;
65
+ } , 100 ) ;
66
+ clearInterval ( timeout ) ;
67
+ setTimeout ( ( ) => {
68
+ expect ( triggered ) . toBe ( false ) ;
69
+ done ( ) ;
70
+ } , 200 ) ;
71
+ } ) ;
72
+
73
+ it ( 'cancels interval inside function' , ( done ) => {
74
+ let calls = 0 ;
75
+ const itv = setInterval ( ( ) => {
76
+ calls ++ ;
77
+ clearInterval ( itv ) ;
78
+ } , 10 ) ;
79
+ setTimeout ( ( ) => {
80
+ expect ( calls ) . toBe ( 1 ) ;
81
+ done ( ) ;
82
+ } , 100 ) ;
83
+ } ) ;
84
+
85
+ it ( 'preserves order' , ( done ) => {
86
+ let calls = 0 ;
87
+ setTimeout ( ( ) => {
88
+ expect ( calls ) . toBe ( 0 ) ;
89
+ calls ++ ;
90
+ } ) ;
91
+ setTimeout ( ( ) => {
92
+ expect ( calls ) . toBe ( 1 ) ;
93
+ calls ++ ;
94
+ done ( ) ;
95
+ } ) ;
96
+ } ) ;
97
+ it ( 'frees up resources after complete' , ( done ) => {
98
+ let timeout = 0 ;
99
+ let interval = 0 ;
100
+ let weakRef ;
101
+ {
102
+ let obj = {
103
+ value : 0
104
+ } ;
105
+ weakRef = new WeakRef ( obj ) ;
106
+ timeout = setTimeout ( ( ) => {
107
+ obj . value ++ ;
108
+ } , 100 ) ;
109
+ interval = setInterval ( ( ) => {
110
+ obj . value ++ ;
111
+ } , 50 ) ;
112
+ }
113
+ setTimeout ( ( ) => {
114
+ // use !! here because if you pass weakRef.get() it creates a strong reference (side effect of expect)
115
+ expect ( ! ! weakRef . get ( ) ) . toBe ( true ) ;
116
+ clearInterval ( interval ) ;
117
+ clearTimeout ( timeout ) ;
118
+ gc ( ) ;
119
+ expect ( ! ! weakRef . get ( ) ) . toBe ( false ) ;
120
+ done ( ) ;
121
+ } , 200 ) ;
122
+ } )
123
+ } ) ;
0 commit comments