fix: preserve legacy settings decimal semantics
This commit is contained in:
@@ -37,7 +37,7 @@ public sealed record ProductionSettingsContract(
|
|||||||
var setLayer = root.Element("SetLayer")?.Attribute("name")?.Value;
|
var setLayer = root.Element("SetLayer")?.Attribute("name")?.Value;
|
||||||
if (string.IsNullOrWhiteSpace(setLayer)) throw Invalid("SetLayer.name");
|
if (string.IsNullOrWhiteSpace(setLayer)) throw Invalid("SetLayer.name");
|
||||||
var plusLength = root.Element("PlusLengthNO")?.Attribute("value")?.Value;
|
var plusLength = root.Element("PlusLengthNO")?.Attribute("value")?.Value;
|
||||||
double? parsedPlusLength = double.TryParse(plusLength, NumberStyles.Float, CultureInfo.InvariantCulture, out var plus) ? plus : null;
|
double? parsedPlusLength = TryParseLegacyNumber(plusLength, out var plus) ? plus : null;
|
||||||
return new(
|
return new(
|
||||||
copy,
|
copy,
|
||||||
layers,
|
layers,
|
||||||
@@ -55,6 +55,11 @@ public sealed record ProductionSettingsContract(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static int? ParseInt(XElement value, string name) => int.TryParse(value.Attribute(name)?.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
|
private static int? ParseInt(XElement value, string name) => int.TryParse(value.Attribute(name)?.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
|
||||||
|
private static bool TryParseLegacyNumber(string? value, out double parsed)
|
||||||
|
{
|
||||||
|
if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out parsed)) return true;
|
||||||
|
return double.TryParse(value?.Replace(',', '.'), NumberStyles.Float, CultureInfo.InvariantCulture, out parsed);
|
||||||
|
}
|
||||||
private static string Required(XElement? value, string name, bool allowEmpty = false) => value?.Attribute(name) is { Value: var result } && (allowEmpty || !string.IsNullOrWhiteSpace(result)) ? result : throw Invalid(name);
|
private static string Required(XElement? value, string name, bool allowEmpty = false) => value?.Attribute(name) is { Value: var result } && (allowEmpty || !string.IsNullOrWhiteSpace(result)) ? result : throw Invalid(name);
|
||||||
private static InvalidDataException Invalid(string field) => new("PRODUCTION_SETTINGS_INVALID:" + field);
|
private static InvalidDataException Invalid(string field) => new("PRODUCTION_SETTINGS_INVALID:" + field);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,4 +35,12 @@ public sealed class ProductionSettingsContractTests
|
|||||||
var exception = Assert.Throws<InvalidDataException>(() => ProductionSettingsContract.Parse(xml));
|
var exception = Assert.Throws<InvalidDataException>(() => ProductionSettingsContract.Parse(xml));
|
||||||
Assert.Equal("PRODUCTION_SETTINGS_INVALID:layer", exception.Message);
|
Assert.Equal("PRODUCTION_SETTINGS_INVALID:layer", exception.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParsesLegacyCommaDecimalPlusLength()
|
||||||
|
{
|
||||||
|
const string xml = "<Main><CopyMissingObjects/><LayersSetup/><Annotations layer='TEXT' textstyle='GOSTC' multileaderstyle='PXP'/><LinenumberConnections polylinelayer='AXIS' textlayer='TEXT' textstyle='GOSTC'/><Elevations layer='THIN' textstyle='GOSTC'/><SetLayer name='AXIS'/><PlusLengthNO value='1,5'/></Main>";
|
||||||
|
var result = ProductionSettingsContract.Parse(xml);
|
||||||
|
Assert.Equal(1.5, result.FixedSupportPlusLength);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user