diff --git a/UnitTests/UnitTests.UWP/UI/Controls/Test_RangeSelector.cs b/UnitTests/UnitTests.UWP/UI/Controls/Test_RangeSelector.cs
new file mode 100644
index 00000000000..e7c75cd44f5
--- /dev/null
+++ b/UnitTests/UnitTests.UWP/UI/Controls/Test_RangeSelector.cs
@@ -0,0 +1,196 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.Toolkit.Uwp;
+using Microsoft.Toolkit.Uwp.UI.Controls;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer;
+using System;
+using System.Text.Json;
+using System.Threading.Tasks;
+
+namespace UnitTests.UWP.UI.Controls
+{
+ [TestClass]
+ public class Test_RangeSelector : VisualUITestBase
+ {
+ [TestCategory("Test_RangeSelector")]
+ [TestMethod]
+
+ // If Minimum <= RangeMin and RangeMin <= RangeMax and RangeMax <= Maximum and Minimum != Maximum
+ [DataRow(0, 10, 90, 100)]
+ [DataRow(0, 0, 100, 100)]
+ [DataRow(-100, -90, 90, 100)]
+ [DataRow(-100, -90, -10, 0)]
+ [DataRow(0, 0.2, 0.4, 1)]
+ [DataRow(0, 50, 50, 100)]
+ [DataRow(0, 0, 0, 100)]
+ [DataRow(0, 100, 100, 100)]
+ public async Task Test_ValuesStayTheSame(double min, double rangeMin, double rangeMax, double max)
+ {
+ await App.DispatcherQueue.EnqueueAsync(async () =>
+ {
+ var rangeSelector = MakeRangeSelector(min, rangeMin, rangeMax, max);
+
+ await SetTestContentAsync(rangeSelector);
+
+ // Then Minimum, RangeMin, RangeMax, Maximum should keep the vailues they are set to.
+ Assert.AreEqual(new TestRecord(min, rangeMin, rangeMax, max, rangeSelector.StepFrequency), new TestRecord(rangeSelector));
+ });
+ }
+
+ [TestCategory("Test_RangeSelector")]
+ [TestMethod]
+
+ // If the RangeMin is set to a number larger than Minimum
+ [DataRow(0, -10, 90, 100)]
+ [DataRow(-100, -110, 90, 100)]
+ [DataRow(20, 10, 90, 100)]
+ [DataRow(20, 20, 90, 100)]
+ [DataRow(0.2, 0.1, 0.4, 1)]
+ public async Task Test_RangeMinHitMin(double min, double rangeMin, double rangeMax, double max)
+ {
+ await App.DispatcherQueue.EnqueueAsync(async () =>
+ {
+ var rangeSelector = MakeRangeSelector(min, rangeMin, rangeMax, max);
+
+ await SetTestContentAsync(rangeSelector);
+
+ // Then RangeMin should get the value of Minimum.
+ Assert.AreEqual(new TestRecord(min, min, rangeMax, max, rangeSelector.StepFrequency), new TestRecord(rangeSelector));
+ });
+ }
+
+ [TestCategory("Test_RangeSelector")]
+ [TestMethod]
+
+ // If the RangeMax is set to a number larger than Maximum.
+ [DataRow(0, 10, 110, 100)]
+ [DataRow(-100, -90, 110, 100)]
+ [DataRow(-100, -90, 10, 0)]
+ [DataRow(-100, -90, 10, -10)]
+ [DataRow(-100, -90, 0, -10)]
+ [DataRow(0, 0.1, 1.5, 1.1)]
+ public async Task Test_RangeMaxHitMax(double min, double rangeMin, double rangeMax, double max)
+ {
+ await App.DispatcherQueue.EnqueueAsync(async () =>
+ {
+ var rangeSelector = MakeRangeSelector(min, rangeMin, rangeMax, max);
+
+ await SetTestContentAsync(rangeSelector);
+
+ // Then RangeMax should get the value of Maximum.
+ Assert.AreEqual(new TestRecord(min, rangeMin, max, max, rangeSelector.StepFrequency), new TestRecord(rangeSelector));
+ });
+ }
+
+ [TestCategory("Test_RangeSelector")]
+ [TestMethod]
+
+ // If RangeMin is set to a number larger than the RangeMax.
+ [DataRow(0, 90, 10, 100)]
+ [DataRow(0, 95, 90, 100)]
+ [DataRow(0, 10, 5, 100)]
+ public async Task Test_RangeMinPastRangeMax(double min, double rangeMin, double rangeMax, double max)
+ {
+ await App.DispatcherQueue.EnqueueAsync(async () =>
+ {
+ var rangeSelector = MakeRangeSelector(min, rangeMin, rangeMax, max);
+
+ await SetTestContentAsync(rangeSelector);
+
+ // Then RangeMin should get the value of RangeMax.
+ Assert.AreEqual(new TestRecord(min, rangeMax, rangeMax, max, rangeSelector.StepFrequency), new TestRecord(rangeSelector));
+ });
+ }
+
+ [TestCategory("Test_RangeSelector")]
+ [TestMethod]
+
+ [DataRow(0, 10, 90, 100, 1)]
+ [DataRow(0, 10, 90, 100, 5)]
+ [DataRow(0, 10, 90, 100, 10)]
+ [DataRow(0, 4, 90, 100, 10)]
+ [DataRow(0, 5, 90, 100, 10)]
+ [DataRow(0, 6, 90, 100, 10)]
+ [DataRow(0.5, 0.59, 90, 100, 0.2)]
+ [DataRow(0.5, 0.60, 90, 100, 0.2)]
+ [DataRow(0.5, 0.61, 90, 100, 0.2)]
+ public async Task Test_Step(double min, double rangeMin, double rangeMax, double max, double stepFrequency)
+ {
+ await App.DispatcherQueue.EnqueueAsync(async () =>
+ {
+ var rangeSelector = MakeRangeSelector(min, rangeMin, rangeMax, max, stepFrequency);
+
+ await SetTestContentAsync(rangeSelector);
+
+ var distances = Distance(min, rangeMin);
+ var stepBefore = Math.Floor(distances / stepFrequency);
+ var stepAfter = Math.Ceiling(distances / stepFrequency);
+ var small = min + (stepBefore * stepFrequency);
+ var large = min + (stepAfter * stepFrequency);
+
+ var distanceToSmall = Distance(rangeMin, small);
+ var distanceToLarge = Distance(rangeMin, large);
+
+ var expectedMin = distanceToSmall < distanceToLarge ? small : large;
+
+
+ Assert.AreEqual(new TestRecord(min, expectedMin, rangeMax, max, stepFrequency), new TestRecord(rangeSelector));
+ });
+ }
+
+ private static double Distance(double fst, double snd)
+ => Math.Abs(fst - snd);
+
+ private static RangeSelector MakeRangeSelector(double min, double rangeMin, double rangeMax, double max, double? stepFrequency = null)
+ => stepFrequency is double sf ?
+ new RangeSelector
+ {
+ Minimum = min,
+ RangeMin = rangeMin,
+ RangeMax = rangeMax,
+ Maximum = max,
+ StepFrequency = sf
+ }
+ :
+ new RangeSelector
+ {
+ Minimum = min,
+ RangeMin = rangeMin,
+ RangeMax = rangeMax,
+ Maximum = max
+ };
+
+ private struct TestRecord
+ {
+ public TestRecord(double min, double rangeMin, double rangeMax, double max, double? stepFrequency = null)
+ {
+ Minimum = min;
+ RangeMin = rangeMin;
+ RangeMax = rangeMax;
+ Maximum = max;
+ Stepfrequency = stepFrequency;
+ }
+
+ public TestRecord(RangeSelector rangeSelector)
+ : this(rangeSelector.Minimum, rangeSelector.RangeMin, rangeSelector.RangeMax, rangeSelector.Maximum, rangeSelector.StepFrequency)
+ {
+
+ }
+
+ public double Minimum { get; }
+
+ public double RangeMin { get; }
+
+ public double RangeMax { get; }
+
+ public double Maximum { get; }
+
+ public double? Stepfrequency { get; }
+
+ public override string ToString() => JsonSerializer.Serialize(this);
+ }
+ }
+}
diff --git a/UnitTests/UnitTests.UWP/UnitTests.UWP.csproj b/UnitTests/UnitTests.UWP/UnitTests.UWP.csproj
index eb3c66e4344..6b16fce4f67 100644
--- a/UnitTests/UnitTests.UWP/UnitTests.UWP.csproj
+++ b/UnitTests/UnitTests.UWP/UnitTests.UWP.csproj
@@ -196,6 +196,7 @@
+