|
1 | 1 | module UnitTests.Distribution.Client.IndexUtils where |
2 | 2 |
|
3 | 3 | import Distribution.Client.IndexUtils |
| 4 | +import Distribution.Client.IndexUtils.ActiveRepos |
4 | 5 | import qualified Distribution.Compat.NonEmptySet as NES |
| 6 | +import Distribution.Package |
5 | 7 | import Distribution.Simple.Utils (toUTF8LBS) |
6 | | -import Distribution.Types.Dependency |
| 8 | +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex |
7 | 9 | import Distribution.Types.LibraryName |
8 | | -import Distribution.Types.PackageName |
9 | 10 | import Distribution.Version |
10 | 11 |
|
| 12 | +import Data.List (sort) |
| 13 | + |
11 | 14 | import Test.Tasty |
12 | 15 | import Test.Tasty.HUnit |
13 | 16 |
|
14 | 17 | tests :: [TestTree] |
15 | 18 | tests = |
16 | 19 | [ simpleVersionsParserTests |
| 20 | + , indexCombiningTests |
17 | 21 | ] |
18 | 22 |
|
| 23 | +-- --------------------------------------------------------------------------- |
| 24 | +-- Preferred-versions parser tests |
| 25 | +-- --------------------------------------------------------------------------- |
| 26 | + |
19 | 27 | simpleVersionsParserTests :: TestTree |
20 | 28 | simpleVersionsParserTests = |
21 | 29 | testGroup |
@@ -80,3 +88,115 @@ simpleVersionsParserTests = |
80 | 88 | ] |
81 | 89 | , preferredVersionsOriginalDependency = "binary 0.9.0.0 || > 0.9.0.0" |
82 | 90 | } |
| 91 | + |
| 92 | +-- --------------------------------------------------------------------------- |
| 93 | +-- Index-combining tests |
| 94 | +-- |
| 95 | +-- These test the addIndex / foldl' logic inside getSourcePackagesAtIndexState, |
| 96 | +-- which applies CombineStrategy to a sequence of PackageIndex values: |
| 97 | +-- |
| 98 | +-- addIndex acc (_, Skip) = acc |
| 99 | +-- addIndex acc (idx, Merge) = PackageIndex.merge acc idx |
| 100 | +-- addIndex acc (idx, Override) = PackageIndex.override acc idx |
| 101 | +-- pkgs = foldl' addIndex mempty pkgss' |
| 102 | +-- --------------------------------------------------------------------------- |
| 103 | + |
| 104 | +indexCombiningTests :: TestTree |
| 105 | +indexCombiningTests = |
| 106 | + testGroup |
| 107 | + "Index combining (CombineStrategy)" |
| 108 | + [ testCase "Skip: repo contributes nothing" $ |
| 109 | + pkgs [(repoFoo1, CombineStrategySkip)] |
| 110 | + @?= [] |
| 111 | + , testCase "Merge: single repo makes all its packages visible" $ |
| 112 | + pkgs [(repoFoo1, CombineStrategyMerge)] |
| 113 | + @?= [foo1] |
| 114 | + , testCase "Override: single repo makes all its packages visible" $ |
| 115 | + pkgs [(repoFoo1, CombineStrategyOverride)] |
| 116 | + @?= [foo1] |
| 117 | + , testCase "Merge+Merge: non-overlapping packages are both visible" $ |
| 118 | + pkgs [(repoFoo1, CombineStrategyMerge), (repoBar1, CombineStrategyMerge)] |
| 119 | + @?= sort [foo1, bar1] |
| 120 | + , testCase "Merge+Merge: different versions of same package are both visible" $ |
| 121 | + pkgs [(repoFoo1, CombineStrategyMerge), (repoFoo2, CombineStrategyMerge)] |
| 122 | + @?= sort [foo1, foo2] |
| 123 | + , testCase "Merge+Override: packages only in first repo remain visible" $ |
| 124 | + pkgs [(repoFoo1, CombineStrategyMerge), (repoBar1, CombineStrategyOverride)] |
| 125 | + @?= sort [foo1, bar1] |
| 126 | + , testCase "Merge+Override: override repo replaces all versions of overlapping package" $ |
| 127 | + -- repoFoo12 has foo-1.0 and foo-1.1; repoFoo2 has only foo-2.0. |
| 128 | + -- Override means repoFoo2 wins the entire 'foo' bucket. |
| 129 | + pkgs [(repoFoo12, CombineStrategyMerge), (repoFoo2, CombineStrategyOverride)] |
| 130 | + @?= [foo2] |
| 131 | + , testCase "Merge+Override: override does not affect packages absent from override repo" $ |
| 132 | + pkgs [(repoFoo1bar1, CombineStrategyMerge), (repoFoo2, CombineStrategyOverride)] |
| 133 | + @?= sort [foo2, bar1] |
| 134 | + , testCase "Skip in middle: skipped repo is ignored" $ |
| 135 | + pkgs |
| 136 | + [ (repoFoo1, CombineStrategyMerge) |
| 137 | + , (repoFoo2, CombineStrategySkip) |
| 138 | + , (repoBar1, CombineStrategyMerge) |
| 139 | + ] |
| 140 | + @?= sort [foo1, bar1] |
| 141 | + , testCase "Skip+Merge: later merge after skip still contributes" $ |
| 142 | + pkgs [(repoFoo1, CombineStrategySkip), (repoFoo2, CombineStrategyMerge)] |
| 143 | + @?= [foo2] |
| 144 | + , testCase "Override+Override: last override wins the package bucket" $ |
| 145 | + pkgs |
| 146 | + [ (repoFoo1, CombineStrategyMerge) |
| 147 | + , (repoFoo2, CombineStrategyOverride) |
| 148 | + , (repoFoo3, CombineStrategyOverride) |
| 149 | + ] |
| 150 | + @?= [foo3] |
| 151 | + , testCase "Override+Merge: merge after override combines both buckets" $ |
| 152 | + -- foo bucket starts as {foo-2.0} after override, then merges {foo-3.0} |
| 153 | + -- giving {foo-2.0, foo-3.0} |
| 154 | + pkgs |
| 155 | + [ (repoFoo1, CombineStrategyMerge) |
| 156 | + , (repoFoo2, CombineStrategyOverride) |
| 157 | + , (repoFoo3, CombineStrategyMerge) |
| 158 | + ] |
| 159 | + @?= sort [foo2, foo3] |
| 160 | + , testCase "All skip: result is empty" $ |
| 161 | + pkgs |
| 162 | + [ (repoFoo1, CombineStrategySkip) |
| 163 | + , (repoFoo2, CombineStrategySkip) |
| 164 | + ] |
| 165 | + @?= [] |
| 166 | + , testCase "Empty repos list: result is empty" $ |
| 167 | + pkgs [] @?= [] |
| 168 | + ] |
| 169 | + |
| 170 | +-- Mirrors the addIndex / foldl' in getSourcePackagesAtIndexState. |
| 171 | +combineIndex |
| 172 | + :: PackageIndex.PackageIndex PackageIdentifier |
| 173 | + -> (PackageIndex.PackageIndex PackageIdentifier, CombineStrategy) |
| 174 | + -> PackageIndex.PackageIndex PackageIdentifier |
| 175 | +combineIndex acc (_, CombineStrategySkip) = acc |
| 176 | +combineIndex acc (idx, CombineStrategyMerge) = PackageIndex.merge acc idx |
| 177 | +combineIndex acc (idx, CombineStrategyOverride) = PackageIndex.override acc idx |
| 178 | + |
| 179 | +-- Run the combining fold and return the result as a sorted list of PackageIds. |
| 180 | +pkgs |
| 181 | + :: [(PackageIndex.PackageIndex PackageIdentifier, CombineStrategy)] |
| 182 | + -> [PackageIdentifier] |
| 183 | +pkgs = sort . PackageIndex.allPackages . foldl combineIndex mempty |
| 184 | + |
| 185 | +-- Test packages |
| 186 | +foo1, foo2, foo3, bar1 :: PackageIdentifier |
| 187 | +foo1 = PackageIdentifier (mkPackageName "foo") (mkVersion [1, 0]) |
| 188 | +foo2 = PackageIdentifier (mkPackageName "foo") (mkVersion [2, 0]) |
| 189 | +foo3 = PackageIdentifier (mkPackageName "foo") (mkVersion [3, 0]) |
| 190 | +bar1 = PackageIdentifier (mkPackageName "bar") (mkVersion [1, 0]) |
| 191 | + |
| 192 | +-- Single-package indices |
| 193 | +repoFoo1, repoFoo2, repoFoo3, repoBar1 :: PackageIndex.PackageIndex PackageIdentifier |
| 194 | +repoFoo1 = PackageIndex.fromList [foo1] |
| 195 | +repoFoo2 = PackageIndex.fromList [foo2] |
| 196 | +repoFoo3 = PackageIndex.fromList [foo3] |
| 197 | +repoBar1 = PackageIndex.fromList [bar1] |
| 198 | + |
| 199 | +-- Multi-package indices |
| 200 | +repoFoo12, repoFoo1bar1 :: PackageIndex.PackageIndex PackageIdentifier |
| 201 | +repoFoo12 = PackageIndex.fromList [foo1, foo2] |
| 202 | +repoFoo1bar1 = PackageIndex.fromList [foo1, bar1] |
0 commit comments