Skip to content

Commit ed80153

Browse files
committed
make reading settings more robust
1 parent d9f4383 commit ed80153

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

src/IxMilia.BCad.Core.Test/SettingsTests.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Xunit;
1+
using System;
2+
using Xunit;
23

34
namespace IxMilia.BCad.Core.Test
45
{
@@ -122,5 +123,28 @@ public void SetValueFromString()
122123
var finalCursorSize = Workspace.SettingsService.GetValue<int>("Display.CursorSize");
123124
Assert.Equal(4242, finalCursorSize);
124125
}
126+
127+
[Theory]
128+
[InlineData(typeof(bool), "TRUE", "True")] // boolean - valid
129+
[InlineData(typeof(bool), "indeed", "False")] // boolean - invalid
130+
[InlineData(typeof(int), "42", "42")] // int - valid
131+
[InlineData(typeof(int), "not-an-int", "0")] // int - invalid
132+
[InlineData(typeof(double), "3.5", "3.5")] // double - valid
133+
[InlineData(typeof(double), "not-a-double", "0")] // double - invalid
134+
[InlineData(typeof(string), "a string value", "a string value")] // string - valid
135+
[InlineData(typeof(CadColor), "#FF2F2F2F", "#FF2F2F2F")] // CadColor - valid
136+
[InlineData(typeof(CadColor), "a-beautiful-color", "#00000000")] // CadColor - invalid
137+
[InlineData(typeof(DrawingUnits), "Metric", "Metric")] // DrawingUnits - valid
138+
[InlineData(typeof(DrawingUnits), "2", "English")] // DrawingUnits - invalid
139+
[InlineData(typeof(UnitFormat), "Decimal", "Decimal")] // UnitFormat - valid
140+
[InlineData(typeof(UnitFormat), "not-a-unit-format", "Architectural")] // UnitFormat - invalid
141+
[InlineData(typeof(double[]), "0;90;180;270", "0;90;180;270")] // double[] - valid
142+
[InlineData(typeof(double[]), "not-an-array", "0")] // double[] - invalid
143+
public void SetInvalidValueFromStringSetsReasonableDefault(Type valueType, string originalValue, string expectedString)
144+
{
145+
var parsedValue = Workspace.SettingsService.StringToValue(valueType, originalValue);
146+
var actualString = Workspace.SettingsService.ValueToString(valueType, parsedValue);
147+
Assert.Equal(expectedString, actualString);
148+
}
125149
}
126150
}

src/IxMilia.BCad.Core/Services/ISettingsService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface ISettingsService : IWorkspaceService
1515

1616
T GetValue<T>(string settingName);
1717
void SetValue<T>(string settingName, T value);
18-
void SetValueFromString(string settinggName, string value);
18+
void SetValueFromString(string settingName, string value);
1919

2020
void LoadFromLines(string[] lines);
2121
string WriteWithLines(string[] existingLines);

src/IxMilia.BCad.Core/Services/SettingsService.cs

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -166,27 +166,67 @@ public SettingData(string name, Type type, object value)
166166
}
167167
}
168168

169-
private static object BoolReader(string value) => bool.Parse(value);
169+
private static object BoolReader(string value)
170+
{
171+
if (bool.TryParse(value, out var result))
172+
{
173+
return result;
174+
}
175+
176+
return default(bool);
177+
}
178+
170179
private static string BoolWriter(object value) => ((bool)value).ToString(CultureInfo.InvariantCulture);
171180

172181
private static object CadColorReader(string value) => CadColor.Parse(value);
173182
private static string CadColorWriter(object value) => ((CadColor)value).ToString();
174183

175-
private static object DoubleReader(string value) => double.Parse(value, CultureInfo.InvariantCulture);
184+
private static object DoubleReader(string value)
185+
{
186+
if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var result))
187+
{
188+
return result;
189+
}
190+
191+
return default(double);
192+
}
193+
176194
private static string DoubleWriter(object value) => ((double)value).ToString(CultureInfo.InvariantCulture);
177195

178-
private static object DrawingUnitsReader(string value) => Enum.Parse(typeof(DrawingUnits), value);
196+
private static object DrawingUnitsReader(string value) => EnumReader<DrawingUnits>(value);
179197
private static string DrawingUnitsWriter(object value) => ((DrawingUnits)value).ToString();
180198

181-
private static object IntReader(string value) => int.Parse(value, CultureInfo.InvariantCulture);
199+
private static object IntReader(string value)
200+
{
201+
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result))
202+
{
203+
return result;
204+
}
205+
206+
return default(int);
207+
}
208+
182209
private static string IntWriter(object value) => ((int)value).ToString(CultureInfo.InvariantCulture);
183210

184211
private static object StringReader(string value) => value;
185212
private static string StringWriter(object value) => value.ToString();
186213

187-
private static object UnitFormatReader(string value) => Enum.Parse(typeof(UnitFormat), value);
214+
private static object UnitFormatReader(string value) => EnumReader<UnitFormat>(value);
188215
private static string UnitFormatWriter(object value) => ((UnitFormat)value).ToString();
189216

217+
private static object EnumReader<T>(string value) where T : struct
218+
{
219+
if (Enum.TryParse<T>(value, out var result))
220+
{
221+
if (Enum.IsDefined(typeof(T), result))
222+
{
223+
return result;
224+
}
225+
}
226+
227+
return default(T);
228+
}
229+
190230
private static ValueReader CreateArrayReader<T>(Func<string, object> elementReader) => value => value.Split(';').Select(elementReader).Cast<T>().ToArray();
191231
private static ValueWriter CreateArrayWriter(Func<object, string> elementWriter)
192232
{

0 commit comments

Comments
 (0)