11import { describe , expect , test , vi } from 'vitest' ;
22import { makePromiseBuffer } from '../../../src/utils/promisebuffer' ;
3- import { SyncPromise } from '../../../src/utils/syncpromise' ;
3+ import { rejectedSyncPromise , resolvedSyncPromise } from '../../../src/utils/syncpromise' ;
44
55describe ( 'PromiseBuffer' , ( ) => {
66 describe ( 'add()' , ( ) => {
7- test ( 'no limit' , ( ) => {
8- const buffer = makePromiseBuffer ( ) ;
9- const p = vi . fn ( ( ) => new SyncPromise ( resolve => setTimeout ( resolve ) ) ) ;
10- void buffer . add ( p ) ;
11- expect ( buffer . $ . length ) . toEqual ( 1 ) ;
7+ test ( 'sync promises' , ( ) => {
8+ const buffer = makePromiseBuffer ( 1 ) ;
9+ let task1 ;
10+ const producer1 = vi . fn ( ( ) => {
11+ task1 = resolvedSyncPromise ( ) ;
12+ return task1 ;
13+ } ) ;
14+ const producer2 = vi . fn ( ( ) => resolvedSyncPromise ( ) ) ;
15+ expect ( buffer . add ( producer1 ) ) . toEqual ( task1 ) ;
16+ void expect ( buffer . add ( producer2 ) ) . rejects . toThrowError ( ) ;
17+ // This is immediately executed and removed again from the buffer
18+ expect ( buffer . $ . length ) . toEqual ( 0 ) ;
19+ expect ( producer1 ) . toHaveBeenCalled ( ) ;
20+ expect ( producer2 ) . toHaveBeenCalled ( ) ;
1221 } ) ;
1322
14- test ( 'with limit ' , ( ) => {
23+ test ( 'async promises ' , ( ) => {
1524 const buffer = makePromiseBuffer ( 1 ) ;
1625 let task1 ;
1726 const producer1 = vi . fn ( ( ) => {
18- task1 = new SyncPromise ( resolve => setTimeout ( resolve ) ) ;
27+ task1 = new Promise ( resolve => setTimeout ( resolve , 1 ) ) ;
1928 return task1 ;
2029 } ) ;
21- const producer2 = vi . fn ( ( ) => new SyncPromise ( resolve => setTimeout ( resolve ) ) ) ;
30+ const producer2 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ) ;
2231 expect ( buffer . add ( producer1 ) ) . toEqual ( task1 ) ;
2332 void expect ( buffer . add ( producer2 ) ) . rejects . toThrowError ( ) ;
2433 expect ( buffer . $ . length ) . toEqual ( 1 ) ;
@@ -28,25 +37,60 @@ describe('PromiseBuffer', () => {
2837 } ) ;
2938
3039 describe ( 'drain()' , ( ) => {
31- test ( 'without timeout' , async ( ) => {
40+ test ( 'drains all promises without timeout' , async ( ) => {
3241 const buffer = makePromiseBuffer ( ) ;
33- for ( let i = 0 ; i < 5 ; i ++ ) {
34- void buffer . add ( ( ) => new SyncPromise ( resolve => setTimeout ( resolve ) ) ) ;
35- }
42+
43+ const p1 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ) ;
44+ const p2 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ) ;
45+ const p3 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ) ;
46+ const p4 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ) ;
47+ const p5 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ) ;
48+
49+ [ p1 , p2 , p3 , p4 , p5 ] . forEach ( p => {
50+ void buffer . add ( p ) ;
51+ } ) ;
52+
3653 expect ( buffer . $ . length ) . toEqual ( 5 ) ;
3754 const result = await buffer . drain ( ) ;
3855 expect ( result ) . toEqual ( true ) ;
3956 expect ( buffer . $ . length ) . toEqual ( 0 ) ;
57+
58+ expect ( p1 ) . toHaveBeenCalled ( ) ;
59+ expect ( p2 ) . toHaveBeenCalled ( ) ;
60+ expect ( p3 ) . toHaveBeenCalled ( ) ;
61+ expect ( p4 ) . toHaveBeenCalled ( ) ;
62+ expect ( p5 ) . toHaveBeenCalled ( ) ;
4063 } ) ;
4164
42- test ( 'with timeout' , async ( ) => {
65+ test ( 'drains all promises with timeout xxx ' , async ( ) => {
4366 const buffer = makePromiseBuffer ( ) ;
44- for ( let i = 0 ; i < 5 ; i ++ ) {
45- void buffer . add ( ( ) => new SyncPromise ( resolve => setTimeout ( resolve , 100 ) ) ) ;
46- }
67+
68+ const p1 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 2 ) ) ) ;
69+ const p2 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 4 ) ) ) ;
70+ const p3 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 6 ) ) ) ;
71+ const p4 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 8 ) ) ) ;
72+ const p5 = vi . fn ( ( ) => new Promise ( resolve => setTimeout ( resolve , 10 ) ) ) ;
73+
74+ [ p1 , p2 , p3 , p4 , p5 ] . forEach ( p => {
75+ void buffer . add ( p ) ;
76+ } ) ;
77+
78+ expect ( p1 ) . toHaveBeenCalled ( ) ;
79+ expect ( p2 ) . toHaveBeenCalled ( ) ;
80+ expect ( p3 ) . toHaveBeenCalled ( ) ;
81+ expect ( p4 ) . toHaveBeenCalled ( ) ;
82+ expect ( p5 ) . toHaveBeenCalled ( ) ;
83+
4784 expect ( buffer . $ . length ) . toEqual ( 5 ) ;
48- const result = await buffer . drain ( 50 ) ;
85+ const result = await buffer . drain ( 8 ) ;
4986 expect ( result ) . toEqual ( false ) ;
87+ // p5 is still in the buffer
88+ expect ( buffer . $ . length ) . toEqual ( 1 ) ;
89+
90+ // Now drain final item
91+ const result2 = await buffer . drain ( ) ;
92+ expect ( result2 ) . toEqual ( true ) ;
93+ expect ( buffer . $ . length ) . toEqual ( 0 ) ;
5094 } ) ;
5195
5296 test ( 'on empty buffer' , async ( ) => {
@@ -60,7 +104,7 @@ describe('PromiseBuffer', () => {
60104
61105 test ( 'resolved promises should not show up in buffer length' , async ( ) => {
62106 const buffer = makePromiseBuffer ( ) ;
63- const producer = ( ) => new SyncPromise ( resolve => setTimeout ( resolve ) ) ;
107+ const producer = ( ) => new Promise ( resolve => setTimeout ( resolve , 1 ) ) ;
64108 const task = buffer . add ( producer ) ;
65109 expect ( buffer . $ . length ) . toEqual ( 1 ) ;
66110 await task ;
@@ -69,20 +113,18 @@ describe('PromiseBuffer', () => {
69113
70114 test ( 'rejected promises should not show up in buffer length' , async ( ) => {
71115 const buffer = makePromiseBuffer ( ) ;
72- const producer = ( ) => new SyncPromise ( ( _ , reject ) => setTimeout ( reject ) ) ;
116+ const error = new Error ( 'whoops' ) ;
117+ const producer = ( ) => new Promise ( ( _ , reject ) => setTimeout ( ( ) => reject ( error ) , 1 ) ) ;
73118 const task = buffer . add ( producer ) ;
74119 expect ( buffer . $ . length ) . toEqual ( 1 ) ;
75- try {
76- await task ;
77- } catch {
78- // no-empty
79- }
120+
121+ await expect ( task ) . rejects . toThrow ( error ) ;
80122 expect ( buffer . $ . length ) . toEqual ( 0 ) ;
81123 } ) ;
82124
83125 test ( 'resolved task should give an access to the return value' , async ( ) => {
84126 const buffer = makePromiseBuffer < string > ( ) ;
85- const producer = ( ) => new SyncPromise < string > ( resolve => setTimeout ( ( ) => resolve ( 'test' ) ) ) ;
127+ const producer = ( ) => resolvedSyncPromise ( 'test' ) ;
86128 const task = buffer . add ( producer ) ;
87129 const result = await task ;
88130 expect ( result ) . toEqual ( 'test' ) ;
@@ -91,7 +133,7 @@ describe('PromiseBuffer', () => {
91133 test ( 'rejected task should give an access to the return value' , async ( ) => {
92134 expect . assertions ( 1 ) ;
93135 const buffer = makePromiseBuffer < string > ( ) ;
94- const producer = ( ) => new SyncPromise < string > ( ( _ , reject ) => setTimeout ( ( ) => reject ( new Error ( 'whoops' ) ) ) ) ;
136+ const producer = ( ) => rejectedSyncPromise ( new Error ( 'whoops' ) ) ;
95137 const task = buffer . add ( producer ) ;
96138 try {
97139 await task ;
0 commit comments