@@ -47,8 +47,11 @@ module UnitTests.Distribution.Solver.Modular.DSL
47
47
, runProgress
48
48
, mkSimpleVersion
49
49
, mkVersionRange
50
+ , exQualToQPN
51
+ , sortedGoalsToSortOrder
50
52
) where
51
53
54
+ import Data.List (elemIndex )
52
55
import Distribution.Solver.Compat.Prelude
53
56
import Distribution.Utils.Generic
54
57
import Prelude ()
@@ -84,6 +87,7 @@ import qualified Distribution.Client.SolverInstallPlan as CI.SolverInstallPlan
84
87
import Distribution.Client.Types
85
88
86
89
import Distribution.Solver.Types.ComponentDeps (ComponentDeps )
90
+ import qualified Distribution.Solver.Types.ComponentDeps as C
87
91
import qualified Distribution.Solver.Types.ComponentDeps as CD
88
92
import Distribution.Solver.Types.ConstraintSource
89
93
import Distribution.Solver.Types.Flag
@@ -823,7 +827,7 @@ exResolve
823
827
-> OnlyConstrained
824
828
-> EnableBackjumping
825
829
-> SolveExecutables
826
- -> Maybe ( Variable P. QPN -> Variable P. QPN -> Ordering )
830
+ -> Maybe [ ExampleVar ]
827
831
-> [ExConstraint ]
828
832
-> [ExPreference ]
829
833
-> C. Verbosity
@@ -868,13 +872,28 @@ exResolve
868
872
}
869
873
enableTests
870
874
| asBool enableAllTests =
871
- fmap
872
- ( \ p ->
873
- PackageConstraint
874
- (scopeToplevel (C. mkPackageName p))
875
- (PackagePropertyStanzas [TestStanzas ])
876
- )
877
- (exDbPkgs db)
875
+ nub $
876
+ -- We need to traverse the explicit goals and introduce the tests for each in the corresponding scope,
877
+ -- because some may be qualified and simply introducing them at the top-level would not be correct
878
+ map
879
+ ( \ var ->
880
+ PackageConstraint
881
+ ( case case var of
882
+ P qual pkgname -> exQualToQPN qual pkgname
883
+ F qual pkgname _ -> exQualToQPN qual pkgname
884
+ S qual pkgname _ -> exQualToQPN qual pkgname of
885
+ P. Q (P. PackagePath ns ql) pkgname -> ScopeQualified ns ql pkgname
886
+ )
887
+ (PackagePropertyStanzas [TestStanzas ])
888
+ )
889
+ (fromMaybe [] goalOrder)
890
+ <> fmap
891
+ ( \ p ->
892
+ PackageConstraint
893
+ (scopeToplevel (C. mkPackageName p))
894
+ (PackagePropertyStanzas [TestStanzas ])
895
+ )
896
+ (exDbPkgs db)
878
897
| otherwise = []
879
898
targets' = fmap (\ p -> NamedPackage (C. mkPackageName p) [] ) targets
880
899
params =
@@ -892,7 +911,7 @@ exResolve
892
911
setOnlyConstrained onlyConstrained $
893
912
setEnableBackjumping enableBj $
894
913
setSolveExecutables solveExes $
895
- setGoalOrder goalOrder $
914
+ setGoalOrder (sortedGoalsToSortOrder <$> goalOrder) $
896
915
setSolverVerbosity verbosity $
897
916
standardInstallPolicy instIdx avaiIdx targets'
898
917
toLpc pc = LabeledPackageConstraint pc ConstraintSourceUnknown
@@ -932,3 +951,41 @@ runProgress = go
932
951
go (Step s p) = let (ss, result) = go p in (s : ss, result)
933
952
go (Fail e) = ([] , Left e)
934
953
go (Done a) = ([] , Right a)
954
+
955
+ exQualToQPN :: ExampleQualifier -> ExamplePkgName -> P. QPN
956
+ exQualToQPN q pn = P. Q pp (C. mkPackageName pn)
957
+ where
958
+ pp = case q of
959
+ QualNone -> P. PackagePath P. DefaultNamespace P. QualToplevel
960
+ QualIndep p ->
961
+ P. PackagePath
962
+ (P. Independent $ C. mkPackageName p)
963
+ P. QualToplevel
964
+ QualSetup s ->
965
+ P. PackagePath
966
+ (P. IndependentComponent (C. mkPackageName s) C. ComponentSetup )
967
+ (P. QualToplevel )
968
+ QualExe p1 p2 ->
969
+ P. PackagePath
970
+ (P. IndependentBuildTool (C. mkPackageName p1) (C. mkPackageName p2))
971
+ P. QualToplevel
972
+
973
+ sortedGoalsToSortOrder :: [ExampleVar ] -> Variable P. QPN -> Variable P. QPN -> Ordering
974
+ sortedGoalsToSortOrder = sortGoals where
975
+ sortGoals
976
+ :: [ExampleVar ]
977
+ -> Variable P. QPN
978
+ -> Variable P. QPN
979
+ -> Ordering
980
+ sortGoals = orderFromList . map toVariable
981
+
982
+ -- Sort elements in the list ahead of elements not in the list. Otherwise,
983
+ -- follow the order in the list.
984
+ orderFromList :: Eq a => [a ] -> a -> a -> Ordering
985
+ orderFromList xs =
986
+ comparing $ \ x -> let i = elemIndex x xs in (isNothing i, i)
987
+
988
+ toVariable :: ExampleVar -> Variable P. QPN
989
+ toVariable (P q pn) = PackageVar (exQualToQPN q pn)
990
+ toVariable (F q pn fn) = FlagVar (exQualToQPN q pn) (C. mkFlagName fn)
991
+ toVariable (S q pn stanza) = StanzaVar (exQualToQPN q pn) stanza
0 commit comments