@@ -227,7 +227,7 @@ final class PubgrubTests: XCTestCase {
227
227
XCTAssertEqual ( a2? . requirement, . range( v1..< v1_5) )
228
228
}
229
229
230
- func testSolutionUndecided( ) {
230
+ func testSolutionUndecided( ) throws {
231
231
var solution = PartialSolution ( )
232
232
solution. derive ( " a^1.0.0 " , cause: rootCause)
233
233
solution. decide ( . empty( package : " b " ) , at: v2)
@@ -240,7 +240,7 @@ final class PubgrubTests: XCTestCase {
240
240
XCTAssertEqual ( undecided, [ Term ( " a^1.5.0 " ) , Term ( " d^1.9.9 " ) ] )
241
241
}
242
242
243
- func testSolutionAddAssignments( ) {
243
+ func testSolutionAddAssignments( ) throws {
244
244
let root = Term ( rootNode, . exact( " 1.0.0 " ) )
245
245
246
246
@@ -404,7 +404,7 @@ final class PubgrubTests: XCTestCase {
404
404
XCTAssertEqual ( state2. solution. assignments. count, 2 )
405
405
}
406
406
407
- func testSolutionFindSatisfiers( ) {
407
+ func testSolutionFindSatisfiers( ) throws {
408
408
var solution = PartialSolution ( )
409
409
solution. decide ( rootNode, at: v1) // ← previous, but actually nil because this is the root decision
410
410
solution. derive ( Term ( . product( " a " , package : aRef) , . any) , cause: _cause) // ← satisfier
@@ -1168,6 +1168,37 @@ final class PubgrubTests: XCTestCase {
1168
1168
] )
1169
1169
}
1170
1170
1171
+ // top level package -> beta version
1172
+ // beta version -> version
1173
+ func testHappyPath10( ) throws {
1174
+ let package = PackageReference . root ( identity: . plain( " package " ) , path: . root)
1175
+ try builder. serve ( package , at: . unversioned, with: [
1176
+ " module " : [
1177
+ " foo " : ( . versionSet( . range( " 1.0.0-alpha " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) )
1178
+ ] ] )
1179
+ try builder. serve ( " foo " , at: " 1.0.0-alpha.1 " , with: [ " foo " : [ " bar " : ( . versionSet( v1Range) , . specific( [ " bar " ] ) ) ] ] )
1180
+ try builder. serve ( " foo " , at: " 1.0.0-alpha.2 " , with: [ " foo " : [ " bar " : ( . versionSet( v1Range) , . specific( [ " bar " ] ) ) ] ] )
1181
+ try builder. serve ( " foo " , at: " 1.0.0-beta.1 " , with: [ " foo " : [ " bar " : ( . versionSet( v1Range) , . specific( [ " bar " ] ) ) ] ] )
1182
+ try builder. serve ( " foo " , at: " 1.0.0-beta.2 " , with: [ " foo " : [ " bar " : ( . versionSet( v1Range) , . specific( [ " bar " ] ) ) ] ] )
1183
+ try builder. serve ( " foo " , at: " 1.0.0-beta.3 " , with: [ " foo " : [ " bar " : ( . versionSet( v1Range) , . specific( [ " bar " ] ) ) ] ] )
1184
+ try builder. serve ( " bar " , at: v1)
1185
+ try builder. serve ( " bar " , at: v1_1)
1186
+ try builder. serve ( " bar " , at: v1_5)
1187
+
1188
+ let resolver = builder. create ( )
1189
+ let dependencies = builder. create ( dependencies: [
1190
+ package : ( . unversioned, . everything)
1191
+ ] )
1192
+
1193
+ let result = resolver. solve ( constraints: dependencies)
1194
+
1195
+ AssertResult ( result, [
1196
+ ( " package " , . unversioned) ,
1197
+ ( " foo " , . version( " 1.0.0-beta.3 " ) ) ,
1198
+ ( " bar " , . version( v1_5) )
1199
+ ] )
1200
+ }
1201
+
1171
1202
func testResolutionWithSimpleBranchBasedDependency( ) throws {
1172
1203
try builder. serve ( " foo " , at: . revision( " master " ) , with: [ " foo " : [ " bar " : ( . versionSet( v1Range) , . specific( [ " bar " ] ) ) ] ] )
1173
1204
try builder. serve ( " bar " , at: v1)
@@ -1826,16 +1857,16 @@ final class PubGrubTestsBasicGraphs: XCTestCase {
1826
1857
final class PubGrubDiagnosticsTests : XCTestCase {
1827
1858
1828
1859
func testMissingVersion( ) throws {
1829
- try builder. serve ( " foopkg " , at: v1_1)
1860
+ try builder. serve ( " package " , at: v1_1)
1830
1861
1831
1862
let resolver = builder. create ( )
1832
1863
let dependencies = try builder. create ( dependencies: [
1833
- " foopkg " : ( . versionSet( v2Range) , . specific( [ " foopkg " ] ) ) ,
1864
+ " package " : ( . versionSet( v2Range) , . specific( [ " package " ] ) ) ,
1834
1865
] )
1835
1866
let result = resolver. solve ( constraints: dependencies)
1836
1867
1837
1868
XCTAssertEqual ( result. errorMsg, """
1838
- Dependencies could not be resolved because no versions of 'foopkg ' match the requirement 2.0.0..<3.0.0 and root depends on 'foopkg ' 2.0.0..<3.0.0.
1869
+ Dependencies could not be resolved because no versions of 'package ' match the requirement 2.0.0..<3.0.0 and root depends on 'package ' 2.0.0..<3.0.0.
1839
1870
""" )
1840
1871
}
1841
1872
@@ -1853,6 +1884,74 @@ final class PubGrubDiagnosticsTests: XCTestCase {
1853
1884
""" )
1854
1885
}
1855
1886
1887
+ func testResolutionNonExistentBetaVersion( ) throws {
1888
+ try builder. serve ( " package " , at: " 0.0.1 " )
1889
+
1890
+ let resolver = builder. create ( )
1891
+ let dependencies = try builder. create ( dependencies: [
1892
+ " package " : ( . versionSet( . range( " 1.0.0-beta " ..< " 2.0.0 " ) ) , . specific( [ " package " ] ) ) ,
1893
+ ] )
1894
+ let result = resolver. solve ( constraints: dependencies)
1895
+
1896
+ XCTAssertEqual ( result. errorMsg, """
1897
+ Dependencies could not be resolved because no versions of 'package' match the requirement 1.0.0-beta..<2.0.0 and root depends on 'package' 1.0.0-beta..<2.0.0.
1898
+ """ )
1899
+ }
1900
+
1901
+ func testResolutionNonExistentTransitiveVersion( ) throws {
1902
+ try builder. serve ( " package " , at: v1_5, with: [
1903
+ " package " : [ " foo " : ( . versionSet( v1Range) , . specific( [ " foo " ] ) ) ]
1904
+ ] )
1905
+ try builder. serve ( " foo " , at: " 0.0.1 " )
1906
+
1907
+ let resolver = builder. create ( )
1908
+ let dependencies = try builder. create ( dependencies: [
1909
+ " package " : ( . versionSet( v1Range) , . specific( [ " package " ] ) )
1910
+ ] )
1911
+ let result = resolver. solve ( constraints: dependencies)
1912
+
1913
+ XCTAssertEqual ( result. errorMsg, """
1914
+ Dependencies could not be resolved because no versions of 'foo' match the requirement 1.0.0..<2.0.0 and root depends on 'package' 1.0.0..<2.0.0.
1915
+ 'package' practically depends on 'foo' 1.0.0..<2.0.0 because no versions of 'package' match the requirement {1.0.0..<1.5.0, 1.5.1..<2.0.0} and 'package' 1.5.0 depends on 'foo' 1.0.0..<2.0.0.
1916
+ """ )
1917
+ }
1918
+
1919
+ func testResolutionNonExistentTransitiveBetaVersion( ) throws {
1920
+ try builder. serve ( " package " , at: v1_5, with: [
1921
+ " package " : [ " foo " : ( . versionSet( . range( " 1.0.0-beta " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) ) ]
1922
+ ] )
1923
+ try builder. serve ( " foo " , at: " 0.0.1 " )
1924
+
1925
+ let resolver = builder. create ( )
1926
+ let dependencies = try builder. create ( dependencies: [
1927
+ " package " : ( . versionSet( v1Range) , . specific( [ " package " ] ) )
1928
+ ] )
1929
+ let result = resolver. solve ( constraints: dependencies)
1930
+
1931
+ XCTAssertEqual ( result. errorMsg, """
1932
+ Dependencies could not be resolved because no versions of 'foo' match the requirement 1.0.0-beta..<2.0.0 and root depends on 'package' 1.0.0..<2.0.0.
1933
+ 'package' practically depends on 'foo' 1.0.0-beta..<2.0.0 because no versions of 'package' match the requirement {1.0.0..<1.5.0, 1.5.1..<2.0.0} and 'package' 1.5.0 depends on 'foo' 1.0.0-beta..<2.0.0.
1934
+ """ )
1935
+ }
1936
+
1937
+ func testResolutionBetaVersionNonExistentTransitiveVersion( ) throws {
1938
+ try builder. serve ( " package " , at: " 1.0.0-beta.1 " , with: [
1939
+ " package " : [ " foo " : ( . versionSet( v1Range) , . specific( [ " foo " ] ) ) ]
1940
+ ] )
1941
+ try builder. serve ( " foo " , at: " 0.0.1 " )
1942
+
1943
+ let resolver = builder. create ( )
1944
+ let dependencies = try builder. create ( dependencies: [
1945
+ " package " : ( . versionSet( . range( " 1.0.0-beta " ..< " 2.0.0 " ) ) , . specific( [ " package " ] ) ) ,
1946
+ ] )
1947
+ let result = resolver. solve ( constraints: dependencies)
1948
+
1949
+ XCTAssertEqual ( result. errorMsg, """
1950
+ Dependencies could not be resolved because no versions of 'foo' match the requirement 1.0.0..<2.0.0 and root depends on 'package' 1.0.0-beta..<2.0.0.
1951
+ 'package' practically depends on 'foo' 1.0.0..<2.0.0 because no versions of 'package' match the requirement {1.0.0-beta..<1.0.0-beta.1, 1.0.0-beta.1.0..<2.0.0} and 'package' 1.0.0-beta.1 depends on 'foo' 1.0.0..<2.0.0.
1952
+ """ )
1953
+ }
1954
+
1856
1955
func testResolutionLinearErrorReporting( ) throws {
1857
1956
try builder. serve ( " foo " , at: v1, with: [ " foo " : [ " bar " : ( . versionSet( v2Range) , . specific( [ " bar " ] ) ) ] ] )
1858
1957
try builder. serve ( " bar " , at: v2, with: [ " bar " : [ " baz " : ( . versionSet( . range( " 3.0.0 " ..< " 4.0.0 " ) ) , . specific( [ " baz " ] ) ) ] ] )
@@ -2355,6 +2454,8 @@ final class PubGrubDiagnosticsTests: XCTestCase {
2355
2454
try builder. serve ( " foo " , at: v1_1, with: [
2356
2455
" foo " : [ " bar " : ( . revision( " master " ) , . specific( [ " bar " ] ) ) ]
2357
2456
] )
2457
+ try builder. serve ( " bar " , at: . revision( " master " ) )
2458
+
2358
2459
let resolver = builder. create ( )
2359
2460
let dependencies = try builder. create ( dependencies: [
2360
2461
" foo " : ( . versionSet( v1Range) , . specific( [ " foo " ] ) ) ,
@@ -2367,10 +2468,12 @@ final class PubGrubDiagnosticsTests: XCTestCase {
2367
2468
""" )
2368
2469
}
2369
2470
2370
- func testNonVersionDependencyInVersionDependency3 ( ) throws {
2471
+ func testNonVersionDependencyInVersionDependency2 ( ) throws {
2371
2472
try builder. serve ( " foo " , at: v1, with: [
2372
2473
" foo " : [ " bar " : ( . unversioned, . specific( [ " bar " ] ) ) ]
2373
2474
] )
2475
+ try builder. serve ( " bar " , at: . unversioned)
2476
+
2374
2477
let resolver = builder. create ( )
2375
2478
let dependencies = try builder. create ( dependencies: [
2376
2479
" foo " : ( . versionSet( . exact( v1) ) , . specific( [ " foo " ] ) ) ,
@@ -2382,6 +2485,31 @@ final class PubGrubDiagnosticsTests: XCTestCase {
2382
2485
""" )
2383
2486
}
2384
2487
2488
+ func testNonVersionDependencyInVersionDependency3( ) throws {
2489
+ try builder. serve ( " foo " , at: " 1.0.0-beta.1 " , with: [
2490
+ " foo " : [ " bar " : ( . revision( " master " ) , . specific( [ " bar " ] ) ) ]
2491
+ ] )
2492
+ try builder. serve ( " foo " , at: " 1.0.0-beta.2 " , with: [
2493
+ " foo " : [ " bar " : ( . revision( " master " ) , . specific( [ " bar " ] ) ) ]
2494
+ ] )
2495
+ try builder. serve ( " foo " , at: " 1.0.0-beta.3 " , with: [
2496
+ " foo " : [ " bar " : ( . revision( " master " ) , . specific( [ " bar " ] ) ) ]
2497
+ ] )
2498
+ try builder. serve ( " bar " , at: . revision( " master " ) )
2499
+
2500
+ let resolver = builder. create ( )
2501
+ let dependencies = try builder. create ( dependencies: [
2502
+ " foo " : ( . versionSet( . range( " 1.0.0-beta " ..< " 2.0.0 " ) ) , . specific( [ " foo " ] ) ) ,
2503
+ ] )
2504
+ let result = resolver. solve ( constraints: dependencies)
2505
+
2506
+ XCTAssertEqual ( result. errorMsg, """
2507
+ Dependencies could not be resolved because package 'foo' is required using a stable-version but 'foo' depends on an unstable-version package 'bar' and root depends on 'foo' 1.0.0-beta..<2.0.0.
2508
+ 'foo' {1.0.0-beta..<1.0.0-beta.3, 1.0.0-beta.3.0..<2.0.0} cannot be used because package 'foo' is required using a stable-version but 'foo' depends on an unstable-version package 'bar'.
2509
+ 'foo' {1.0.0-beta..<1.0.0-beta.2, 1.0.0-beta.2.0..<1.0.0-beta.3, 1.0.0-beta.3.0..<2.0.0} cannot be used because no versions of 'foo' match the requirement {1.0.0-beta..<1.0.0-beta.1, 1.0.0-beta.1.0..<1.0.0-beta.2, 1.0.0-beta.2.0..<1.0.0-beta.3, 1.0.0-beta.3.0..<2.0.0} and package 'foo' is required using a stable-version but 'foo' depends on an unstable-version package 'bar'.
2510
+ """ )
2511
+ }
2512
+
2385
2513
func testIncompatibleToolsVersion1( ) throws {
2386
2514
try builder. serve ( " a " , at: v1, toolsVersion: . v5)
2387
2515
0 commit comments