@@ -3282,6 +3282,158 @@ final class PubGrubBacktrackTests: XCTestCase {
3282
3282
. contains ( where: { $0. message == " [DependencyResolver] resolved 'd' @ '2.3.0' " } )
3283
3283
)
3284
3284
}
3285
+
3286
+ func testPrereleaseVersionSelection( ) throws {
3287
+ try builder. serve ( " a " , at: " 1.0.0 " , with: [
3288
+ " a " : [
3289
+ " b " : ( . versionSet( . range( " 0.0.8 " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) )
3290
+ ]
3291
+ ] )
3292
+
3293
+ try builder. serve ( " b " , at: " 1.0.0-prerelease-20240710 " )
3294
+
3295
+ try builder. serve ( " c " , at: " 1.0.0 " , with: [
3296
+ " c " : [
3297
+ " d " : ( . versionSet( . range( " 1.0.5 " ..< " 2.0.0 " ) ) , . specific( [ " d " ] ) )
3298
+ ]
3299
+ ] )
3300
+ try builder. serve ( " c " , at: " 1.0.1 " )
3301
+
3302
+ try builder. serve ( " d " , at: " 1.0.0-prerelease-20240710 " )
3303
+ try builder. serve ( " d " , at: " 1.0.6-prerelease-1 " )
3304
+ try builder. serve ( " d " , at: " 1.0.6 " )
3305
+
3306
+ let resolver = builder. create ( )
3307
+ // The order matters here because solver used to assign `b` before `a`.
3308
+ let dependencies1 = try builder. create ( dependencies: [
3309
+ " a " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " a " ] ) ) ,
3310
+ " b " : ( . versionSet( . range( " 1.0.0-latest " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) )
3311
+ ] )
3312
+
3313
+ AssertResult ( resolver. solve ( constraints: dependencies1) , [
3314
+ ( " a " , . version( " 1.0.0 " ) ) ,
3315
+ ( " b " , . version( " 1.0.0-prerelease-20240710 " ) )
3316
+ ] )
3317
+
3318
+ let dependencies2 = try builder. create ( dependencies: [
3319
+ " c " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " c " ] ) ) ,
3320
+ " d " : ( . versionSet( . range( " 1.0.0-latest " ..< " 2.0.0 " ) ) , . specific( [ " d " ] ) )
3321
+ ] )
3322
+
3323
+ AssertResult ( resolver. solve ( constraints: dependencies2) , [
3324
+ ( " c " , . version( " 1.0.0 " ) ) ,
3325
+ ( " d " , . version( " 1.0.6 " ) )
3326
+ ] )
3327
+ }
3328
+
3329
+ func testPrereleaseExactRequirement( ) throws {
3330
+ try builder. serve ( " c " , at: " 1.0.0 " , with: [
3331
+ " c " : [
3332
+ " d " : ( . versionSet( . range( " 1.0.4 " ..< " 2.0.0 " ) ) , . specific( [ " d " ] ) )
3333
+ ]
3334
+ ] )
3335
+ try builder. serve ( " c " , at: " 1.0.1 " )
3336
+
3337
+ try builder. serve ( " d " , at: " 1.0.0-prerelease-20240710 " )
3338
+ try builder. serve ( " d " , at: " 1.0.4 " )
3339
+ try builder. serve ( " d " , at: " 1.0.6-prerelease-1 " )
3340
+
3341
+ let resolver = builder. create ( )
3342
+
3343
+ let exactDependencies = try builder. create ( dependencies: [
3344
+ " c " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " c " ] ) ) ,
3345
+ " d " : ( . versionSet( . exact( " 1.0.6-prerelease-1 " ) ) , . specific( [ " d " ] ) )
3346
+ ] )
3347
+
3348
+ // FIXME: This should produce a valid solution but cannot at the
3349
+ // moment because "1.0.4"..<"2.0.0" doesn't support pre-release versions
3350
+ // and there is no way to infer it.
3351
+ let resultWithExact = resolver. solve ( constraints: exactDependencies)
3352
+ XCTAssertMatch (
3353
+ resultWithExact. errorMsg,
3354
+ . contains( " Dependencies could not be resolved because root depends on 'd' 1.0.6-prerelease-1 " )
3355
+ )
3356
+
3357
+ let rangeDependency = try builder. create ( dependencies: [
3358
+ " c " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " c " ] ) ) ,
3359
+ " d " : ( . versionSet( . range( " 1.0.5 " ..< " 1.0.6-prerelease-2 " ) ) , . specific( [ " d " ] ) )
3360
+ ] )
3361
+
3362
+ let resultWithRange = resolver. solve ( constraints: rangeDependency)
3363
+ AssertResult ( resultWithRange, [
3364
+ ( " c " , . version( " 1.0.0 " ) ) ,
3365
+ ( " d " , . version( " 1.0.6-prerelease-1 " ) )
3366
+ ] )
3367
+ }
3368
+
3369
+ func testReleaseOverPrerelease( ) throws {
3370
+ try builder. serve ( " a " , at: " 1.0.0 " , with: [
3371
+ " a " : [
3372
+ " b " : ( . versionSet( . range( " 0.0.8 " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) )
3373
+ ]
3374
+ ] )
3375
+
3376
+ try builder. serve ( " b " , at: " 1.0.0-prerelease-20240616 " )
3377
+ try builder. serve ( " b " , at: " 1.0.0 " )
3378
+
3379
+ let resolver = builder. create ( )
3380
+ // The order matters here because solver used to assign `b` before `a`.
3381
+ let dependencies1 = try builder. create ( dependencies: [
3382
+ " a " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " a " ] ) ) ,
3383
+ " b " : ( . versionSet( . range( " 1.0.0-latest " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) )
3384
+ ] )
3385
+
3386
+ AssertResult ( resolver. solve ( constraints: dependencies1) , [
3387
+ ( " a " , . version( " 1.0.0 " ) ) ,
3388
+ ( " b " , . version( " 1.0.0 " ) )
3389
+ ] )
3390
+
3391
+ let dependencies2 = try builder. create ( dependencies: [
3392
+ " b " : ( . versionSet( . range( " 1.0.0-latest " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) ) ,
3393
+ " a " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " a " ] ) )
3394
+ ] )
3395
+
3396
+ AssertResult ( resolver. solve ( constraints: dependencies2) , [
3397
+ ( " a " , . version( " 1.0.0 " ) ) ,
3398
+ ( " b " , . version( " 1.0.0 " ) )
3399
+ ] )
3400
+ }
3401
+
3402
+ func testPrereleaseInferenceThroughDependencies( ) throws {
3403
+ try builder. serve ( " a " , at: " 1.0.0 " , with: [
3404
+ " a " : [
3405
+ " b " : ( . versionSet( . range( " 1.0.0 " ..< " 2.0.0-latest " ) ) , . specific( [ " b " ] ) )
3406
+ ]
3407
+ ] )
3408
+
3409
+ try builder. serve ( " b " , at: " 0.0.8-prerelease-20230310 " )
3410
+ try builder. serve ( " b " , at: " 0.0.8 " )
3411
+ try builder. serve ( " b " , at: " 1.0.0-prerelease-20230616 " )
3412
+ try builder. serve ( " b " , at: " 1.0.0 " )
3413
+ try builder. serve ( " b " , at: " 1.9.9-prerelease-20240702 " )
3414
+
3415
+ let resolver = builder. create ( )
3416
+ // The order matters here because solver used to assign `b` before `a`.
3417
+ let dependencies1 = try builder. create ( dependencies: [
3418
+ " a " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " a " ] ) ) ,
3419
+ " b " : ( . versionSet( . range( " 0.0.8 " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) )
3420
+ ] )
3421
+
3422
+ AssertResult ( resolver. solve ( constraints: dependencies1) , [
3423
+ ( " a " , . version( " 1.0.0 " ) ) ,
3424
+ ( " b " , . version( " 1.9.9-prerelease-20240702 " ) )
3425
+ ] )
3426
+
3427
+ let dependencies2 = try builder. create ( dependencies: [
3428
+ " b " : ( . versionSet( . range( " 0.0.8 " ..< " 2.0.0 " ) ) , . specific( [ " b " ] ) ) ,
3429
+ " a " : ( . versionSet( . exact( " 1.0.0 " ) ) , . specific( [ " a " ] ) )
3430
+ ] )
3431
+
3432
+ AssertResult ( resolver. solve ( constraints: dependencies2) , [
3433
+ ( " a " , . version( " 1.0.0 " ) ) ,
3434
+ ( " b " , . version( " 1.9.9-prerelease-20240702 " ) )
3435
+ ] )
3436
+ }
3285
3437
}
3286
3438
3287
3439
extension PinsStore . PinState {
0 commit comments