Skip to content

Commit 1e9182c

Browse files
V14: Use decimal in slider property editor (#17568)
* Allow SliderPropertyEditor to use decimals * Add tests * Boyscout unittest update --------- Co-authored-by: Sven Geusens <[email protected]>
1 parent 33eb4dd commit 1e9182c

File tree

2 files changed

+27
-33
lines changed

2 files changed

+27
-33
lines changed

src/Umbraco.Infrastructure/PropertyEditors/SliderPropertyEditor.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Umbraco.
22
// See LICENSE for more details.
33

4+
using System.Globalization;
45
using Umbraco.Cms.Core.IO;
56
using Umbraco.Cms.Core.Models;
67
using Umbraco.Cms.Core.Models.Editors;
@@ -51,8 +52,8 @@ public SliderPropertyValueEditor(
5152

5253
public override object? ToEditor(IProperty property, string? culture = null, string? segment = null)
5354
{
54-
// value is stored as a string - either a single integer value
55-
// or a two integer values separated by comma (for range sliders)
55+
// value is stored as a string - either a single decimal value
56+
// or a two decimal values separated by comma (for range sliders)
5657
var value = property.GetValue(culture, segment);
5758
if (value is not string stringValue)
5859
{
@@ -61,7 +62,7 @@ public SliderPropertyValueEditor(
6162

6263
var parts = stringValue.Split(Constants.CharArrays.Comma);
6364
var parsed = parts
64-
.Select(s => int.TryParse(s, out var i) ? i : (int?)null)
65+
.Select(s => decimal.TryParse(s, NumberStyles.Number, CultureInfo.InvariantCulture, out var i) ? i : (decimal?)null)
6566
.Where(i => i != null)
6667
.Select(i => i!.Value)
6768
.ToArray();
@@ -78,11 +79,11 @@ public SliderPropertyValueEditor(
7879

7980
internal class SliderRange
8081
{
81-
public int From { get; set; }
82+
public decimal From { get; set; }
8283

83-
public int To { get; set; }
84+
public decimal To { get; set; }
8485

85-
public override string ToString() => From == To ? $"{From}" : $"{From},{To}";
86+
public override string ToString() => From == To ? $"{From.ToString(CultureInfo.InvariantCulture)}" : $"{From.ToString(CultureInfo.InvariantCulture)},{To.ToString(CultureInfo.InvariantCulture)}";
8687
}
8788
}
8889
}

tests/Umbraco.Tests.UnitTests/Umbraco.Core/PropertyEditors/SliderValueEditorTests.cs

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using Umbraco.Cms.Core.Models;
77
using Umbraco.Cms.Core.Models.Editors;
88
using Umbraco.Cms.Core.PropertyEditors;
9-
using Umbraco.Cms.Core.Services;
109
using Umbraco.Cms.Core.Strings;
1110
using Umbraco.Cms.Infrastructure.Serialization;
1211

@@ -15,19 +14,11 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.PropertyEditors;
1514
[TestFixture]
1615
public class SliderValueEditorTests
1716
{
18-
// annoyingly we can't use decimals etc. in attributes, so we can't turn these into test cases :(
19-
private List<object?> _invalidValues = new();
20-
21-
[SetUp]
22-
public void SetUp() => _invalidValues = new List<object?>
17+
public static object[] InvalidCaseData = new object[]
2318
{
2419
123m,
2520
123,
2621
-123,
27-
123.45d,
28-
"123.45",
29-
"1.234,56",
30-
"1.2.3.4",
3122
"something",
3223
true,
3324
new object(),
@@ -36,21 +27,19 @@ public class SliderValueEditorTests
3627
new GuidUdi(Constants.UdiEntityType.Document, Guid.NewGuid())
3728
};
3829

39-
[Test]
40-
public void Can_Handle_Invalid_Values_From_Editor()
30+
[TestCaseSource(nameof(InvalidCaseData))]
31+
public void Can_Handle_Invalid_Values_From_Editor(object value)
4132
{
42-
foreach (var value in _invalidValues)
43-
{
44-
var fromEditor = FromEditor(value);
45-
Assert.IsNull(fromEditor, message: $"Failed for: {value}");
46-
}
33+
var fromEditor = FromEditor(value);
34+
Assert.IsNull(fromEditor);
4735
}
4836

4937
[TestCase("1", 1)]
5038
[TestCase("0", 0)]
5139
[TestCase("-1", -1)]
5240
[TestCase("123456789", 123456789)]
53-
public void Can_Parse_Single_Value_To_Editor(string value, int expected)
41+
[TestCase("123.45", 123.45)]
42+
public void Can_Parse_Single_Value_To_Editor(string value, decimal expected)
5443
{
5544
var toEditor = ToEditor(value) as SliderPropertyEditor.SliderPropertyValueEditor.SliderRange;
5645
Assert.IsNotNull(toEditor);
@@ -62,7 +51,10 @@ public void Can_Parse_Single_Value_To_Editor(string value, int expected)
6251
[TestCase("0,0", 0, 0)]
6352
[TestCase("-1,-1", -1, -1)]
6453
[TestCase("10,123456789", 10, 123456789)]
65-
public void Can_Parse_Range_Value_To_Editor(string value, int expectedFrom, int expectedTo)
54+
[TestCase("1.234,56", 1.234, 56)]
55+
[TestCase("4,6.234", 4, 6.234)]
56+
[TestCase("10.45,15.3", 10.45, 15.3)]
57+
public void Can_Parse_Range_Value_To_Editor(string value, decimal expectedFrom, decimal expectedTo)
6658
{
6759
var toEditor = ToEditor(value) as SliderPropertyEditor.SliderPropertyValueEditor.SliderRange;
6860
Assert.IsNotNull(toEditor);
@@ -75,21 +67,22 @@ public void Can_Parse_Range_Value_To_Editor(string value, int expectedFrom, int
7567
[TestCase(0, 0, "0")]
7668
[TestCase(-10, -10, "-10")]
7769
[TestCase(10, 123456789, "10,123456789")]
78-
public void Can_Parse_Valid_Value_From_Editor(int from, int to, string expectedResult)
70+
[TestCase(1.5, 1.5, "1.5")]
71+
[TestCase(0, 0.5, "0,0.5")]
72+
[TestCase(5, 5.4, "5,5.4")]
73+
[TestCase(0.5, 0.6, "0.5,0.6")]
74+
public void Can_Parse_Valid_Value_From_Editor(decimal from, decimal to, string expectedResult)
7975
{
8076
var value = JsonNode.Parse($"{{\"from\": {from}, \"to\": {to}}}");
8177
var fromEditor = FromEditor(value) as string;
8278
Assert.AreEqual(expectedResult, fromEditor);
8379
}
8480

85-
[Test]
86-
public void Can_Handle_Invalid_Values_To_Editor()
81+
[TestCaseSource(nameof(InvalidCaseData))]
82+
public void Can_Handle_Invalid_Values_To_Editor(object value)
8783
{
88-
foreach (var value in _invalidValues)
89-
{
90-
var toEditor = ToEditor(value);
91-
Assert.IsNull(toEditor, message: $"Failed for: {value}");
92-
}
84+
var toEditor = ToEditor(value);
85+
Assert.IsNull(toEditor, message: $"Failed for: {value}");
9386
}
9487

9588
[Test]

0 commit comments

Comments
 (0)