diff --git a/Microsoft.Toolkit.Uwp.UI/Converters/TaskResultConverter.cs b/Microsoft.Toolkit.Uwp.UI/Converters/TaskResultConverter.cs
index 373e1768ad5..f381f5d4f1c 100644
--- a/Microsoft.Toolkit.Uwp.UI/Converters/TaskResultConverter.cs
+++ b/Microsoft.Toolkit.Uwp.UI/Converters/TaskResultConverter.cs
@@ -14,8 +14,8 @@ namespace Microsoft.Toolkit.Uwp.UI.Converters
/// This is needed because accessing when the task has not
/// completed yet will block the current thread and might cause a deadlock (eg. if the task was
/// scheduled on the same synchronization context where the result is being retrieved from).
- /// The methods in this converter will safely return if the input
- /// task is still running, or if it has faulted or has been canceled.
+ /// The methods in this converter will safely return if the input
+ /// task is not set yet, still running, has faulted, or has been canceled.
///
public sealed class TaskResultConverter : IValueConverter
{
@@ -26,8 +26,13 @@ public object Convert(object value, Type targetType, object parameter, string la
{
return task.GetResultOrDefault();
}
+ else if (value is null)
+ {
+ return null;
+ }
- return DependencyProperty.UnsetValue;
+ // Otherwise, we'll just pass through whatever value/result was given to us.
+ return value;
}
///
diff --git a/UnitTests/UnitTests.UWP/Converters/Test_TaskResultConverter.cs b/UnitTests/UnitTests.UWP/Converters/Test_TaskResultConverter.cs
index 3c615928ac5..de34f0c1d7a 100644
--- a/UnitTests/UnitTests.UWP/Converters/Test_TaskResultConverter.cs
+++ b/UnitTests/UnitTests.UWP/Converters/Test_TaskResultConverter.cs
@@ -17,89 +17,110 @@ public class Test_TaskResultConverter
{
[TestCategory("Converters")]
[UITestMethod]
+ [Ignore] // Ignore this value type test. Behavior will return null currently and not default.
public void Test_TaskResultConverter_Instance_Int32()
{
- var converter = new TaskResultConverter();
+ TaskResultConverter converter = new();
- TaskCompletionSource tcs = new TaskCompletionSource();
+ TaskCompletionSource tcs = new();
- Assert.AreEqual(null, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(0, (int)converter.Convert(tcs.Task, typeof(int), null, null));
tcs.SetCanceled();
- Assert.AreEqual(null, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(0, (int)converter.Convert(tcs.Task, typeof(int), null, null));
tcs = new TaskCompletionSource();
tcs.SetException(new InvalidOperationException("Test"));
- Assert.AreEqual(null, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(0, (int)converter.Convert(tcs.Task, typeof(int), null, null));
tcs = new TaskCompletionSource();
tcs.SetResult(42);
- Assert.AreEqual(42, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(42, (int)converter.Convert(tcs.Task, typeof(int), null, null));
}
[TestCategory("Converters")]
[UITestMethod]
public void Test_TaskResultConverter_Instance_String()
{
- var converter = new TaskResultConverter();
+ TaskResultConverter converter = new();
- TaskCompletionSource tcs = new TaskCompletionSource();
+ TaskCompletionSource tcs = new();
- Assert.AreEqual(null, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(null, (string)converter.Convert(tcs.Task, typeof(string), null, null));
tcs.SetCanceled();
- Assert.AreEqual(null, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(null, (string)converter.Convert(tcs.Task, typeof(string), null, null));
- tcs = new TaskCompletionSource();
+ tcs = new();
tcs.SetException(new InvalidOperationException("Test"));
- Assert.AreEqual(null, converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual(null, (string)converter.Convert(tcs.Task, typeof(string), null, null));
- tcs = new TaskCompletionSource();
+ tcs = new();
tcs.SetResult("Hello world");
- Assert.AreEqual("Hello world", converter.Convert(tcs.Task, null, null, null));
+ Assert.AreEqual("Hello world", (string)converter.Convert(tcs.Task, typeof(string), null, null));
}
[TestCategory("Converters")]
[UITestMethod]
- public void Test_TaskResultConverter_Instance_UnsetValue()
+ public void Test_TaskResultConverter_Instance_RawValue()
{
- var converter = new TaskResultConverter();
+ TaskResultConverter converter = new();
- Assert.AreEqual(DependencyProperty.UnsetValue, converter.Convert(null, null, null, null));
- Assert.AreEqual(DependencyProperty.UnsetValue, converter.Convert("Hello world", null, null, null));
+ Assert.AreEqual(42, converter.Convert(42, null, null, null));
+
+ Assert.AreEqual(42, converter.Convert(42, typeof(int), null, null));
+
+ Assert.AreEqual("Hello world", converter.Convert("Hello world", null, null, null));
+
+ Assert.AreEqual("Hello world", converter.Convert("Hello world", typeof(string), null, null));
}
[TestCategory("Converters")]
[UITestMethod]
- public void Test_TaskResultConverter_Instance_Null()
+ public void Test_TaskResultConverter_Instance_NullObject()
{
- var converter = new TaskResultConverter();
+ TaskResultConverter converter = new();
- var cts = new CancellationTokenSource();
+ Assert.AreEqual(null, converter.Convert(null, null, null, null));
- cts.Cancel();
+ // TODO: Think there may still be a problem for value types in x:Bind expressions, represented by these tests here,
+ // but was going to be too big a change for 7.1.3, will have to get more feedback and evaluate later.
+ /*Assert.AreEqual(0, (int)converter.Convert(null, typeof(int), null, null));
- Assert.AreEqual(null, converter.Convert(Task.FromCanceled(cts.Token), null, null, null));
- Assert.AreEqual(null, converter.Convert(Task.FromException(new Exception()), null, null, null));
- Assert.AreEqual(null, converter.Convert(Task.CompletedTask, null, null, null));
+ Assert.AreEqual(false, (bool)converter.Convert(null, typeof(bool), null, null));*/
- TaskCompletionSource tcs1 = new TaskCompletionSource();
+ Assert.AreEqual(null, converter.Convert(null, typeof(int), null, null));
- Assert.AreEqual(null, converter.Convert(tcs1.Task, null, null, null));
+ Assert.AreEqual(null, converter.Convert(null, typeof(bool), null, null));
- TaskCompletionSource tcs2 = new TaskCompletionSource();
+ Assert.AreEqual(null, (int?)converter.Convert(null, typeof(int?), null, null));
- Assert.AreEqual(null, converter.Convert(tcs2.Task, null, null, null));
+ Assert.AreEqual(null, (string)converter.Convert(null, typeof(string), null, null));
+ }
+
+ [TestCategory("Converters")]
+ [UITestMethod]
+ public void Test_TaskResultConverter_Instance_TaskNull()
+ {
+ TaskResultConverter converter = new();
+
+ CancellationTokenSource cts = new();
+
+ cts.Cancel();
+
+ Assert.AreEqual(null, converter.Convert(Task.FromCanceled(cts.Token), null, null, null));
+ Assert.AreEqual(null, converter.Convert(Task.FromException(new Exception()), null, null, null));
+ Assert.AreEqual(null, converter.Convert(Task.CompletedTask, null, null, null));
}
[TestCategory("Converters")]
@@ -107,7 +128,7 @@ public void Test_TaskResultConverter_Instance_Null()
[ExpectedException(typeof(NotImplementedException))]
public void Test_TaskResultConverter_Instance_ConvertBack()
{
- var converter = new TaskResultConverter();
+ TaskResultConverter converter = new();
Assert.AreEqual(null, converter.ConvertBack(null, null, null, null));
}