@@ -58,6 +58,21 @@ class PackageCommandTestCase: CommandsBuildProviderTestCase {
58
58
)
59
59
}
60
60
61
+ private func assertExecuteCommandFails(
62
+ _ args: [ String ] = [ ] ,
63
+ packagePath: AbsolutePath ? = nil ,
64
+ expectedErrorContains expected: String ,
65
+ file: StaticString = #file,
66
+ line: UInt = #line
67
+ ) async throws {
68
+ do {
69
+ _ = try await execute ( args, packagePath: packagePath)
70
+ XCTFail ( " Expected command to fail " , file: file, line: line)
71
+ } catch let SwiftPMError . executionFailure( _, _, stderr) {
72
+ XCTAssertMatch ( stderr, . contains( expected) , file: file, line: line)
73
+ }
74
+ }
75
+
61
76
func testNoParameters( ) async throws {
62
77
let stdout = try await execute ( ) . stdout
63
78
XCTAssertMatch ( stdout, . contains( " USAGE: swift package " ) )
@@ -1346,6 +1361,143 @@ class PackageCommandTestCase: CommandsBuildProviderTestCase {
1346
1361
}
1347
1362
}
1348
1363
1364
+ func testPackageAddPluginDependencyExternalPackage( ) async throws {
1365
+ try await testWithTemporaryDirectory { tmpPath in
1366
+ let fs = localFileSystem
1367
+ let path = tmpPath. appending ( " PackageB " )
1368
+ try fs. createDirectory ( path)
1369
+
1370
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1371
+ """
1372
+ // swift-tools-version: 5.9
1373
+ import PackageDescription
1374
+ let package = Package(
1375
+ name: " client " ,
1376
+ targets: [ .target(name: " library " ) ]
1377
+ )
1378
+ """
1379
+ )
1380
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1381
+ """
1382
+ public func Foo() { }
1383
+ """
1384
+ )
1385
+
1386
+ _ = try await execute ( [ " add-target-plugin " , " --package " , " other-package " , " other-product " , " library " ] , packagePath: path)
1387
+
1388
+ let manifest = path. appending ( " Package.swift " )
1389
+ XCTAssertFileExists ( manifest)
1390
+ let contents : String = try fs. readFileContents ( manifest)
1391
+
1392
+ XCTAssertMatch ( contents, . contains( #".plugin(name: "other-product", package: "other-package"# ) )
1393
+ }
1394
+ }
1395
+
1396
+ func testPackageAddPluginDependencyFromExternalPackageToNonexistentTarget( ) async throws {
1397
+ try await testWithTemporaryDirectory { tmpPath in
1398
+ let fs = localFileSystem
1399
+ let path = tmpPath. appending ( " PackageB " )
1400
+ try fs. createDirectory ( path)
1401
+
1402
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1403
+ """
1404
+ // swift-tools-version: 5.9
1405
+ import PackageDescription
1406
+ let package = Package(
1407
+ name: " client " ,
1408
+ targets: [ .target(name: " library " ) ]
1409
+ )
1410
+ """
1411
+ )
1412
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1413
+ """
1414
+ public func Foo() { }
1415
+ """
1416
+ )
1417
+
1418
+ try await assertExecuteCommandFails (
1419
+ [ " add-target-plugin " , " --package " , " other-package " , " other-product " , " library-that-does-not-exist " ] ,
1420
+ packagePath: path,
1421
+ expectedErrorContains: " error: unable to find target named 'library-that-does-not-exist' in package "
1422
+ )
1423
+
1424
+ let manifest = path. appending ( " Package.swift " )
1425
+ XCTAssertFileExists ( manifest)
1426
+ let contents : String = try fs. readFileContents ( manifest)
1427
+
1428
+ XCTAssertNoMatch ( contents, . contains( #".plugin(name: "other-product", package: "other-package"# ) )
1429
+ }
1430
+ }
1431
+
1432
+
1433
+ func testPackageAddPluginDependencyInternalPackage( ) async throws {
1434
+ try await testWithTemporaryDirectory { tmpPath in
1435
+ let fs = localFileSystem
1436
+ let path = tmpPath. appending ( " PackageB " )
1437
+ try fs. createDirectory ( path)
1438
+
1439
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1440
+ """
1441
+ // swift-tools-version: 5.9
1442
+ import PackageDescription
1443
+ let package = Package(
1444
+ name: " client " ,
1445
+ targets: [ .target(name: " library " ) ]
1446
+ )
1447
+ """
1448
+ )
1449
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1450
+ """
1451
+ public func Foo() { }
1452
+ """
1453
+ )
1454
+
1455
+ _ = try await execute ( [ " add-target-plugin " , " other-product " , " library " ] , packagePath: path)
1456
+
1457
+ let manifest = path. appending ( " Package.swift " )
1458
+ XCTAssertFileExists ( manifest)
1459
+ let contents : String = try fs. readFileContents ( manifest)
1460
+
1461
+ XCTAssertMatch ( contents, . contains( #".plugin(name: "other-product"# ) )
1462
+ }
1463
+ }
1464
+
1465
+ func testPackageAddPluginDependencyFromInternalPackageToNonexistentTarget( ) async throws {
1466
+ try await testWithTemporaryDirectory { tmpPath in
1467
+ let fs = localFileSystem
1468
+ let path = tmpPath. appending ( " PackageB " )
1469
+ try fs. createDirectory ( path)
1470
+
1471
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1472
+ """
1473
+ // swift-tools-version: 5.9
1474
+ import PackageDescription
1475
+ let package = Package(
1476
+ name: " client " ,
1477
+ targets: [ .target(name: " library " ) ]
1478
+ )
1479
+ """
1480
+ )
1481
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1482
+ """
1483
+ public func Foo() { }
1484
+ """
1485
+ )
1486
+
1487
+ try await assertExecuteCommandFails (
1488
+ [ " add-target-plugin " , " --package " , " other-package " , " other-product " , " library-that-does-not-exist " ] ,
1489
+ packagePath: path,
1490
+ expectedErrorContains: " error: unable to find target named 'library-that-does-not-exist' in package "
1491
+ )
1492
+
1493
+ let manifest = path. appending ( " Package.swift " )
1494
+ XCTAssertFileExists ( manifest)
1495
+ let contents : String = try fs. readFileContents ( manifest)
1496
+
1497
+ XCTAssertNoMatch ( contents, . contains( #".plugin(name: "other-product"# ) )
1498
+ }
1499
+ }
1500
+
1349
1501
func testPackageAddProduct( ) async throws {
1350
1502
try await testWithTemporaryDirectory { tmpPath in
1351
1503
let fs = localFileSystem
0 commit comments