Skip to content

Commit e9dea99

Browse files
authored
Merge pull request #262 from tonyhallett/settings-merger-enum
allow for RunMsCodeCoverage outside of vs options
2 parents 7028611 + d413a9e commit e9dea99

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

FineCodeCoverageTests/CoverageProject_Settings_Tests.cs

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Collections.Generic;
99
using System.IO;
1010
using System.Linq;
11+
using System.Reflection;
1112
using System.Threading.Tasks;
1213
using System.Xml.Linq;
1314

@@ -229,6 +230,29 @@ public void Should_Overwrite_Int_Properties()
229230
Assert.AreEqual(123, appOptions.ThresholdForCyclomaticComplexity);
230231
}
231232

233+
[Test]
234+
public void Should_Overwrite_Enum_Properties()
235+
{
236+
var mockAppOptions = new Mock<IAppOptions>();
237+
mockAppOptions.SetupAllProperties();
238+
var appOptions = mockAppOptions.Object;
239+
240+
var enumElement = XElement.Parse($@"
241+
<Root>
242+
<RunMsCodeCoverage>IfInRunSettings</RunMsCodeCoverage>
243+
</Root>
244+
");
245+
246+
var settingsMerger = new SettingsMerger(null);
247+
var mergedSettings = settingsMerger.Merge(
248+
appOptions,
249+
new List<XElement> { },
250+
enumElement);
251+
252+
Assert.AreSame(appOptions, mergedSettings);
253+
Assert.AreEqual(RunMsCodeCoverage.IfInRunSettings, appOptions.RunMsCodeCoverage);
254+
}
255+
232256
[Test]
233257
public void Should_Overwrite_String_Properties()
234258
{
@@ -440,18 +464,20 @@ public void Should_Convert_Xml_Value_Correctly(string propertyElement,string pro
440464
var settingsMerger = new SettingsMerger(new Mock<ILogger>().Object);
441465
var settingsElement = XElement.Parse($"<Root>{propertyElement}</Root>");
442466
var property = typeof(IAppOptions).GetPublicProperties().First(p => p.Name == propertyName);
443-
if (expectedException)
444-
{
445-
Assert.Throws<Exception>(() =>
446-
{
447-
settingsMerger.GetValueFromXml(settingsElement, property);
448-
});
449-
}
450-
else
451-
{
452-
var value = settingsMerger.GetValueFromXml(settingsElement, property);
453-
Assert.AreEqual(expectedConversion, value);
454-
}
467+
468+
var value = settingsMerger.GetValueFromXml(settingsElement, property);
469+
Assert.AreEqual(expectedConversion, value);
470+
471+
}
472+
473+
[Test]
474+
public void Should_Throw_For_Unsupported_Conversion()
475+
{
476+
var settingsMerger = new SettingsMerger(new Mock<ILogger>().Object);
477+
var settingsElement = XElement.Parse($"<Root><PropertyType/></Root>");
478+
var unsupported = typeof(PropertyInfo).GetProperty(nameof(PropertyInfo.PropertyType));
479+
var expectedMessage = $"Cannot handle 'PropertyType' yet";
480+
Assert.Throws<Exception>(() => settingsMerger.GetValueFromXml(settingsElement, unsupported), expectedMessage);
455481
}
456482

457483
static object[] XmlConversionCases()
@@ -464,7 +490,7 @@ string CreateElement(string elementName, string value)
464490
var thresholdForCrapScore = nameof(IAppOptions.ThresholdForCrapScore); // int
465491
var coverletConsoleCustomPath = nameof(IAppOptions.CoverletConsoleCustomPath); // string
466492
var exclude = nameof(IAppOptions.Exclude); // string[]
467-
var noConversion = nameof(IAppOptions.RunMsCodeCoverage); // no conversion
493+
var enumConversion = nameof(IAppOptions.RunMsCodeCoverage); // enum conversion
468494
var boolArray = @"
469495
true
470496
false
@@ -500,7 +526,7 @@ string CreateElement(string elementName, string value)
500526
new object[]{ CreateElement(exclude, "true"), hideFullyCovered, null, false},
501527

502528
//exception for no type conversion
503-
new object[]{ CreateElement(noConversion, "No"), noConversion, null, true }
529+
new object[]{ CreateElement(enumConversion, "No"), enumConversion, RunMsCodeCoverage.No, false }
504530

505531
};
506532

SharedProject/Core/Model/SettingsMerger.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,11 @@ internal object GetValueFromXml(XElement settingsElement, PropertyInfo property)
364364
return arr;
365365
}
366366
}
367+
else if (property.PropertyType.IsEnum)
368+
{
369+
return Enum.Parse(property.PropertyType, strValueArr.FirstOrDefault(), true);
370+
371+
}
367372

368373
else
369374
{

0 commit comments

Comments
 (0)