77
88using namespace std ::string_literals;
99using namespace std ::string_view_literals;
10+ using namespace AppInstaller ::Utility::literals;
1011
1112namespace AppInstaller ::Repository::Microsoft
1213{
@@ -29,6 +30,7 @@ namespace AppInstaller::Repository::Microsoft
2930 // TODO: If this becomes more dynamic, refactor the UserSettings code to make it easier to leverage here
3031 ParseHR (root, " .OpenHR" , OpenHR);
3132 ParseHR (root, " .SearchHR" , SearchHR);
33+ ParseBool (root, " .ContainsPackage" , ContainsPackage);
3234 }
3335 else
3436 {
@@ -43,6 +45,9 @@ namespace AppInstaller::Repository::Microsoft
4345 // The HR to throw on Source::Search (if FAILED)
4446 HRESULT SearchHR = S_OK;
4547
48+ // If a result should be returned by search.
49+ bool ContainsPackage = false ;
50+
4651 private:
4752 static void ParseHR (const Json::Value& root, const std::string& path, HRESULT& hr)
4853 {
@@ -60,10 +65,148 @@ namespace AppInstaller::Repository::Microsoft
6065 }
6166 }
6267 }
68+
69+ static void ParseBool (const Json::Value& root, const std::string& path, bool & value)
70+ {
71+ const Json::Path jsonPath (path);
72+ Json::Value node = jsonPath.resolve (root);
73+ if (!node.isNull ())
74+ {
75+ if (node.isBool ())
76+ {
77+ value = node.asBool ();
78+ }
79+ }
80+ }
81+ };
82+
83+ // A test package that contains test data.
84+ struct TestPackage : public std ::enable_shared_from_this<TestPackage>, public ICompositePackage, public IPackage, public IPackageVersion
85+ {
86+ TestPackage (std::shared_ptr<ISource> source) : m_source(std::move(source)) {}
87+
88+ Utility::LocIndString GetProperty (PackageProperty property) const override
89+ {
90+ switch (property)
91+ {
92+ case PackageProperty::Id:
93+ return " ConfigurableTestSource Package Identifier" _lis;
94+ case PackageProperty::Name:
95+ return " ConfigurableTestSource Package Name" _lis;
96+ }
97+
98+ return {};
99+ }
100+
101+ std::shared_ptr<IPackage> GetInstalled () override
102+ {
103+ return nullptr ;
104+ }
105+
106+ std::vector<std::shared_ptr<IPackage>> GetAvailable () override
107+ {
108+ return { shared_from_this () };
109+ }
110+
111+ std::vector<Utility::LocIndString> GetMultiProperty (PackageMultiProperty) const override
112+ {
113+ return {};
114+ }
115+
116+ Source GetSource () const override
117+ {
118+ return { m_source };
119+ }
120+
121+ bool IsSame (const IPackage*) const override
122+ {
123+ return false ;
124+ }
125+
126+ const void * CastTo (IPackageType) const override
127+ {
128+ return nullptr ;
129+ }
130+
131+ std::vector<PackageVersionKey> GetVersionKeys () const override
132+ {
133+ return { {} };
134+ }
135+
136+ std::shared_ptr<IPackageVersion> GetVersion (const PackageVersionKey&) const override
137+ {
138+ return std::static_pointer_cast<IPackageVersion>(NonConstSharedFromThis ());
139+ }
140+
141+ std::shared_ptr<IPackageVersion> GetLatestVersion () const override
142+ {
143+ return std::static_pointer_cast<IPackageVersion>(NonConstSharedFromThis ());
144+ }
145+
146+ Utility::LocIndString GetProperty (PackageVersionProperty property) const override
147+ {
148+ switch (property)
149+ {
150+ case PackageVersionProperty::Id:
151+ return " ConfigurableTestSource Package Version Identifier" _lis;
152+ case PackageVersionProperty::Name:
153+ return " ConfigurableTestSource Package Version Name" _lis;
154+ case PackageVersionProperty::SourceIdentifier:
155+ return " ConfigurableTestSource Package Version Source Identifier" _lis;
156+ case PackageVersionProperty::SourceName:
157+ return " ConfigurableTestSource Package Version Source Name" _lis;
158+ case PackageVersionProperty::Version:
159+ return " ConfigurableTestSource Package Version Version" _lis;
160+ case PackageVersionProperty::Channel:
161+ return " ConfigurableTestSource Package Version Channel" _lis;
162+ case PackageVersionProperty::RelativePath:
163+ return " ConfigurableTestSource Package Version Relative Path" _lis;
164+ case PackageVersionProperty::ManifestSHA256Hash:
165+ return " ConfigurableTestSource Package Version Manifest SHA 256 Hash" _lis;
166+ case PackageVersionProperty::Publisher:
167+ return " ConfigurableTestSource Package Version Publisher" _lis;
168+ case PackageVersionProperty::ArpMinVersion:
169+ return " ConfigurableTestSource Package Version Arp Min Version" _lis;
170+ case PackageVersionProperty::ArpMaxVersion:
171+ return " ConfigurableTestSource Package Version Arp Max Version" _lis;
172+ case PackageVersionProperty::Moniker:
173+ return " ConfigurableTestSource Package Version Moniker" _lis;
174+ }
175+
176+ return {};
177+ }
178+
179+ std::vector<Utility::LocIndString> GetMultiProperty (PackageVersionMultiProperty) const override
180+ {
181+ return {};
182+ }
183+
184+ Manifest::Manifest GetManifest () override
185+ {
186+ Manifest::Manifest result;
187+
188+ result.Id = " ConfigurableTestSource Manifest Identifier" ;
189+ result.CurrentLocalization .Add <Manifest::Localization::PackageName>(" ConfigurableTestSource Manifest Name" );
190+
191+ return result;
192+ }
193+
194+ Metadata GetMetadata () const override
195+ {
196+ return {};
197+ }
198+
199+ private:
200+ std::shared_ptr<TestPackage> NonConstSharedFromThis () const
201+ {
202+ return const_cast <TestPackage*>(this )->shared_from_this ();
203+ }
204+
205+ std::shared_ptr<ISource> m_source;
63206 };
64207
65208 // The configurable source itself.
66- struct ConfigurableTestSource : public ISource
209+ struct ConfigurableTestSource : public std ::enable_shared_from_this<ConfigurableTestSource>, public ISource
67210 {
68211 static constexpr ISourceType SourceType = ISourceType::ConfigurableTestSource;
69212
@@ -77,7 +220,18 @@ namespace AppInstaller::Repository::Microsoft
77220 SearchResult Search (const SearchRequest&) const override
78221 {
79222 THROW_IF_FAILED (m_config.SearchHR );
80- return {};
223+
224+ SearchResult result;
225+
226+ if (m_config.ContainsPackage )
227+ {
228+ std::shared_ptr<TestPackage> package = std::make_shared<TestPackage>(NonConstSharedFromThis ());
229+ PackageMatchFilter packageFilter{ {}, {} };
230+
231+ result.Matches .emplace_back (std::move (package), std::move (packageFilter));
232+ }
233+
234+ return result;
81235 }
82236
83237 void * CastTo (ISourceType type) override
@@ -91,6 +245,11 @@ namespace AppInstaller::Repository::Microsoft
91245 }
92246
93247 private:
248+ std::shared_ptr<ConfigurableTestSource> NonConstSharedFromThis () const
249+ {
250+ return const_cast <ConfigurableTestSource*>(this )->shared_from_this ();
251+ }
252+
94253 SourceDetails m_details;
95254 TestSourceConfiguration m_config;
96255 };
0 commit comments