@@ -1855,13 +1855,13 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
1855
1855
}
1856
1856
1857
1857
func testAvailableLibraries( ) throws {
1858
- let ref : PackageReference = . remoteSourceControl(
1858
+ let fooRef : PackageReference = . remoteSourceControl(
1859
1859
identity: . plain( " foo " ) ,
1860
1860
url: . init( " https://example.com/org/foo " )
1861
1861
)
1862
- try builder. serve ( ref , at: . version( . init( stringLiteral: " 1.0.0 " ) ) )
1863
- try builder. serve ( ref , at: . version( . init( stringLiteral: " 1.2.0 " ) ) )
1864
- try builder. serve ( ref , at: . version( . init( stringLiteral: " 2.0.0 " ) ) )
1862
+ try builder. serve ( fooRef , at: . version( . init( stringLiteral: " 1.0.0 " ) ) )
1863
+ try builder. serve ( fooRef , at: . version( . init( stringLiteral: " 1.2.0 " ) ) )
1864
+ try builder. serve ( fooRef , at: . version( . init( stringLiteral: " 2.0.0 " ) ) )
1865
1865
1866
1866
let availableLibraries : [ LibraryMetadata ] = [
1867
1867
. init(
@@ -1874,10 +1874,10 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
1874
1874
1875
1875
let resolver = builder. create ( availableLibraries: availableLibraries)
1876
1876
let dependencies1 = builder. create ( dependencies: [
1877
- ref : ( . versionSet( . range( " 1.0.0 " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) ) ,
1877
+ fooRef : ( . versionSet( . range( " 1.0.0 " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) )
1878
1878
] )
1879
1879
let dependencies2 = builder. create ( dependencies: [
1880
- ref : ( . versionSet( . range( " 1.1.0 " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) ) ,
1880
+ fooRef : ( . versionSet( . range( " 1.1.0 " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) )
1881
1881
] )
1882
1882
1883
1883
let result = resolver. solve ( constraints: dependencies1)
@@ -1889,6 +1889,104 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
1889
1889
( " foo " , . version( . init( stringLiteral: " 1.2.0 " ) ) ) ,
1890
1890
] )
1891
1891
}
1892
+
1893
+ func testAvailableLibrariesArePreferred( ) throws {
1894
+ let fooRef : PackageReference = . remoteSourceControl(
1895
+ identity: . plain( " foo " ) ,
1896
+ url: . init( " https://example.com/org/foo " )
1897
+ )
1898
+
1899
+ try builder. serve ( fooRef, at: . version( . init( stringLiteral: " 1.0.0 " ) ) )
1900
+ try builder. serve ( fooRef, at: . version( . init( stringLiteral: " 1.1.0 " ) ) , with: [
1901
+ " foo " : [
1902
+ " left " : ( . versionSet( . range( . upToNextMajor( from: " 1.0.0 " ) ) ) , . everything) ,
1903
+ " right " : ( . versionSet( . range( . upToNextMajor( from: " 1.0.0 " ) ) ) , . everything)
1904
+ ]
1905
+ ] )
1906
+
1907
+ try builder. serve ( " left " , at: " 1.0.0 " , with: [
1908
+ " left " : [ " shared " : ( . versionSet( . range( . upToNextMajor( from: " 1.0.0 " ) ) ) , . everything) ]
1909
+ ] )
1910
+
1911
+ try builder. serve ( " right " , at: " 1.0.0 " , with: [
1912
+ " right " : [ " shared " : ( . versionSet( . range( " 0.0.0 " ..< " 2.0.0 " ) ) , . everything) ]
1913
+ ] )
1914
+
1915
+ try builder. serve ( " shared " , at: " 1.0.0 " , with: [
1916
+ " shared " : [ " target " : ( . versionSet( . range( . upToNextMajor( from: " 1.0.0 " ) ) ) , . everything) ]
1917
+ ] )
1918
+ try builder. serve ( " shared " , at: " 2.0.0 " )
1919
+
1920
+ try builder. serve ( " target " , at: " 1.0.0 " )
1921
+ try builder. serve ( " target " , at: " 2.0.0 " )
1922
+
1923
+ let availableLibraries : [ LibraryMetadata ] = [
1924
+ . init(
1925
+ identities: [ . sourceControl( url: " https://example.com/org/foo " ) ] ,
1926
+ version: " 1.1.0 " ,
1927
+ productName: nil ,
1928
+ schemaVersion: 1
1929
+ )
1930
+ ]
1931
+
1932
+ let resolver = builder. create ( availableLibraries: availableLibraries)
1933
+ let dependencies = builder. create ( dependencies: [
1934
+ fooRef: ( . versionSet( . range( . upToNextMajor( from: " 1.0.0 " ) ) ) , . everything) ,
1935
+ " target " : ( . versionSet( . range( . upToNextMajor( from: " 2.0.0 " ) ) ) , . everything)
1936
+ ] )
1937
+
1938
+ // This behavior requires an explanation - "foo" is elided because 1.1.0 is prebuilt.
1939
+ // It matches "root" requirements but without prebuilt library the solver would pick
1940
+ // "1.0.0" because "foo" 1.1.0 dependency version requirements are incompatible with
1941
+ // "target" 2.0.0.
1942
+
1943
+ let result = resolver. solve ( constraints: dependencies)
1944
+ AssertResult ( result, [
1945
+ ( " target " , . version( . init( stringLiteral: " 2.0.0 " ) ) ) ,
1946
+ ] )
1947
+ }
1948
+
1949
+ func testAvailableLibrariesWithFallback( ) throws {
1950
+ let fooRef : PackageReference = . remoteSourceControl(
1951
+ identity: . plain( " foo " ) ,
1952
+ url: . init( " https://example.com/org/foo " )
1953
+ )
1954
+
1955
+ let barRef : PackageReference = . init( stringLiteral: " bar " )
1956
+
1957
+ try builder. serve ( fooRef, at: . version( . init( stringLiteral: " 1.0.0 " ) ) )
1958
+ try builder. serve ( fooRef, at: . version( . init( stringLiteral: " 1.1.0 " ) ) )
1959
+ try builder. serve ( fooRef, at: . version( . init( stringLiteral: " 1.2.0 " ) ) )
1960
+ try builder. serve ( fooRef, at: . version( . init( stringLiteral: " 2.0.0 " ) ) )
1961
+
1962
+ try builder. serve ( " bar " , at: " 1.0.0 " , with: [
1963
+ " bar " : [ fooRef: ( . versionSet( . range( . upToNextMinor( from: " 1.1.0 " ) ) ) , . everything) ]
1964
+ ] )
1965
+ try builder. serve ( " bar " , at: " 2.0.0 " , with: [
1966
+ " bar " : [ fooRef: ( . versionSet( . range( . upToNextMinor( from: " 2.0.0 " ) ) ) , . everything) ]
1967
+ ] )
1968
+
1969
+ let availableLibraries : [ LibraryMetadata ] = [
1970
+ . init(
1971
+ identities: [ . sourceControl( url: " https://example.com/org/foo " ) ] ,
1972
+ version: " 1.0.0 " ,
1973
+ productName: nil ,
1974
+ schemaVersion: 1
1975
+ )
1976
+ ]
1977
+
1978
+ let resolver = builder. create ( availableLibraries: availableLibraries)
1979
+ let dependencies = builder. create ( dependencies: [
1980
+ fooRef: ( . versionSet( . range( . upToNextMajor( from: " 1.0.0 " ) ) ) , . everything) ,
1981
+ barRef: ( . versionSet( . range( " 1.0.0 " ..< " 3.0.0 " ) ) , . everything)
1982
+ ] )
1983
+
1984
+ let result = resolver. solve ( constraints: dependencies)
1985
+ AssertResult ( result, [
1986
+ ( " foo " , . version( . init( stringLiteral: " 1.1.0 " ) ) ) ,
1987
+ ( " bar " , . version( . init( stringLiteral: " 1.0.0 " ) ) )
1988
+ ] )
1989
+ }
1892
1990
}
1893
1991
1894
1992
final class PubGrubDiagnosticsTests : XCTestCase {
@@ -3199,7 +3297,7 @@ class DependencyGraphBuilder {
3199
3297
_ package : String ,
3200
3298
at versions: [ Version ] ,
3201
3299
toolsVersion: ToolsVersion ? = nil ,
3202
- with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < String , ( PackageRequirement , ProductFilter ) > > = [ : ]
3300
+ with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < PackageReference , ( PackageRequirement , ProductFilter ) > > = [ : ]
3203
3301
) throws {
3204
3302
try self . serve ( package , at: versions. map { . version( $0) } , toolsVersion: toolsVersion, with: dependencies)
3205
3303
}
@@ -3208,7 +3306,7 @@ class DependencyGraphBuilder {
3208
3306
_ package : String ,
3209
3307
at version: Version ,
3210
3308
toolsVersion: ToolsVersion ? = nil ,
3211
- with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < String , ( PackageRequirement , ProductFilter ) > > = [ : ]
3309
+ with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < PackageReference , ( PackageRequirement , ProductFilter ) > > = [ : ]
3212
3310
) throws {
3213
3311
try self . serve ( package , at: . version( version) , toolsVersion: toolsVersion, with: dependencies)
3214
3312
}
@@ -3217,7 +3315,7 @@ class DependencyGraphBuilder {
3217
3315
_ package : String ,
3218
3316
at versions: [ BoundVersion ] ,
3219
3317
toolsVersion: ToolsVersion ? = nil ,
3220
- with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < String , ( PackageRequirement , ProductFilter ) > > = [ : ]
3318
+ with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < PackageReference , ( PackageRequirement , ProductFilter ) > > = [ : ]
3221
3319
) throws {
3222
3320
let packageReference = try reference ( for: package )
3223
3321
try self . serve (
@@ -3232,7 +3330,7 @@ class DependencyGraphBuilder {
3232
3330
_ package : String ,
3233
3331
at version: BoundVersion ,
3234
3332
toolsVersion: ToolsVersion ? = nil ,
3235
- with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < String , ( PackageRequirement , ProductFilter ) > > = [ : ]
3333
+ with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < PackageReference , ( PackageRequirement , ProductFilter ) > > = [ : ]
3236
3334
) throws {
3237
3335
let packageReference = try reference ( for: package )
3238
3336
try self . serve (
@@ -3247,7 +3345,7 @@ class DependencyGraphBuilder {
3247
3345
_ packageReference: PackageReference ,
3248
3346
at versions: [ BoundVersion ] ,
3249
3347
toolsVersion: ToolsVersion ? = nil ,
3250
- with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < String , ( PackageRequirement , ProductFilter ) > > = [ : ]
3348
+ with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < PackageReference , ( PackageRequirement , ProductFilter ) > > = [ : ]
3251
3349
) throws {
3252
3350
for version in versions {
3253
3351
try serve ( packageReference, at: version, toolsVersion: toolsVersion, with: dependencies)
@@ -3258,7 +3356,7 @@ class DependencyGraphBuilder {
3258
3356
_ packageReference: PackageReference ,
3259
3357
at version: BoundVersion ,
3260
3358
toolsVersion: ToolsVersion ? = nil ,
3261
- with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < String , ( PackageRequirement , ProductFilter ) > > = [ : ]
3359
+ with dependencies: KeyValuePairs < String , OrderedCollections . OrderedDictionary < PackageReference , ( PackageRequirement , ProductFilter ) > > = [ : ]
3262
3360
) throws {
3263
3361
let container = self . containers [ packageReference. identity. description] ?? MockContainer ( package : packageReference)
3264
3362
@@ -3272,8 +3370,8 @@ class DependencyGraphBuilder {
3272
3370
container. dependencies [ version. description] = [ : ]
3273
3371
}
3274
3372
for (product, filteredDependencies) in dependencies {
3275
- let packageDependencies : [ MockContainer . Dependency ] = try filteredDependencies. map {
3276
- ( container: try reference ( for : $0 ) , requirement: $1. 0 , productFilter: $1. 1 )
3373
+ let packageDependencies : [ MockContainer . Dependency ] = filteredDependencies. map {
3374
+ ( container: $0 , requirement: $1. 0 , productFilter: $1. 1 )
3277
3375
}
3278
3376
container. dependencies [ version. description, default: [ : ] ] [ product, default: [ ] ] += packageDependencies
3279
3377
}
0 commit comments