@@ -156,6 +156,215 @@ int main(int argc, char** argv)
156156 versionIfstreamInstance = nullptr ;
157157 };
158158
159+ const char * commonUserConfigForVersionFile = R"(
160+ PreferredProfile: "g++"
161+ Profiles:
162+ - Name: "g++"
163+ FileExtensions: [.cpp, .cc, .cxx]
164+ Languages: ["c++"]
165+ FilesTypes:
166+ ObjectLinkFile: &PrefixExtensionTemplate
167+ Prefix:
168+ DefaultPlatform: "prefix"
169+ Extension:
170+ DefaultPlatform: ".extension"
171+ SharedLinkFile: *PrefixExtensionTemplate
172+ SharedLibraryFile: *PrefixExtensionTemplate
173+ StaticLinkFile: *PrefixExtensionTemplate
174+ DebugSymbolFile: *PrefixExtensionTemplate
175+ Compiler:
176+ CheckExistence:
177+ DefaultPlatform: "g++ -v"
178+ CompileTypes: &TypeInfoEntries
179+ Executable: &DefaultTypeInfo
180+ DefaultPlatform:
181+ Flags: "Flags"
182+ Executable: "g++"
183+ RunParts: []
184+ ExpectedOutputFiles: []
185+ ExecutableShared: *DefaultTypeInfo
186+ Static: *DefaultTypeInfo
187+ Shared: *DefaultTypeInfo
188+ Linker:
189+ CheckExistence:
190+ DefaultPlatform: "g++ -v"
191+ LinkTypes: *TypeInfoEntries
192+ )" ;
193+
194+ ssTEST (" ReadUserConfig Should Not Write Default Configs When Updated Version File Exists" )
195+ {
196+ ssTEST_OUTPUT_SETUP
197+ (
198+ CO_INSTRUCT_REF (OverrideInstance, std::Mock_ifstream, rdbuf)
199+ .Returns <std::string>(commonUserConfigForVersionFile)
200+ .If
201+ (
202+ [&userConfigIfstreamInstance](void * instance, ...) -> bool
203+ {
204+ return instance == userConfigIfstreamInstance;
205+ }
206+ )
207+ .Times (1 )
208+ .Expected ();
209+
210+ std::vector<runcpp2::Data::Profile> profiles;
211+ std::string preferredProfile;
212+ commonDefaultOverrideSetup ();
213+ );
214+
215+ ssTEST_OUTPUT_EXECUTION
216+ (
217+ bool parseResult = runcpp2::ReadUserConfig (profiles, preferredProfile, configPath);
218+ );
219+
220+ ssTEST_OUTPUT_ASSERT (" ReadUserConfig should succeed" , parseResult);
221+ ssTEST_OUTPUT_ASSERT (" Should parse 1 profiles" , profiles.size (), 1 );
222+ ssTEST_OUTPUT_ASSERT (preferredProfile == " g++" );
223+ ssTEST_OUTPUT_ASSERT (" " , CO_GET_FAILED_FUNCTIONS (OverrideInstance).size (), 0 );
224+ ssTEST_OUTPUT_VALUES_WHEN_FAILED (CO_GET_FAILED_REPORT (OverrideInstance));
225+ };
226+
227+ ssTEST (" ReadUserConfig Should Write Default Configs When Outdated Version File Exists" )
228+ {
229+ ssTEST_OUTPUT_SETUP
230+ (
231+ CO_REMOVE_INSTRUCT_REF (OverrideInstance, runcpp2, WriteDefaultConfigs);
232+ CO_REMOVE_INSTRUCT_REF (OverrideInstance, std::Mock_ifstream, rdbuf);
233+
234+ const std::string outdatedVersionString = std::to_string (RUNCPP2_CONFIG_VERSION - 1 );
235+ CO_INSTRUCT_REF (OverrideInstance, std::Mock_ifstream, rdbuf)
236+ .Returns <std::string>(outdatedVersionString)
237+ .If
238+ (
239+ [&versionIfstreamInstance](void * instance, ...) -> bool
240+ {
241+ return instance == versionIfstreamInstance;
242+ }
243+ )
244+ .Times (1 )
245+ .Expected ();
246+ CO_INSTRUCT_REF (OverrideInstance, std::Mock_ifstream, rdbuf)
247+ .Returns <std::string>(commonUserConfigForVersionFile)
248+ .If
249+ (
250+ [&userConfigIfstreamInstance](void * instance, ...) -> bool
251+ {
252+ return instance == userConfigIfstreamInstance;
253+ }
254+ )
255+ .Times (1 )
256+ .Expected ();
257+ CO_INSTRUCT_REF (OverrideInstance, runcpp2, WriteDefaultConfigs)
258+ .WhenCalledWith
259+ <
260+ const ghc::filesystem::path&,
261+ bool ,
262+ bool
263+ >
264+ (
265+ configPath,
266+ false , // writeUserConfig
267+ true // writeDefaultConfigs
268+ )
269+ .Returns <bool >(true )
270+ .Expected ();
271+
272+ std::vector<runcpp2::Data::Profile> profiles;
273+ std::string preferredProfile;
274+ commonDefaultOverrideSetup ();
275+ );
276+
277+ ssTEST_OUTPUT_EXECUTION
278+ (
279+ bool parseResult = runcpp2::ReadUserConfig (profiles, preferredProfile, configPath);
280+ );
281+
282+ ssTEST_OUTPUT_ASSERT (" ReadUserConfig should succeed" , parseResult);
283+ ssTEST_OUTPUT_ASSERT (" Should parse 1 profile" , profiles.size (), 1 );
284+ ssTEST_OUTPUT_ASSERT (preferredProfile == " g++" );
285+ ssTEST_OUTPUT_ASSERT (" " , CO_GET_FAILED_FUNCTIONS (OverrideInstance).size (), 0 );
286+ ssTEST_OUTPUT_VALUES_WHEN_FAILED (CO_GET_FAILED_REPORT (OverrideInstance));
287+ };
288+
289+ ssTEST (" ReadUserConfig Should Write Default Configs When Version File Doesn't Exists" )
290+ {
291+ ssTEST_OUTPUT_SETUP
292+ (
293+ ssTEST_CALL_COMMON_CLEANUP ();
294+ CO_INSTRUCT_REF (OverrideInstance, ghc::filesystem, Mock_exists)
295+ .WhenCalledWith <const std::string&, CO_ANY_TYPE>(configPath, CO_ANY)
296+ .Times (1 )
297+ .Returns <bool >(true )
298+ .Expected ();
299+ CO_INSTRUCT_REF (OverrideInstance, ghc::filesystem, Mock_exists)
300+ .WhenCalledWith <const std::string&, CO_ANY_TYPE>(versionPath, CO_ANY)
301+ .Times (1 )
302+ .Returns <bool >(false )
303+ .Expected ();
304+ CO_INSTRUCT_REF (OverrideInstance, runcpp2, WriteDefaultConfigs)
305+ .WhenCalledWith
306+ <
307+ const ghc::filesystem::path&,
308+ bool ,
309+ bool
310+ >
311+ (
312+ configPath,
313+ false , // writeUserConfig
314+ true // writeDefaultConfigs
315+ )
316+ .Returns <bool >(true )
317+ .Expected ();
318+ CO_INSTRUCT_NO_REF (OverrideInstance, Mock_ifstream)
319+ .WhenCalledWith <const ghc::filesystem::path&>(configPath)
320+ .WhenCalledExpectedly_Do
321+ (
322+ [&userConfigIfstreamInstance](void * instance, ...)
323+ {
324+ userConfigIfstreamInstance = instance;
325+ }
326+ )
327+ .Times (1 )
328+ .Expected ();
329+ CO_INSTRUCT_REF (OverrideInstance, std::Mock_ifstream, operator !)
330+ .If
331+ (
332+ [&userConfigIfstreamInstance, &versionIfstreamInstance]
333+ (void * instance, ...) -> bool
334+ {
335+ return instance == userConfigIfstreamInstance;
336+ }
337+ )
338+ .Times (1 )
339+ .Returns <bool >(false )
340+ .Expected ();
341+ CO_INSTRUCT_REF (OverrideInstance, std::Mock_ifstream, rdbuf)
342+ .Returns <std::string>(commonUserConfigForVersionFile)
343+ .If
344+ (
345+ [&userConfigIfstreamInstance](void * instance, ...) -> bool
346+ {
347+ return instance == userConfigIfstreamInstance;
348+ }
349+ )
350+ .Times (1 )
351+ .Expected ();
352+
353+ std::vector<runcpp2::Data::Profile> profiles;
354+ std::string preferredProfile;
355+ commonDefaultOverrideSetup ();
356+ );
357+
358+ ssTEST_OUTPUT_EXECUTION
359+ (
360+ bool parseResult = runcpp2::ReadUserConfig (profiles, preferredProfile, configPath);
361+ );
362+
363+ ssTEST_OUTPUT_ASSERT (" ReadUserConfig should succeed" , parseResult);
364+ ssTEST_OUTPUT_ASSERT (" " , CO_GET_FAILED_FUNCTIONS (OverrideInstance).size (), 0 );
365+ ssTEST_OUTPUT_VALUES_WHEN_FAILED (CO_GET_FAILED_REPORT (OverrideInstance));
366+ };
367+
159368 ssTEST (" ReadUserConfig Should Parse PreferredProfile As String Correctly" )
160369 {
161370 ssTEST_OUTPUT_SETUP
0 commit comments