Skip to content

Commit ee6a58d

Browse files
committed
NFC: Add more tests for prebuilt libraries feature
1 parent 0e897ed commit ee6a58d

File tree

1 file changed

+112
-14
lines changed

1 file changed

+112
-14
lines changed

Tests/PackageGraphTests/PubgrubTests.swift

Lines changed: 112 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,13 +1855,13 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
18551855
}
18561856

18571857
func testAvailableLibraries() throws {
1858-
let ref: PackageReference = .remoteSourceControl(
1858+
let fooRef: PackageReference = .remoteSourceControl(
18591859
identity: .plain("foo"),
18601860
url: .init("https://example.com/org/foo")
18611861
)
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")))
18651865

18661866
let availableLibraries: [LibraryMetadata] = [
18671867
.init(
@@ -1874,10 +1874,10 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
18741874

18751875
let resolver = builder.create(availableLibraries: availableLibraries)
18761876
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"]))
18781878
])
18791879
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"]))
18811881
])
18821882

18831883
let result = resolver.solve(constraints: dependencies1)
@@ -1889,6 +1889,104 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
18891889
("foo", .version(.init(stringLiteral: "1.2.0"))),
18901890
])
18911891
}
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+
}
18921990
}
18931991

18941992
final class PubGrubDiagnosticsTests: XCTestCase {
@@ -3199,7 +3297,7 @@ class DependencyGraphBuilder {
31993297
_ package: String,
32003298
at versions: [Version],
32013299
toolsVersion: ToolsVersion? = nil,
3202-
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<String, (PackageRequirement, ProductFilter)>> = [:]
3300+
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<PackageReference, (PackageRequirement, ProductFilter)>> = [:]
32033301
) throws {
32043302
try self.serve(package, at: versions.map{ .version($0) }, toolsVersion: toolsVersion, with: dependencies)
32053303
}
@@ -3208,7 +3306,7 @@ class DependencyGraphBuilder {
32083306
_ package: String,
32093307
at version: Version,
32103308
toolsVersion: ToolsVersion? = nil,
3211-
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<String, (PackageRequirement, ProductFilter)>> = [:]
3309+
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<PackageReference, (PackageRequirement, ProductFilter)>> = [:]
32123310
) throws {
32133311
try self.serve(package, at: .version(version), toolsVersion: toolsVersion, with: dependencies)
32143312
}
@@ -3217,7 +3315,7 @@ class DependencyGraphBuilder {
32173315
_ package: String,
32183316
at versions: [BoundVersion],
32193317
toolsVersion: ToolsVersion? = nil,
3220-
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<String, (PackageRequirement, ProductFilter)>> = [:]
3318+
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<PackageReference, (PackageRequirement, ProductFilter)>> = [:]
32213319
) throws {
32223320
let packageReference = try reference(for: package)
32233321
try self.serve(
@@ -3232,7 +3330,7 @@ class DependencyGraphBuilder {
32323330
_ package: String,
32333331
at version: BoundVersion,
32343332
toolsVersion: ToolsVersion? = nil,
3235-
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<String, (PackageRequirement, ProductFilter)>> = [:]
3333+
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<PackageReference, (PackageRequirement, ProductFilter)>> = [:]
32363334
) throws {
32373335
let packageReference = try reference(for: package)
32383336
try self.serve(
@@ -3247,7 +3345,7 @@ class DependencyGraphBuilder {
32473345
_ packageReference: PackageReference,
32483346
at versions: [BoundVersion],
32493347
toolsVersion: ToolsVersion? = nil,
3250-
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<String, (PackageRequirement, ProductFilter)>> = [:]
3348+
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<PackageReference, (PackageRequirement, ProductFilter)>> = [:]
32513349
) throws {
32523350
for version in versions {
32533351
try serve(packageReference, at: version, toolsVersion: toolsVersion, with: dependencies)
@@ -3258,7 +3356,7 @@ class DependencyGraphBuilder {
32583356
_ packageReference: PackageReference,
32593357
at version: BoundVersion,
32603358
toolsVersion: ToolsVersion? = nil,
3261-
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<String, (PackageRequirement, ProductFilter)>> = [:]
3359+
with dependencies: KeyValuePairs<String, OrderedCollections.OrderedDictionary<PackageReference, (PackageRequirement, ProductFilter)>> = [:]
32623360
) throws {
32633361
let container = self.containers[packageReference.identity.description] ?? MockContainer(package: packageReference)
32643362

@@ -3272,8 +3370,8 @@ class DependencyGraphBuilder {
32723370
container.dependencies[version.description] = [:]
32733371
}
32743372
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)
32773375
}
32783376
container.dependencies[version.description, default: [:]][product, default: []] += packageDependencies
32793377
}

0 commit comments

Comments
 (0)