@@ -53,6 +53,21 @@ class PackageCommandTestCase: CommandsBuildProviderTestCase {
53
53
)
54
54
}
55
55
56
+ private func assertExecuteCommandFails(
57
+ _ args: [ String ] = [ ] ,
58
+ packagePath: AbsolutePath ? = nil ,
59
+ expectedErrorContains expected: String ,
60
+ file: StaticString = #file,
61
+ line: UInt = #line
62
+ ) async throws {
63
+ do {
64
+ _ = try await execute ( args, packagePath: packagePath)
65
+ XCTFail ( " Expected command to fail " , file: file, line: line)
66
+ } catch let SwiftPMError . executionFailure( _, _, stderr) {
67
+ XCTAssertMatch ( stderr, . contains( expected) , file: file, line: line)
68
+ }
69
+ }
70
+
56
71
func testNoParameters( ) async throws {
57
72
let stdout = try await execute ( ) . stdout
58
73
XCTAssertMatch ( stdout, . contains( " USAGE: swift package " ) )
@@ -1235,6 +1250,143 @@ class PackageCommandTestCase: CommandsBuildProviderTestCase {
1235
1250
}
1236
1251
}
1237
1252
1253
+ func testPackageAddPluginDependencyExternalPackage( ) async throws {
1254
+ try await testWithTemporaryDirectory { tmpPath in
1255
+ let fs = localFileSystem
1256
+ let path = tmpPath. appending ( " PackageB " )
1257
+ try fs. createDirectory ( path)
1258
+
1259
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1260
+ """
1261
+ // swift-tools-version: 5.9
1262
+ import PackageDescription
1263
+ let package = Package(
1264
+ name: " client " ,
1265
+ targets: [ .target(name: " library " ) ]
1266
+ )
1267
+ """
1268
+ )
1269
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1270
+ """
1271
+ public func Foo() { }
1272
+ """
1273
+ )
1274
+
1275
+ _ = try await execute ( [ " add-target-plugin " , " --package " , " other-package " , " other-product " , " library " ] , packagePath: path)
1276
+
1277
+ let manifest = path. appending ( " Package.swift " )
1278
+ XCTAssertFileExists ( manifest)
1279
+ let contents : String = try fs. readFileContents ( manifest)
1280
+
1281
+ XCTAssertMatch ( contents, . contains( #".plugin(name: "other-product", package: "other-package"# ) )
1282
+ }
1283
+ }
1284
+
1285
+ func testPackageAddPluginDependencyFromExternalPackageToNonexistentTarget( ) async throws {
1286
+ try await testWithTemporaryDirectory { tmpPath in
1287
+ let fs = localFileSystem
1288
+ let path = tmpPath. appending ( " PackageB " )
1289
+ try fs. createDirectory ( path)
1290
+
1291
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1292
+ """
1293
+ // swift-tools-version: 5.9
1294
+ import PackageDescription
1295
+ let package = Package(
1296
+ name: " client " ,
1297
+ targets: [ .target(name: " library " ) ]
1298
+ )
1299
+ """
1300
+ )
1301
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1302
+ """
1303
+ public func Foo() { }
1304
+ """
1305
+ )
1306
+
1307
+ try await assertExecuteCommandFails (
1308
+ [ " add-target-plugin " , " --package " , " other-package " , " other-product " , " library-that-does-not-exist " ] ,
1309
+ packagePath: path,
1310
+ expectedErrorContains: " error: unable to find target named 'library-that-does-not-exist' in package "
1311
+ )
1312
+
1313
+ let manifest = path. appending ( " Package.swift " )
1314
+ XCTAssertFileExists ( manifest)
1315
+ let contents : String = try fs. readFileContents ( manifest)
1316
+
1317
+ XCTAssertNoMatch ( contents, . contains( #".plugin(name: "other-product", package: "other-package"# ) )
1318
+ }
1319
+ }
1320
+
1321
+
1322
+ func testPackageAddPluginDependencyInternalPackage( ) async throws {
1323
+ try await testWithTemporaryDirectory { tmpPath in
1324
+ let fs = localFileSystem
1325
+ let path = tmpPath. appending ( " PackageB " )
1326
+ try fs. createDirectory ( path)
1327
+
1328
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1329
+ """
1330
+ // swift-tools-version: 5.9
1331
+ import PackageDescription
1332
+ let package = Package(
1333
+ name: " client " ,
1334
+ targets: [ .target(name: " library " ) ]
1335
+ )
1336
+ """
1337
+ )
1338
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1339
+ """
1340
+ public func Foo() { }
1341
+ """
1342
+ )
1343
+
1344
+ _ = try await execute ( [ " add-target-plugin " , " other-product " , " library " ] , packagePath: path)
1345
+
1346
+ let manifest = path. appending ( " Package.swift " )
1347
+ XCTAssertFileExists ( manifest)
1348
+ let contents : String = try fs. readFileContents ( manifest)
1349
+
1350
+ XCTAssertMatch ( contents, . contains( #".plugin(name: "other-product"# ) )
1351
+ }
1352
+ }
1353
+
1354
+ func testPackageAddPluginDependencyFromInternalPackageToNonexistentTarget( ) async throws {
1355
+ try await testWithTemporaryDirectory { tmpPath in
1356
+ let fs = localFileSystem
1357
+ let path = tmpPath. appending ( " PackageB " )
1358
+ try fs. createDirectory ( path)
1359
+
1360
+ try fs. writeFileContents ( path. appending ( " Package.swift " ) , string:
1361
+ """
1362
+ // swift-tools-version: 5.9
1363
+ import PackageDescription
1364
+ let package = Package(
1365
+ name: " client " ,
1366
+ targets: [ .target(name: " library " ) ]
1367
+ )
1368
+ """
1369
+ )
1370
+ try localFileSystem. writeFileContents ( path. appending ( components: " Sources " , " library " , " library.swift " ) , string:
1371
+ """
1372
+ public func Foo() { }
1373
+ """
1374
+ )
1375
+
1376
+ try await assertExecuteCommandFails (
1377
+ [ " add-target-plugin " , " --package " , " other-package " , " other-product " , " library-that-does-not-exist " ] ,
1378
+ packagePath: path,
1379
+ expectedErrorContains: " error: unable to find target named 'library-that-does-not-exist' in package "
1380
+ )
1381
+
1382
+ let manifest = path. appending ( " Package.swift " )
1383
+ XCTAssertFileExists ( manifest)
1384
+ let contents : String = try fs. readFileContents ( manifest)
1385
+
1386
+ XCTAssertNoMatch ( contents, . contains( #".plugin(name: "other-product"# ) )
1387
+ }
1388
+ }
1389
+
1238
1390
func testPackageAddProduct( ) async throws {
1239
1391
try await testWithTemporaryDirectory { tmpPath in
1240
1392
let fs = localFileSystem
0 commit comments