@@ -3,14 +3,15 @@ import { expect, test } from '@jest/globals'
3
3
import forEach from './forEach.mjs'
4
4
import Deferred from './Deferred.mjs'
5
5
import { range } from 'itertools'
6
+ import delay from './delay.mjs'
6
7
7
8
test ( 'forEach base' , async ( ) => {
8
9
const arr = [ ...range ( 6 ) ]
9
10
const called = { }
10
11
arr . forEach ( ( v ) => { called [ v ] = 0 } )
11
12
await forEach ( arr , async ( x ) => {
12
13
called [ x ] += 1
13
- } )
14
+ } , 2 )
14
15
expect ( called [ 0 ] ) . toBe ( 1 )
15
16
expect ( called [ 1 ] ) . toBe ( 1 )
16
17
expect ( called [ 2 ] ) . toBe ( 1 )
@@ -25,7 +26,7 @@ test('forEach no async', async () => {
25
26
arr . forEach ( ( v ) => { called [ v ] = 0 } )
26
27
await forEach ( arr , ( x ) => {
27
28
called [ x ] += 1
28
- } )
29
+ } , 2 )
29
30
expect ( called [ 0 ] ) . toBe ( 1 )
30
31
expect ( called [ 1 ] ) . toBe ( 1 )
31
32
expect ( called [ 2 ] ) . toBe ( 1 )
@@ -44,7 +45,72 @@ test('forEach concurrency', async () => {
44
45
called [ x ] += 1
45
46
ds [ x ] . resolve ( )
46
47
await d . promise
47
- } )
48
+ } , 2 )
49
+ await ds [ 1 ] . promise
50
+ expect ( called [ 0 ] ) . toBe ( 1 )
51
+ expect ( called [ 1 ] ) . toBe ( 1 )
52
+ expect ( called [ 2 ] ) . toBe ( 0 )
53
+ expect ( called [ 3 ] ) . toBe ( 0 )
54
+ expect ( called [ 4 ] ) . toBe ( 0 )
55
+ expect ( called [ 5 ] ) . toBe ( 0 )
56
+ await delay ( )
57
+ expect ( called [ 0 ] ) . toBe ( 1 )
58
+ expect ( called [ 1 ] ) . toBe ( 1 )
59
+ expect ( called [ 2 ] ) . toBe ( 0 )
60
+ expect ( called [ 3 ] ) . toBe ( 0 )
61
+ expect ( called [ 4 ] ) . toBe ( 0 )
62
+ expect ( called [ 5 ] ) . toBe ( 0 )
63
+ d . resolve ( )
64
+ await p
65
+ expect ( called [ 0 ] ) . toBe ( 1 )
66
+ expect ( called [ 1 ] ) . toBe ( 1 )
67
+ expect ( called [ 2 ] ) . toBe ( 1 )
68
+ expect ( called [ 3 ] ) . toBe ( 1 )
69
+ expect ( called [ 4 ] ) . toBe ( 1 )
70
+ expect ( called [ 5 ] ) . toBe ( 1 )
71
+ } )
72
+
73
+ test ( 'forEach infinite concurrency base' , async ( ) => {
74
+ const arr = [ ...range ( 6 ) ]
75
+ const called = { }
76
+ arr . forEach ( ( v ) => { called [ v ] = 0 } )
77
+ await forEach ( arr , async ( x ) => {
78
+ called [ x ] += 1
79
+ } , Number . POSITIVE_INFINITY )
80
+ expect ( called [ 0 ] ) . toBe ( 1 )
81
+ expect ( called [ 1 ] ) . toBe ( 1 )
82
+ expect ( called [ 2 ] ) . toBe ( 1 )
83
+ expect ( called [ 3 ] ) . toBe ( 1 )
84
+ expect ( called [ 4 ] ) . toBe ( 1 )
85
+ expect ( called [ 5 ] ) . toBe ( 1 )
86
+ } )
87
+
88
+ test ( 'forEach infinite concurrency no async' , async ( ) => {
89
+ const arr = [ ...range ( 6 ) ]
90
+ const called = { }
91
+ arr . forEach ( ( v ) => { called [ v ] = 0 } )
92
+ await forEach ( arr , ( x ) => {
93
+ called [ x ] += 1
94
+ } , Number . POSITIVE_INFINITY )
95
+ expect ( called [ 0 ] ) . toBe ( 1 )
96
+ expect ( called [ 1 ] ) . toBe ( 1 )
97
+ expect ( called [ 2 ] ) . toBe ( 1 )
98
+ expect ( called [ 3 ] ) . toBe ( 1 )
99
+ expect ( called [ 4 ] ) . toBe ( 1 )
100
+ expect ( called [ 5 ] ) . toBe ( 1 )
101
+ } )
102
+
103
+ test ( 'forEach infinite concurrency concurrency' , async ( ) => {
104
+ const arr = [ ...range ( 6 ) ]
105
+ const called = { }
106
+ arr . forEach ( ( v ) => { called [ v ] = 0 } )
107
+ const d = new Deferred ( )
108
+ const ds = arr . map ( ( ) => new Deferred ( ) )
109
+ const p = forEach ( arr , async ( x ) => {
110
+ called [ x ] += 1
111
+ ds [ x ] . resolve ( )
112
+ await d . promise
113
+ } , Number . POSITIVE_INFINITY )
48
114
await ds [ 5 ] . promise
49
115
expect ( called [ 0 ] ) . toBe ( 1 )
50
116
expect ( called [ 1 ] ) . toBe ( 1 )
@@ -61,3 +127,61 @@ test('forEach concurrency', async () => {
61
127
expect ( called [ 4 ] ) . toBe ( 1 )
62
128
expect ( called [ 5 ] ) . toBe ( 1 )
63
129
} )
130
+
131
+ test ( 'forEach concurrency 1 base' , async ( ) => {
132
+ const arr = [ ...range ( 6 ) ]
133
+ const called = { }
134
+ arr . forEach ( ( v ) => { called [ v ] = 0 } )
135
+ await forEach ( arr , async ( x ) => {
136
+ called [ x ] += 1
137
+ } )
138
+ expect ( called [ 0 ] ) . toBe ( 1 )
139
+ expect ( called [ 1 ] ) . toBe ( 1 )
140
+ expect ( called [ 2 ] ) . toBe ( 1 )
141
+ expect ( called [ 3 ] ) . toBe ( 1 )
142
+ expect ( called [ 4 ] ) . toBe ( 1 )
143
+ expect ( called [ 5 ] ) . toBe ( 1 )
144
+ } )
145
+
146
+ test ( 'forEach concurrency 1 no async' , async ( ) => {
147
+ const arr = [ ...range ( 6 ) ]
148
+ const called = { }
149
+ arr . forEach ( ( v ) => { called [ v ] = 0 } )
150
+ await forEach ( arr , ( x ) => {
151
+ called [ x ] += 1
152
+ } )
153
+ expect ( called [ 0 ] ) . toBe ( 1 )
154
+ expect ( called [ 1 ] ) . toBe ( 1 )
155
+ expect ( called [ 2 ] ) . toBe ( 1 )
156
+ expect ( called [ 3 ] ) . toBe ( 1 )
157
+ expect ( called [ 4 ] ) . toBe ( 1 )
158
+ expect ( called [ 5 ] ) . toBe ( 1 )
159
+ } )
160
+
161
+ test ( 'forEach concurrency 1 concurrency' , async ( ) => {
162
+ const arr = [ ...range ( 6 ) ]
163
+ const called = { }
164
+ arr . forEach ( ( v ) => { called [ v ] = 0 } )
165
+ const d = new Deferred ( )
166
+ const ds = arr . map ( ( ) => new Deferred ( ) )
167
+ const p = forEach ( arr , async ( x ) => {
168
+ called [ x ] += 1
169
+ ds [ x ] . resolve ( )
170
+ await d . promise
171
+ } )
172
+ await ds [ 0 ] . promise
173
+ expect ( called [ 0 ] ) . toBe ( 1 )
174
+ expect ( called [ 1 ] ) . toBe ( 0 )
175
+ expect ( called [ 2 ] ) . toBe ( 0 )
176
+ expect ( called [ 3 ] ) . toBe ( 0 )
177
+ expect ( called [ 4 ] ) . toBe ( 0 )
178
+ expect ( called [ 5 ] ) . toBe ( 0 )
179
+ d . resolve ( )
180
+ await p
181
+ expect ( called [ 0 ] ) . toBe ( 1 )
182
+ expect ( called [ 1 ] ) . toBe ( 1 )
183
+ expect ( called [ 2 ] ) . toBe ( 1 )
184
+ expect ( called [ 3 ] ) . toBe ( 1 )
185
+ expect ( called [ 4 ] ) . toBe ( 1 )
186
+ expect ( called [ 5 ] ) . toBe ( 1 )
187
+ } )
0 commit comments