@@ -123,7 +123,7 @@ describe("unittests:: sys:: symlinkWatching::", () => {
123
123
verifyEventAndFileNames ( `${ opType } :: link` , linkResult . actual , expectedLinkResult ) ;
124
124
}
125
125
deferred . resolve ( ) ;
126
- } , 4000 ) ;
126
+ } , 2000 ) ;
127
127
return deferred . promise ;
128
128
}
129
129
@@ -289,28 +289,20 @@ describe("unittests:: sys:: symlinkWatching::", () => {
289
289
initializeWatchDirectoryResult ( dirResult , linkResult ) ;
290
290
switch ( opType ) {
291
291
case "fileCreate" :
292
- sys . writeFile ( `${ dir } /file1.ts` , "export const x = 100;" ) ;
293
- break ;
294
292
case "linkFileCreate" :
295
- sys . writeFile ( ` ${ link } /file2.ts` , "export const x = 100;" ) ;
293
+ sys . writeFile ( fileName ( opType ) , "export const x = 100;" ) ;
296
294
break ;
297
295
case "fileChange" :
298
- sys . writeFile ( `${ dir } /file1.ts` , "export const x2 = 100;" ) ;
299
- break ;
300
296
case "linkFileChange" :
301
- sys . writeFile ( ` ${ link } /file2.ts` , "export const x2 = 100;" ) ;
297
+ sys . writeFile ( fileName ( opType ) , "export const x2 = 100;" ) ;
302
298
break ;
303
299
case "fileModifiedTimeChange" :
304
- sys . setModifiedTime ! ( `${ dir } /file1.ts` , new Date ( ) ) ;
305
- break ;
306
300
case "linkModifiedTimeChange" :
307
- sys . setModifiedTime ! ( ` ${ link } /file2.ts` , new Date ( ) ) ;
301
+ sys . setModifiedTime ! ( fileName ( opType ) , new Date ( ) ) ;
308
302
break ;
309
303
case "fileDelete" :
310
- sys . deleteFile ! ( `${ dir } /file1.ts` ) ;
311
- break ;
312
304
case "linkFileDelete" :
313
- sys . deleteFile ! ( ` ${ link } /file2.ts` ) ;
305
+ sys . deleteFile ! ( fileName ( opType ) ) ;
314
306
break ;
315
307
default :
316
308
ts . Debug . assertNever ( opType ) ;
@@ -324,6 +316,183 @@ describe("unittests:: sys:: symlinkWatching::", () => {
324
316
tableOfEvents [ opType ] ,
325
317
) ;
326
318
}
319
+
320
+ function fileName ( opType : string ) {
321
+ return ts . startsWith ( opType , "file" ) ?
322
+ `${ dir } /file1.ts` :
323
+ `${ link } /file2.ts` ;
324
+ }
325
+ } ) ;
326
+ }
327
+
328
+ interface RecursiveFsEventsForWatchDirectory extends FsEventsForWatchDirectory {
329
+ // For recursive the first time events are most of the time are not predictable, so just create random file for that reason
330
+ init ?: ExpectedEventAndFileName [ ] ;
331
+ linkSubFileCreate : readonly ExpectedEventAndFileName [ ] ;
332
+ parallelFileCreate : readonly ExpectedEventAndFileName [ ] ;
333
+ parallelLinkFileCreate : readonly ExpectedEventAndFileName [ ] ;
334
+ linkSubFileChange : readonly ExpectedEventAndFileName [ ] ;
335
+ parallelFileChange : readonly ExpectedEventAndFileName [ ] ;
336
+ parallelLinkFileChange : readonly ExpectedEventAndFileName [ ] ;
337
+ linkSubModifiedTimeChange : readonly ExpectedEventAndFileName [ ] ;
338
+ parallelFileModifiedTimeChange : readonly ExpectedEventAndFileName [ ] ;
339
+ parallelLinkModifiedTimeChange : readonly ExpectedEventAndFileName [ ] ;
340
+ linkedSubFileDelete : readonly ExpectedEventAndFileName [ ] ;
341
+ parallelFileDelete : readonly ExpectedEventAndFileName [ ] ;
342
+ parallelLinkFileDelete : readonly ExpectedEventAndFileName [ ] ;
343
+ }
344
+ function verifyRecursiveWatchDirectoryUsingFsEvents < System extends ts . System > (
345
+ sys : System ,
346
+ fsWatch : FsWatch < System > ,
347
+ dir : string ,
348
+ link : string ,
349
+ isMacOs : boolean ,
350
+ ) {
351
+ it ( `recursive watchDirectory using fsEvents` , async ( ) => {
352
+ console . log ( "recrusive watchDirectory using fsEvents" ) ;
353
+
354
+ const eventsForDir : Partial < RecursiveFsEventsForWatchDirectory > = isMacOs ?
355
+ {
356
+ fileCreate : [
357
+ { event : "rename" , fileName : "sub/folder/file1.ts" } ,
358
+ ] ,
359
+ linkFileCreate : [
360
+ { event : "rename" , fileName : "sub/folder/file2.ts" } ,
361
+ ] ,
362
+ } :
363
+ {
364
+ fileCreate : [
365
+ { event : "rename" , fileName : "sub/folder/file1.ts" } ,
366
+ { event : "change" , fileName : "sub/folder/file1.ts" } ,
367
+ { event : "change" , fileName : "sub/folder" } ,
368
+ ] ,
369
+ linkFileCreate : [
370
+ { event : "rename" , fileName : "sub/folder/file2.ts" } ,
371
+ { event : "change" , fileName : "sub/folder/file2.ts" } ,
372
+ { event : "change" , fileName : "sub/folder" } ,
373
+ ] ,
374
+ } ;
375
+
376
+ const eventsForLink : Partial < RecursiveFsEventsForWatchDirectory > = isMacOs ?
377
+ {
378
+ fileCreate : [
379
+ { event : "rename" , fileName : "sub/folder/file1.ts" } ,
380
+ ] ,
381
+ linkFileCreate : [
382
+ { event : "rename" , fileName : "sub/folder/file2.ts" } ,
383
+ ] ,
384
+ } :
385
+ {
386
+ fileCreate : [
387
+ { event : "rename" , fileName : "sub/folder/file1.ts" } ,
388
+ { event : "change" , fileName : "sub/folder/file1.ts" } ,
389
+ { event : "change" , fileName : "sub/folder" } ,
390
+ ] ,
391
+ linkFileCreate : [
392
+ { event : "rename" , fileName : "sub/folder/file2.ts" } ,
393
+ { event : "change" , fileName : "sub/folder/file2.ts" } ,
394
+ { event : "change" , fileName : "sub/folder" } ,
395
+ ] ,
396
+ } ;
397
+
398
+ const dirResult = recursiveWatchDirectory ( dir ) ;
399
+ const linkResult = recursiveWatchDirectory ( link ) ;
400
+
401
+ await operation ( "init" ) ;
402
+ await operation ( "fileCreate" ) ;
403
+ await operation ( "linkFileCreate" ) ;
404
+ await operation ( "linkSubFileCreate" ) ;
405
+ await operation ( "parallelFileCreate" ) ;
406
+ await operation ( "parallelLinkFileCreate" ) ;
407
+
408
+ await operation ( "fileChange" ) ;
409
+ await operation ( "linkFileChange" ) ;
410
+ await operation ( "linkSubFileChange" ) ;
411
+ await operation ( "parallelFileChange" ) ;
412
+ await operation ( "parallelLinkFileChange" ) ;
413
+
414
+ await operation ( "fileModifiedTimeChange" ) ;
415
+ await operation ( "linkModifiedTimeChange" ) ;
416
+ await operation ( "linkSubModifiedTimeChange" ) ;
417
+ await operation ( "parallelFileModifiedTimeChange" ) ;
418
+ await operation ( "parallelLinkModifiedTimeChange" ) ;
419
+
420
+ await operation ( "fileDelete" ) ;
421
+ await operation ( "linkFileDelete" ) ;
422
+ await operation ( "linkedSubFileDelete" ) ;
423
+ await operation ( "parallelFileDelete" ) ;
424
+ await operation ( "parallelLinkFileDelete" ) ;
425
+
426
+ dirResult . watcher . close ( ) ;
427
+ linkResult . watcher . close ( ) ;
428
+
429
+ function recursiveWatchDirectory ( dir : string ) {
430
+ return watchDirectory ( sys , fsWatch , dir , /*recursive*/ true ) ;
431
+ }
432
+
433
+ async function operation ( opType : keyof RecursiveFsEventsForWatchDirectory ) {
434
+ console . log ( "" ) ;
435
+ console . log ( opType ) ;
436
+ initializeWatchDirectoryResult ( dirResult , linkResult ) ;
437
+ switch ( opType ) {
438
+ case "init" :
439
+ sys . writeFile ( `${ dir } /sub/folder/init.ts` , "export const x = 100;" ) ;
440
+ sys . writeFile ( `${ dir } 2/sub/folder/init.ts` , "export const x = 100;" ) ;
441
+ break ;
442
+ case "fileCreate" :
443
+ case "linkFileCreate" :
444
+ case "linkSubFileCreate" :
445
+ case "parallelFileCreate" :
446
+ case "parallelLinkFileCreate" :
447
+ sys . writeFile ( fileName ( opType ) , "export const x = 100;" ) ;
448
+ break ;
449
+ case "fileChange" :
450
+ case "linkFileChange" :
451
+ case "linkSubFileChange" :
452
+ case "parallelFileChange" :
453
+ case "parallelLinkFileChange" :
454
+ sys . writeFile ( fileName ( opType ) , "export const x2 = 100;" ) ;
455
+ break ;
456
+ case "fileModifiedTimeChange" :
457
+ case "linkModifiedTimeChange" :
458
+ case "linkSubModifiedTimeChange" :
459
+ case "parallelFileModifiedTimeChange" :
460
+ case "parallelLinkModifiedTimeChange" :
461
+ sys . setModifiedTime ! ( fileName ( opType ) , new Date ( ) ) ;
462
+ break ;
463
+ case "fileDelete" :
464
+ case "linkFileDelete" :
465
+ case "linkedSubFileDelete" :
466
+ case "parallelFileDelete" :
467
+ case "parallelLinkFileDelete" :
468
+ sys . deleteFile ! ( fileName ( opType ) ) ;
469
+ break ;
470
+ default :
471
+ ts . Debug . assertNever ( opType ) ;
472
+ }
473
+
474
+ await verfiyWatchDirectoryResult (
475
+ opType ,
476
+ dirResult ,
477
+ eventsForDir [ opType ] ! ,
478
+ linkResult ,
479
+ eventsForLink [ opType ] ! ,
480
+ // opType === "init",
481
+ /*skipAsserts*/ true ,
482
+ ) ;
483
+ }
484
+
485
+ function fileName ( opType : string ) {
486
+ return ts . startsWith ( opType , "file" ) ?
487
+ `${ dir } /sub/folder/file1.ts` :
488
+ ts . startsWith ( opType , "linkSub" ) ?
489
+ `${ dir } /linkedsub/folder/file3.ts` :
490
+ ts . startsWith ( opType , "link" ) ?
491
+ `${ link } /sub/folder/file2.ts` :
492
+ ts . startsWith ( opType , "parallelFile" ) ?
493
+ `${ dir } 2/sub/folder/file4.ts` :
494
+ `${ dir } /linkedsub2/sub/folder/file5.ts` ;
495
+ }
327
496
} ) ;
328
497
}
329
498
@@ -345,6 +514,11 @@ describe("unittests:: sys:: symlinkWatching::", () => {
345
514
withSwallowException ( ( ) => fs . symlinkSync ( `${ root } /dirpolling` , `${ root } /linkeddirpolling` , "junction" ) ) ;
346
515
ts . sys . writeFile ( `${ root } /dirfsevents/file.ts` , "export const x = 10;" ) ;
347
516
withSwallowException ( ( ) => fs . symlinkSync ( `${ root } /dirfsevents` , `${ root } /linkeddirfsevents` , "junction" ) ) ;
517
+ ts . sys . writeFile ( `${ root } /recursivefsevents/sub/folder/file.ts` , "export const x = 10;" ) ;
518
+ ts . sys . writeFile ( `${ root } /recursivefsevents2/sub/folder/file.ts` , "export const x = 10;" ) ;
519
+ withSwallowException ( ( ) => fs . symlinkSync ( `${ root } /recursivefsevents` , `${ root } /recursivelinkedfsevents` , "junction" ) ) ;
520
+ withSwallowException ( ( ) => fs . symlinkSync ( `${ root } /recursivefsevents/sub` , `${ root } /recursivefsevents/linkedsub` , "junction" ) ) ;
521
+ withSwallowException ( ( ) => fs . symlinkSync ( `${ root } /recursivefsevents2` , `${ root } /recursivefsevents/linkedsub2` , "junction" ) ) ;
348
522
} ) ;
349
523
after ( ( ) => {
350
524
cleanup ( ) ;
@@ -393,6 +567,16 @@ describe("unittests:: sys:: symlinkWatching::", () => {
393
567
isMacOs ,
394
568
isWindows ,
395
569
) ;
570
+
571
+ if ( isMacOs || isWindows ) {
572
+ verifyRecursiveWatchDirectoryUsingFsEvents (
573
+ ts . sys ,
574
+ ( dir , recursive , cb ) => fs . watch ( dir , { persistent : true , recursive } , cb ) ,
575
+ `${ root } /recursivefsevents` ,
576
+ `${ root } /recursivelinkedfsevents` ,
577
+ isMacOs ,
578
+ ) ;
579
+ }
396
580
} ) ;
397
581
398
582
describe ( "with virtualFileSystem::" , ( ) => {
@@ -454,5 +638,21 @@ describe("unittests:: sys:: symlinkWatching::", () => {
454
638
// /*isMacOs*/ false,
455
639
// /*isWindows*/ false,
456
640
// );
641
+
642
+ // verifyRecursiveWatchDirectoryUsingFsEvents(
643
+ // getSys(),
644
+ // (dir, recursive, cb, sys) => sys.fsWatchWorker(dir, recursive, cb),
645
+ // `${root}/recursivefsevents`,
646
+ // `${root}/recursivelinkedfsevents`,
647
+ // /*isMacOs*/ false,
648
+ // );
649
+
650
+ // verifyRecursiveWatchDirectoryUsingFsEvents(
651
+ // getSys(),
652
+ // (dir, recursive, cb, sys) => sys.fsWatchWorker(dir, recursive, cb),
653
+ // `${root}/recursivefsevents`,
654
+ // `${root}/recursivelinkedfsevents`,
655
+ // /*isMacOs*/ true,
656
+ // );
457
657
} ) ;
458
658
} ) ;
0 commit comments