Newer
Older
dub_jkp / source / dub / test / dependencies.d
  1. /*******************************************************************************
  2.  
  3. Test for dependencies
  4.  
  5. This module is mostly concerned with dependency resolutions and visible user
  6. behavior. Tests that check how different recipe would interact with one
  7. another, and how conflicts are resolved or reported, belong here.
  8.  
  9. The project (the loaded package) is usually named 'a' and dependencies use
  10. single-letter, increasing name, for simplicity. Version 1.0.0 is used where
  11. versions do not matter. Packages are usually created in reverse dependency
  12. order when possible, unless the creation order matters.
  13.  
  14. Test that deal with dependency resolution should not concern themselves with
  15. the registry: instead, packages are added to the `PackageManager`, as that
  16. makes testing the core logic more robust without adding a layer
  17. of complexity brought by the `PackageSupplier`.
  18.  
  19. Most tests have 3 parts: First, setup the various packages. Then, run
  20. `dub.upgrade(UpgradeOptions.select)` to create the selection. Finally,
  21. run tests on the resulting state.
  22.  
  23. *******************************************************************************/
  24.  
  25. module dub.test.dependencies;
  26.  
  27. version (unittest):
  28.  
  29. import dub.test.base;
  30.  
  31. // Ensure that simple dependencies get resolved correctly
  32. unittest
  33. {
  34. scope dub = new TestDub((scope FSEntry root) {
  35. root.writeFile(TestDub.ProjectPath ~ "dub.sdl", `name "a"
  36. version "1.0.0"
  37. dependency "b" version="*"
  38. dependency "c" version="*"
  39. `);
  40. root.writePackageFile("b", "1.0.0", `name "b"
  41. version "1.0.0"`, PackageFormat.sdl);
  42. root.writePackageFile("c", "1.0.0", `name "c"
  43. version "1.0.0"`, PackageFormat.sdl);
  44. });
  45. dub.loadPackage();
  46.  
  47. dub.upgrade(UpgradeOptions.select);
  48.  
  49. assert(dub.project.hasAllDependencies(), "project has missing dependencies");
  50. assert(dub.project.getDependency("b", true), "Missing 'b' dependency");
  51. assert(dub.project.getDependency("c", true), "Missing 'c' dependency");
  52. assert(dub.project.getDependency("no", true) is null, "Returned unexpected dependency");
  53. }
  54.  
  55. // Test that indirect dependencies get resolved correctly
  56. unittest
  57. {
  58. scope dub = new TestDub((scope FSEntry root) {
  59. root.writeFile(TestDub.ProjectPath ~ "dub.sdl", `name "a"
  60. dependency "b" version="*"`);
  61. root.writePackageFile("b", "1.0.0", `name "b"
  62. version "1.0.0"
  63. dependency "c" version="*"`, PackageFormat.sdl);
  64. root.writePackageFile("c", "1.0.0", `name "c"
  65. version "1.0.0"`, PackageFormat.sdl);
  66. });
  67. dub.loadPackage();
  68.  
  69. dub.upgrade(UpgradeOptions.select);
  70.  
  71. assert(dub.project.hasAllDependencies(), "project has missing dependencies");
  72. assert(dub.project.getDependency("b", true), "Missing 'b' dependency");
  73. assert(dub.project.getDependency("c", true), "Missing 'c' dependency");
  74. assert(dub.project.getDependency("no", true) is null, "Returned unexpected dependency");
  75. }
  76.  
  77. // Simple diamond dependency
  78. unittest
  79. {
  80. scope dub = new TestDub((scope FSEntry root) {
  81. root.writeFile(TestDub.ProjectPath ~ "dub.sdl", `name "a"
  82. dependency "b" version="*"
  83. dependency "c" version="*"`);
  84. root.writePackageFile("b", "1.0.0", `name "b"
  85. version "1.0.0"
  86. dependency "d" version="*"`, PackageFormat.sdl);
  87. root.writePackageFile("c", "1.0.0", `name "c"
  88. version "1.0.0"
  89. dependency "d" version="*"`, PackageFormat.sdl);
  90. root.writePackageFile("d", "1.0.0", `name "d"
  91. version "1.0.0"`, PackageFormat.sdl);
  92.  
  93. });
  94. dub.loadPackage();
  95.  
  96. dub.upgrade(UpgradeOptions.select);
  97.  
  98. assert(dub.project.hasAllDependencies(), "project has missing dependencies");
  99. assert(dub.project.getDependency("b", true), "Missing 'b' dependency");
  100. assert(dub.project.getDependency("c", true), "Missing 'c' dependency");
  101. assert(dub.project.getDependency("c", true), "Missing 'd' dependency");
  102. assert(dub.project.getDependency("no", true) is null, "Returned unexpected dependency");
  103. }
  104.  
  105. // Missing dependencies trigger an error
  106. unittest
  107. {
  108. scope dub = new TestDub((scope FSEntry root) {
  109. root.writeFile(TestDub.ProjectPath ~ "dub.sdl", `name "a"
  110. dependency "b" version="*"`);
  111. });
  112. dub.loadPackage();
  113.  
  114. try
  115. dub.upgrade(UpgradeOptions.select);
  116. catch (Exception exc)
  117. assert(exc.message() == `Failed to find any versions for package b, referenced by a ~master`);
  118.  
  119. assert(!dub.project.hasAllDependencies(), "project should have missing dependencies");
  120. assert(dub.project.getDependency("b", true) is null, "Found 'b' dependency");
  121. assert(dub.project.getDependency("no", true) is null, "Returned unexpected dependency");
  122.  
  123. // Add the missing dependency to our PackageManager
  124. dub.fs.writePackageFile(`b`, "1.0.0", `name "b"
  125. version "1.0.0"`, PackageFormat.sdl);
  126. dub.packageManager.refresh();
  127. dub.upgrade(UpgradeOptions.select);
  128. assert(dub.project.hasAllDependencies(), "project have missing dependencies");
  129. assert(dub.project.getDependency("b", true), "Missing 'b' dependency");
  130. assert(dub.project.getDependency("no", true) is null, "Returned unexpected dependency");
  131. }