@@ -73,47 +73,79 @@ Manifest::Manifest MakeDefaultManifest(std::string_view version = "1.0"sv)
7373 return result;
7474}
7575
76- struct TestPackageHelper
76+ struct TestManifestHelper
7777{
78- TestPackageHelper (bool isInstalled, std::shared_ptr<ISource> source = {}) :
79- m_isInstalled (isInstalled), m_manifest(MakeDefaultManifest()), m_source(source) {}
78+ TestManifestHelper () : m_manifest(MakeDefaultManifest()) {}
8079
81- TestPackageHelper & WithId (const std::string& id)
80+ TestManifestHelper & WithId (const std::string& id)
8281 {
8382 m_manifest.Id = id;
8483 return *this ;
8584 }
8685
87- TestPackageHelper & WithVersion (std::string_view version)
86+ TestManifestHelper & WithVersion (std::string_view version)
8887 {
8988 m_manifest.Version = version;
9089 return *this ;
9190 }
9291
93- TestPackageHelper & WithChannel (const std::string& channel)
92+ TestManifestHelper & WithChannel (const std::string& channel)
9493 {
9594 m_manifest.Channel = channel;
9695 return *this ;
9796 }
9897
99- TestPackageHelper & WithDefaultName (std::string_view name)
98+ TestManifestHelper & WithDefaultName (std::string_view name)
10099 {
101100 m_manifest.DefaultLocalization .Add <Manifest::Localization::PackageName>(std::string{ name });
102101 return *this ;
103102 }
104103
105- TestPackageHelper & WithPFN (const std::string& pfn)
104+ TestManifestHelper & WithPFN (const std::string& pfn)
106105 {
107106 m_manifest.Installers [0 ].PackageFamilyName = pfn;
108107 return *this ;
109108 }
110109
111- TestPackageHelper & WithPC (const std::string& pc)
110+ TestManifestHelper & WithPC (const std::string& pc)
112111 {
113112 m_manifest.Installers [0 ].ProductCode = pc;
114113 return *this ;
115114 }
116115
116+ TestManifestHelper& WithType (Manifest::InstallerTypeEnum type)
117+ {
118+ m_manifest.Installers [0 ].BaseInstallerType = type;
119+ return *this ;
120+ }
121+
122+ TestManifestHelper& WithDisplayVersion (std::string_view version)
123+ {
124+ if (m_manifest.Installers [0 ].AppsAndFeaturesEntries .empty ())
125+ {
126+ m_manifest.Installers [0 ].AppsAndFeaturesEntries .emplace_back ();
127+ }
128+ m_manifest.Installers [0 ].AppsAndFeaturesEntries [0 ].DisplayVersion = version;
129+ return *this ;
130+ }
131+
132+ operator const Manifest::Manifest& () const
133+ {
134+ return m_manifest;
135+ }
136+
137+ private:
138+ Manifest::Manifest m_manifest;
139+ };
140+
141+ struct TestPackageHelper
142+ {
143+ TestPackageHelper (bool isInstalled, std::shared_ptr<ISource> source = {}) :
144+ m_isInstalled (isInstalled), m_source(source)
145+ {
146+ m_manifestHelpers.emplace_back ();
147+ }
148+
117149 TestPackageHelper& HideSRS (bool value = true )
118150 {
119151 m_hideSystemReferenceStrings = value;
@@ -126,11 +158,18 @@ struct TestPackageHelper
126158 {
127159 if (m_isInstalled)
128160 {
129- m_package = TestCompositePackage::Make (m_manifest, TestCompositePackage::MetadataMap{} , std::vector<Manifest::Manifest>(), m_source);
161+ m_package = TestCompositePackage::Make (this -> operator const Manifest::Manifest&(), m_metadata , std::vector<Manifest::Manifest>(), m_source);
130162 }
131163 else
132164 {
133- m_package = TestCompositePackage::Make (std::vector<Manifest::Manifest>{ m_manifest }, m_source, m_hideSystemReferenceStrings);
165+ std::vector<Manifest::Manifest> manifests;
166+
167+ for (const auto & helper : m_manifestHelpers)
168+ {
169+ manifests.emplace_back (helper.operator const AppInstaller::Manifest::Manifest &());
170+ }
171+
172+ m_package = TestCompositePackage::Make (manifests, m_source, m_hideSystemReferenceStrings);
134173 }
135174 }
136175
@@ -142,17 +181,89 @@ struct TestPackageHelper
142181 return ToPackage ();
143182 }
144183
184+ TestPackageHelper& WithId (const std::string& id)
185+ {
186+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
187+ m_manifestHelpers[0 ].WithId (id);
188+ return *this ;
189+ }
190+
191+ TestPackageHelper& WithVersion (std::string_view version)
192+ {
193+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
194+ m_manifestHelpers[0 ].WithVersion (version);
195+ return *this ;
196+ }
197+
198+ TestPackageHelper& WithChannel (const std::string& channel)
199+ {
200+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
201+ m_manifestHelpers[0 ].WithChannel (channel);
202+ return *this ;
203+ }
204+
205+ TestPackageHelper& WithDefaultName (std::string_view name)
206+ {
207+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
208+ m_manifestHelpers[0 ].WithDefaultName (name);
209+ return *this ;
210+ }
211+
212+ TestPackageHelper& WithPFN (const std::string& pfn)
213+ {
214+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
215+ m_manifestHelpers[0 ].WithPFN (pfn);
216+ return *this ;
217+ }
218+
219+ TestPackageHelper& WithPC (const std::string& pc)
220+ {
221+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
222+ m_manifestHelpers[0 ].WithPC (pc);
223+ return *this ;
224+ }
225+
226+ TestPackageHelper& WithType (Manifest::InstallerTypeEnum type)
227+ {
228+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
229+ m_manifestHelpers[0 ].WithType (type);
230+ return *this ;
231+ }
232+
233+ TestPackageHelper& WithDisplayVersion (std::string_view version)
234+ {
235+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
236+ m_manifestHelpers[0 ].WithDisplayVersion (version);
237+ return *this ;
238+ }
239+
240+ TestPackageHelper& WithMetadata (PackageVersionMetadata metadata, const std::string& value)
241+ {
242+ THROW_HR_IF (E_UNEXPECTED, !m_isInstalled);
243+ m_metadata[metadata] = value;
244+ return *this ;
245+ }
246+
145247 operator const Manifest::Manifest& () const
146248 {
147- return m_manifest;
249+ THROW_HR_IF (E_UNEXPECTED, m_manifestHelpers.size () != 1 );
250+ return m_manifestHelpers[0 ];
251+ }
252+
253+ TestManifestHelper& MakeManifest ()
254+ {
255+ THROW_HR_IF (E_UNEXPECTED, m_isInstalled);
256+ m_manifestHelpers.emplace_back ();
257+ return m_manifestHelpers.back ();
148258 }
149259
150260private:
151261 bool m_isInstalled;
152- Manifest::Manifest m_manifest ;
262+ std::vector<TestManifestHelper> m_manifestHelpers ;
153263 std::shared_ptr<ISource> m_source;
154264 std::shared_ptr<TestCompositePackage> m_package;
155265 bool m_hideSystemReferenceStrings = false ;
266+ TestCompositePackage::MetadataMap m_metadata;
156267};
157268
158269// A helper to create the sources used by the majority of tests in this file.
@@ -1831,3 +1942,43 @@ TEST_CASE("CompositeSource_SxS_Available_TwoVersions_SameAvailable", "[Composite
18311942 REQUIRE (availablePackages.size () == 1 );
18321943 REQUIRE (availablePackages[0 ]->IsSame (availablePackage->Available [0 ].get ()));
18331944}
1945+
1946+ TEST_CASE (" CompositeSource_MappedVersions_ProperSorting" , " [CompositeSource]" )
1947+ {
1948+ std::string installedID = " Installed.Id" ;
1949+ std::string availableID = " Available.Id" ;
1950+ auto type = Manifest::InstallerTypeEnum::Exe;
1951+ std::string pfn = " MY_PFN" ;
1952+ std::string version1 = " 1000.0" ;
1953+ std::string version2 = " 2000.0" ;
1954+ std::string versionMapped1 = " 1.0" ;
1955+ std::string versionMapped2 = " 2.0" ;
1956+
1957+ CompositeTestSetup setup;
1958+
1959+ setup.Installed ->Everything .Matches .emplace_back (setup.MakeInstalled ().WithId (installedID).WithPFN (pfn).WithVersion (version1).WithMetadata (PackageVersionMetadata::InstalledType, " exe" ), Criteria ());
1960+ setup.Installed ->Everything .Matches .emplace_back (setup.MakeInstalled ().WithId (installedID).WithPFN (pfn).WithVersion (version2).WithMetadata (PackageVersionMetadata::InstalledType, " exe" ), Criteria ());
1961+
1962+ setup.Available ->SearchFunction = [&](const SearchRequest&)
1963+ {
1964+ auto package = setup.MakeAvailable ();
1965+ package.WithId (availableID).WithType (type).WithPFN (pfn).WithVersion (versionMapped1).WithDisplayVersion (version1);
1966+ package.MakeManifest ().WithId (availableID).WithType (type).WithPFN (pfn).WithVersion (versionMapped2).WithDisplayVersion (version2);
1967+
1968+ SearchResult result;
1969+ result.Matches .emplace_back (package, Criteria ());
1970+ return result;
1971+ };
1972+
1973+ SearchResult result = setup.Search (true );
1974+
1975+ REQUIRE (result.Matches .size () == 1 );
1976+ auto package = result.Matches [0 ].Package ;
1977+ REQUIRE (package);
1978+ auto installedPackage = package->GetInstalled ();
1979+ REQUIRE (installedPackage);
1980+ auto installedVersions = installedPackage->GetVersionKeys ();
1981+ REQUIRE (installedVersions.size () == 2 );
1982+ REQUIRE (installedVersions[0 ].Version == versionMapped2);
1983+ REQUIRE (installedVersions[1 ].Version == versionMapped1);
1984+ }
0 commit comments