@@ -342,6 +342,38 @@ final class BuildSystemManagerTests: XCTestCase {
342
342
343
343
wait ( for: [ changedB] , timeout: 10 , enforceOrder: false )
344
344
}
345
+
346
+ func testDependenciesUpdated( ) {
347
+ let a = DocumentURI ( string: " bsm:a.swift " )
348
+ let mainFiles = ManualMainFilesProvider ( )
349
+ mainFiles. mainFiles = [ a: Set ( [ a] ) ]
350
+
351
+ class DepUpdateDuringRegistrationBS : ManualBuildSystem {
352
+ override func registerForChangeNotifications( for uri: DocumentURI , language: Language ) {
353
+ delegate? . filesDependenciesUpdated ( [ uri] )
354
+ }
355
+ }
356
+
357
+ let bs = DepUpdateDuringRegistrationBS ( )
358
+ let bsm = BuildSystemManager ( buildSystem: bs, mainFilesProvider: mainFiles)
359
+ let del = BSMDelegate ( bsm)
360
+
361
+ bs. map [ a] = FileBuildSettings ( compilerArguments: [ " x " ] , language: . swift)
362
+ let initial = expectation ( description: " initial settings " )
363
+ del. expected = [ ( a, bs. map [ a] !, initial, #file, #line) ]
364
+
365
+ let depUpdate1 = expectation ( description: " dependencies update during registration " )
366
+ del. expectedDependenciesUpdate = [ ( a, depUpdate1, #file, #line) ]
367
+
368
+ bsm. registerForChangeNotifications ( for: a, language: . swift)
369
+ wait ( for: [ initial, depUpdate1] , timeout: 10 , enforceOrder: false )
370
+
371
+ let depUpdate2 = expectation ( description: " dependencies update 2 " )
372
+ del. expectedDependenciesUpdate = [ ( a, depUpdate2, #file, #line) ]
373
+
374
+ bsm. filesDependenciesUpdated ( [ a] )
375
+ wait ( for: [ depUpdate2] , timeout: 10 , enforceOrder: false )
376
+ }
345
377
}
346
378
347
379
// MARK: Helper Classes for Testing
@@ -359,7 +391,7 @@ private final class ManualMainFilesProvider: MainFilesProvider {
359
391
}
360
392
361
393
/// A simple `BuildSystem` that wraps a dictionary, for testing.
362
- final class ManualBuildSystem : BuildSystem {
394
+ class ManualBuildSystem : BuildSystem {
363
395
var map : [ DocumentURI : FileBuildSettings ] = [ : ]
364
396
365
397
var delegate : BuildSystemDelegate ? = nil
@@ -397,6 +429,7 @@ private final class BSMDelegate: BuildSystemDelegate {
397
429
let queue : DispatchQueue = DispatchQueue ( label: " \( BSMDelegate . self) " )
398
430
unowned let bsm : BuildSystemManager
399
431
var expected : [ ( uri: DocumentURI , settings: FileBuildSettings ? , expectation: XCTestExpectation , file: StaticString , line: UInt ) ] = [ ]
432
+ var expectedDependenciesUpdate : [ ( uri: DocumentURI , expectation: XCTestExpectation , file: StaticString , line: UInt ) ] = [ ]
400
433
401
434
init ( _ bsm: BuildSystemManager ) {
402
435
self . bsm = bsm
@@ -420,5 +453,17 @@ private final class BSMDelegate: BuildSystemDelegate {
420
453
}
421
454
422
455
func buildTargetsChanged( _ changes: [ BuildTargetEvent ] ) { }
423
- func filesDependenciesUpdated( _ changedFiles: Set < DocumentURI > ) { }
456
+ func filesDependenciesUpdated( _ changedFiles: Set < DocumentURI > ) {
457
+ queue. sync {
458
+ for uri in changedFiles {
459
+ guard let expected = expectedDependenciesUpdate. first ( where: { $0. uri == uri } ) else {
460
+ XCTFail ( " unexpected filesDependenciesUpdated for \( uri) " )
461
+ continue
462
+ }
463
+
464
+ XCTAssertEqual ( uri, expected. uri, file: expected. file, line: expected. line)
465
+ expected. expectation. fulfill ( )
466
+ }
467
+ }
468
+ }
424
469
}
0 commit comments