diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/MaxLengthReachedBehavior_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/MaxLengthReachedBehavior_Tests.cs index 0760c3011..721f4427c 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/MaxLengthReachedBehavior_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/MaxLengthReachedBehavior_Tests.cs @@ -144,8 +144,8 @@ public void ShouldNotDismissKeyboardWhenOptionSetToFalse() Entry CreateEntry(int? maxLength = 2, bool shouldDismissKeyboardAutomatically = false, - ICommand command = null, - EventHandler eventHandler = null) + ICommand? command = null, + EventHandler? eventHandler = null) { var behavior = new MaxLengthReachedBehavior { diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/UserStoppedTypingBehavior_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/UserStoppedTypingBehavior_Tests.cs index b69fdc3eb..b8ddc0563 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/UserStoppedTypingBehavior_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Behaviors/UserStoppedTypingBehavior_Tests.cs @@ -160,8 +160,8 @@ public async Task ShouldExecuteCommandImmediatelyWhenMinimumLengthThreholdHasNot public Entry CreateEntryWithBehavior(int timeThreshold = defaultTimeThreshold, int lengthThreshold = defaultLengthThreshold, bool shouldDismissKeyboardAutomatically = false, - ICommand command = null, - object commandParameter = null) + ICommand? command = null, + object? commandParameter = null) { var entry = new Entry { diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/DoubleToIntConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/DoubleToIntConverter_Tests.cs index abd7560e3..4462a3cea 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/DoubleToIntConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/DoubleToIntConverter_Tests.cs @@ -12,7 +12,7 @@ public class DoubleToIntConverter_Tests [InlineData(2.55, 3)] [InlineData(2.555, 3)] [InlineData(2.555, 652, 255)] - public void DoubleToIntConverter(double value, int expectedResult, object ratio = null) + public void DoubleToIntConverter(double value, int expectedResult, object? ratio = null) { var doubleToIntConverter = new DoubleToIntConverter(); @@ -23,7 +23,7 @@ public void DoubleToIntConverter(double value, int expectedResult, object ratio [Theory] [InlineData(2, 2)] - public void DoubleToIntConverterBack(int value, double expectedResult, object ratio = null) + public void DoubleToIntConverterBack(int value, double expectedResult, object? ratio = null) { var doubleToIntConverter = new DoubleToIntConverter(); diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/EnumToBoolConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/EnumToBoolConverter_Tests.cs old mode 100755 new mode 100644 index b61063c29..75493eca2 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/EnumToBoolConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/EnumToBoolConverter_Tests.cs @@ -80,68 +80,68 @@ public void EnumToBoolConvert_Validation(object[] trueValues, object value, obje Assert.Equal(expectedResult, result); } - public static IEnumerable ConvertTestData() + public static IEnumerable ConvertTestData() { // Simple enum - yield return new object[] + yield return new object?[] { null, TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Five, true }; - yield return new object[] + yield return new object?[] { null, TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six, false }; - yield return new object[] + yield return new object?[] { - new object[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six, true + new object?[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six, true }; - yield return new object[] + yield return new object?[] { - new object[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.Six, null, true + new object?[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.Six, null, true }; - yield return new object[] + yield return new object?[] { - new object[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.One, TestEnumForEnumToBoolConverter.Five, false + new object?[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.One, TestEnumForEnumToBoolConverter.Five, false }; - yield return new object[] + yield return new object?[] { - new object[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.Two, null, false + new object?[] { TestEnumForEnumToBoolConverter.Five, TestEnumForEnumToBoolConverter.Six }, TestEnumForEnumToBoolConverter.Two, null, false }; // Flagged enum - yield return new object[] + yield return new object?[] { - new object[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.One, null, true + new object?[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.One, null, true }; - yield return new object[] + yield return new object?[] { - new object[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.Two, null, true + new object?[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.Two, null, true }; - yield return new object[] + yield return new object?[] { - new object[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.Three, null, true + new object?[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.Three, null, true }; - yield return new object[] + yield return new object?[] { - new object[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.Four, null, false + new object?[] { (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), TestFlaggedEnumForEnumToBoolConverter.Two }, TestFlaggedEnumForEnumToBoolConverter.Four, null, false }; - yield return new object[] + yield return new object?[] { null, TestFlaggedEnumForEnumToBoolConverter.One, (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), true }; - yield return new object[] + yield return new object?[] { null, TestFlaggedEnumForEnumToBoolConverter.Three, (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), true }; - yield return new object[] + yield return new object?[] { null, TestFlaggedEnumForEnumToBoolConverter.Two, (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), false }; - yield return new object[] + yield return new object?[] { null, (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), true }; - yield return new object[] + yield return new object?[] { null, (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Two | TestFlaggedEnumForEnumToBoolConverter.Three), (TestFlaggedEnumForEnumToBoolConverter.One | TestFlaggedEnumForEnumToBoolConverter.Three), false }; diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemSelectedEventArgsConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemSelectedEventArgsConverter_Tests.cs index c2e5d9cde..2c34f9750 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemSelectedEventArgsConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemSelectedEventArgsConverter_Tests.cs @@ -9,14 +9,16 @@ namespace Xamarin.CommunityToolkit.UnitTests.Converters { public class ItemSelectedEventArgsConverter_Tests { - static object expectedValue = 100; + static readonly object expectedValue = 100; public static IEnumerable GetData() => new List { // We know it's deprecated, still good to test it #pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. new object[] { new SelectedItemChangedEventArgs(expectedValue), expectedValue }, - new object[] { null, null }, + new object?[] { null, null }, +#pragma warning restore CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. #pragma warning restore CS0618 // Type or member is obsolete }; diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemTappedEventArgsConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemTappedEventArgsConverter_Tests.cs index 2d825deff..8530f1d7e 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemTappedEventArgsConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ItemTappedEventArgsConverter_Tests.cs @@ -15,8 +15,10 @@ public class ItemTappedEventArgsConverter_Tests { // We know it's deprecated, still good to test it #pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. new object[] { new ItemTappedEventArgs(null, expectedValue), expectedValue }, new object[] { new ItemTappedEventArgs(null, null), null }, +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. #pragma warning restore CS0618 // Type or member is obsolete }; diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNotNullOrEmptyConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNotNullOrEmptyConverter_Tests.cs index 0046c4b58..382e4a215 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNotNullOrEmptyConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNotNullOrEmptyConverter_Tests.cs @@ -9,16 +9,13 @@ namespace Xamarin.CommunityToolkit.UnitTests.Converters { public class ListIsNotNullOrEmptyConverter_Tests { - public static IEnumerable GetData() + public static IEnumerable GetData() => new List { - return new List - { - new object[] { new List(), false}, - new object[] { new List() { "TestValue"}, true}, - new object[] { null, false}, - new object[] { Enumerable.Range(1, 3), true}, - }; - } + new object[] { new List(), false}, + new object[] { new List() { "TestValue"}, true}, + new object?[] { null, false}, + new object[] { Enumerable.Range(1, 3), true}, + }; [Theory] [MemberData(nameof(GetData))] diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNullOrEmptyConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNullOrEmptyConverter_Tests.cs index d34243e70..9d30e45ad 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNullOrEmptyConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListIsNullOrEmptyConverter_Tests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -9,16 +9,13 @@ namespace Xamarin.CommunityToolkit.UnitTests.Converters { public class ListIsNullOrEmptyConverter_Tests { - public static IEnumerable GetData() - { - return new List + public static IEnumerable GetData() => new List { new object[] { new List(), true}, - new object[] { new List() { "TestValue"}, false}, - new object[] { null, true}, - new object[] { Enumerable.Range(1, 3), false}, + new object[] { new List() { "TestValue" }, false}, + new object?[] { null, true }, + new object[] { Enumerable.Range(1, 3), false }, }; - } [Theory] [MemberData(nameof(GetData))] diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListToStringConverter_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListToStringConverter_Tests.cs index dcd12e13a..6580d9f35 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListToStringConverter_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Converters/ListToStringConverter_Tests.cs @@ -7,17 +7,16 @@ namespace Xamarin.CommunityToolkit.UnitTests.Converters { public class ListToStringConverter_Tests { - public static IEnumerable GetData() - => new List - { - new object[] { new string[] { "A", "B", "C" }, "+_+", "A+_+B+_+C" }, - new object[] { new string[] { "A", string.Empty, "C" }, ",", "A,C" }, - new object[] { new string[] { "A", null, "C" }, ",", "A,C" }, - new object[] { new string[] { "A" }, ":-:", "A" }, - new object[] { new string[] { }, ",", string.Empty }, - new object[] { null, ",", string.Empty }, - new object[] { new string[] { "A", "B", "C" }, null, "ABC" }, - }; + public static IEnumerable GetData() => new List + { + new object[] { new string[] { "A", "B", "C" }, "+_+", "A+_+B+_+C" }, + new object[] { new string[] { "A", string.Empty, "C" }, ",", "A,C" }, + new object?[] { new string?[] { "A", null, "C" }, ",", "A,C" }, + new object[] { new string[] { "A" }, ":-:", "A" }, + new object[] { new string[] { }, ",", string.Empty }, + new object?[] { null, ",", string.Empty }, + new object?[] { new string[] { "A", "B", "C" }, null, "ABC" }, + }; [Theory] [MemberData(nameof(GetData))] diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/EnableInitOnlyProperties.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/EnableInitOnlyProperties.cs new file mode 100644 index 000000000..f3a7fee73 --- /dev/null +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/EnableInitOnlyProperties.cs @@ -0,0 +1,4 @@ +namespace System.Runtime.CompilerServices +{ + public record IsExternalInit; +} diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizationResourceManagerTests/LocalizationResourceManagerTests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizationResourceManagerTests/LocalizationResourceManagerTests.cs index 6a669f5fd..950c5330d 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizationResourceManagerTests/LocalizationResourceManagerTests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizationResourceManagerTests/LocalizationResourceManagerTests.cs @@ -48,7 +48,7 @@ public void LocalizationResourceManager_PropertyChanged_Triggered() // Arrange var culture2 = new CultureInfo("en"); localizationManager.CurrentCulture = culture2; - CultureInfo changedCulture = null; + CultureInfo? changedCulture = null; localizationManager.PropertyChanged += (s, e) => changedCulture = localizationManager.CurrentCulture; // Act, Assert diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizedStringTests/LocalizedStringTests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizedStringTests/LocalizedStringTests.cs index df6043244..ee903096f 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizedStringTests/LocalizedStringTests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/LocalizedStringTests/LocalizedStringTests.cs @@ -20,7 +20,7 @@ public LocalizedStringTests() readonly CultureInfo initialCulture = CultureInfo.InvariantCulture; readonly ResourceManager resourceManager; - LocalizedString localizedString; + LocalizedString? localizedString; [Fact] public void LocalizedStringTests_Localized_ValidImplementation() @@ -30,7 +30,7 @@ public void LocalizedStringTests_Localized_ValidImplementation() var culture2 = new CultureInfo("en"); localizedString = new LocalizedString(localizationManager, () => localizationManager[testString]); - string responceOnCultureChanged = null; + string? responceOnCultureChanged = null; localizedString.PropertyChanged += (sender, args) => responceOnCultureChanged = localizedString.Localized; // Act diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_ActionT_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_ActionT_Tests.cs index ddc61c429..d03445aaa 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_ActionT_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_ActionT_Tests.cs @@ -135,14 +135,12 @@ void HandleDelegateTest(string message) public void WeakEventManagerActionT_AddEventHandler_NullHandler() { // Arrange - Action nullAction = null; + Action? nullAction = null; // Act // Assert -#pragma warning disable CS8604 //Possible null reference argument for parameter Assert.Throws(() => actionEventManager.AddEventHandler(nullAction, nameof(ActionEvent))); -#pragma warning restore CS8604 //Possible null reference argument for parameter } @@ -154,23 +152,19 @@ public void WeakEventManagerActionT_AddEventHandler_NullEventName() // Act // Assert -#pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type Assert.Throws(() => actionEventManager.AddEventHandler(s => { var temp = s; }, null)); -#pragma warning restore CS8625 } [Fact] public void WeakEventManagerActionT_AddEventHandler_EmptyEventName() { // Arrange - Action nullAction = null; + Action? nullAction = null; // Act // Assert -#pragma warning disable CS8604 //Possible null reference argument for parameter Assert.Throws(() => actionEventManager.AddEventHandler(nullAction, string.Empty)); -#pragma warning restore CS8604 //Possible null reference argument for parameter } [Fact] @@ -181,23 +175,19 @@ public void WeakEventManagerActionT_AddEventHandler_WhitespaceEventName() // Act // Assert -#pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type Assert.Throws(() => actionEventManager.AddEventHandler(s => { var temp = s; }, " ")); -#pragma warning restore CS8625 } [Fact] public void WeakEventManagerActionT_RemoveEventHandler_NullHandler() { // Arrange - Action nullAction = null; + Action? nullAction = null; // Act // Assert -#pragma warning disable CS8604 //Possible null reference argument for parameter Assert.Throws(() => actionEventManager.RemoveEventHandler(nullAction)); -#pragma warning restore CS8604 } [Fact] @@ -208,9 +198,7 @@ public void WeakEventManagerActionT_RemoveEventHandler_NullEventName() // Act // Assert -#pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type Assert.Throws(() => actionEventManager.RemoveEventHandler(s => { var temp = s; }, null)); -#pragma warning restore CS8625 } [Fact] @@ -221,9 +209,7 @@ public void WeakEventManagerActionT_RemoveEventHandler_EmptyEventName() // Act // Assert -#pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type Assert.Throws(() => actionEventManager.RemoveEventHandler(s => { var temp = s; }, string.Empty)); -#pragma warning restore CS8625 } [Fact] @@ -234,9 +220,7 @@ public void WeakEventManagerActionT_RemoveEventHandler_WhiteSpaceEventName() // Act // Assert -#pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type Assert.Throws(() => actionEventManager.RemoveEventHandler(s => { var temp = s; }, " ")); -#pragma warning restore CS8625 } } } \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_EventHandlerT_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_EventHandlerT_Tests.cs index 8d5190f7f..0247f9962 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_EventHandlerT_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Helpers/WeakEventManagerTests/WeakEventManager_EventHandlerT_Tests.cs @@ -17,7 +17,7 @@ public void WeakEventManagerTEventArgs_HandleEvent_ValidImplementation() const string stringEventArg = "Test"; var didEventFire = false; - void HandleTestEvent(object sender, string? e) + void HandleTestEvent(object? sender, string? e) { if (sender == null || e == null) throw new ArgumentNullException(nameof(sender)); @@ -49,7 +49,7 @@ public void WeakEventManageTEventArgs_HandleEvent_NullSender() var didEventFire = false; - void HandleTestEvent(object sender, string e) + void HandleTestEvent(object? sender, string e) { Assert.Null(sender); @@ -74,7 +74,7 @@ public void WeakEventManagerTEventArgs_HandleEvent_NullEventArgs() TestStringEvent += HandleTestEvent; var didEventFire = false; - void HandleTestEvent(object sender, string e) + void HandleTestEvent(object? sender, string e) { if (sender == null) throw new ArgumentNullException(nameof(sender)); @@ -105,7 +105,7 @@ public void WeakEventManagerTEventArgs_HandleEvent_InvalidHandleEvent() var didEventFire = false; - void HandleTestEvent(object sender, string e) => didEventFire = true; + void HandleTestEvent(object? sender, string e) => didEventFire = true; // Act TestStringWeakEventManager.RaiseEvent(this, "Test", nameof(TestEvent)); @@ -119,13 +119,13 @@ public void WeakEventManagerTEventArgs_HandleEvent_InvalidHandleEvent() public void WeakEventManager_NullEventManager() { // Arrange - WeakEventManager unassignedEventManager = null; + WeakEventManager? unassignedEventManager = null; // Act // Assert #pragma warning disable CS8602 //Dereference of a possible null reference - Assert.Throws(() => unassignedEventManager.RaiseEvent(null, null, nameof(TestEvent))); + Assert.Throws(() => unassignedEventManager.RaiseEvent(null, string.Empty, nameof(TestEvent))); #pragma warning restore CS8602 } @@ -137,7 +137,7 @@ public void WeakEventManagerTEventArgs_UnassignedEventManager() var didEventFire = false; TestStringEvent += HandleTestEvent; - void HandleTestEvent(object sender, string e) => didEventFire = true; + void HandleTestEvent(object? sender, string e) => didEventFire = true; // Act #pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type @@ -157,7 +157,7 @@ public void WeakEventManagerTEventArgs_UnassignedEvent() TestStringEvent += HandleTestEvent; TestStringEvent -= HandleTestEvent; - void HandleTestEvent(object sender, string e) => didEventFire = true; + void HandleTestEvent(object? sender, string e) => didEventFire = true; // Act TestStringWeakEventManager.RaiseEvent(this, "Test", nameof(TestStringEvent)); @@ -174,9 +174,9 @@ public void WeakEventManagerT_AddEventHandler_NullHandler() // Act // Assert -#pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type +#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type. Assert.Throws(() => TestStringWeakEventManager.AddEventHandler((EventHandler)null)); -#pragma warning restore CS8625 +#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type. } [Fact] @@ -187,9 +187,7 @@ public void WeakEventManagerT_AddEventHandler_NullEventName() // Act // Assert -#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference Assert.Throws(() => TestStringWeakEventManager.AddEventHandler(s => { var temp = s; }, null)); -#pragma warning restore CS8625 } [Fact] @@ -222,9 +220,9 @@ public void WeakEventManagerT_RemoveEventHandler_NullHandler() // Act // Assert -#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference +#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type. Assert.Throws(() => TestStringWeakEventManager.RemoveEventHandler((EventHandler)null)); -#pragma warning restore CS8625 +#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type. } [Fact] @@ -235,9 +233,7 @@ public void WeakEventManagerT_RemoveEventHandler_NullEventName() // Act // Assert -#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference Assert.Throws(() => TestStringWeakEventManager.AddEventHandler(s => { var temp = s; }, null)); -#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference } [Fact] @@ -269,12 +265,12 @@ public void WeakEventManagerT_HandleEvent_InvalidHandleEvent() TestStringEvent += HandleTestStringEvent; var didEventFire = false; - void HandleTestStringEvent(object sender, string e) => didEventFire = true; + void HandleTestStringEvent(object? sender, string e) => didEventFire = true; // Act // Assert - Assert.Throws(() => TestStringWeakEventManager.RaiseEvent("", nameof(TestStringEvent))); + Assert.Throws(() => TestStringWeakEventManager.RaiseEvent(string.Empty, nameof(TestStringEvent))); Assert.False(didEventFire); TestStringEvent -= HandleTestStringEvent; } diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockPlatformServices.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockPlatformServices.cs index 18d3fcc03..d0a5aa648 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockPlatformServices.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockPlatformServices.cs @@ -31,7 +31,7 @@ public bool IsInvokeRequired public OSAppTheme RequestedTheme => OSAppTheme.Unspecified; - public string RuntimePlatform { get; set; } + public string RuntimePlatform { get; set; } = string.Empty; public void BeginInvokeOnMainThread(Action action) => action(); @@ -49,7 +49,7 @@ public Task GetStreamAsync(Uri uri, CancellationToken cancellationToken) public Assembly[] GetAssemblies() => new Assembly[0]; - public IIsolatedStorageFile GetUserStoreForApplication() + public IIsolatedStorageFile? GetUserStoreForApplication() => null; Assembly[] IPlatformServices.GetAssemblies() diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockResourceManager.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockResourceManager.cs index c57aa3b39..3c0289d2a 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockResourceManager.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Mocks/MockResourceManager.cs @@ -5,6 +5,6 @@ namespace Xamarin.CommunityToolkit.UnitTests.Mocks { class MockResourceManager : ResourceManager { - public override string GetString(string name, CultureInfo culture) => culture.EnglishName; + public override string GetString(string name, CultureInfo? culture) => culture?.EnglishName ?? string.Empty; } } \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Namespace_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Namespace_Tests.cs index 3f710be90..9bcf4bd50 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Namespace_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Namespace_Tests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Reflection; using Xamarin.CommunityToolkit.Behaviors.Internals; using Xamarin.CommunityToolkit.Converters; @@ -15,62 +16,72 @@ public class Namespace_Tests [Fact] public void MakeSureConvertersAreInTheRightNamespace() { - var allTheTypes = Assembly.GetAssembly(typeof(InvertedBoolConverter)).GetTypes(); + var allTheTypes = Assembly.GetAssembly(typeof(InvertedBoolConverter))?.GetTypes(); + if (allTheTypes is null) + throw new NullReferenceException(); foreach (var type in allTheTypes.Where(t => t.Name.EndsWith("Converter") && t.GetInterface(nameof(IValueConverter)) != null)) { - Assert.True(type.Namespace.Equals("Xamarin.CommunityToolkit.Converters"), - $"{type.FullName} not in Xamarin.CommunityToolkit.Converters namespace"); + Assert.True(type?.Namespace?.Equals("Xamarin.CommunityToolkit.Converters"), + $"{type?.FullName} not in Xamarin.CommunityToolkit.Converters namespace"); } } [Fact] public void MakeSureEffectsAreInTheRightNamespace() { - var allTheTypes = Assembly.GetAssembly(typeof(SafeAreaEffect)).GetTypes(); + var allTheTypes = Assembly.GetAssembly(typeof(SafeAreaEffect))?.GetTypes(); + if (allTheTypes is null) + throw new NullReferenceException(); foreach (var type in allTheTypes.Where(t => t.Name.EndsWith("Effect") && t.IsClass && t.IsSealed && t.IsAbstract)) { - Assert.True(type.Namespace.Equals("Xamarin.CommunityToolkit.Effects"), - $"{type.FullName} not in Xamarin.CommunityToolkit.Effects namespace"); + Assert.True(type?.Namespace?.Equals("Xamarin.CommunityToolkit.Effects"), + $"{type?.FullName} not in Xamarin.CommunityToolkit.Effects namespace"); } } [Fact] public void MakeSureMarkupExtensionsAreInTheRightNamespace() { - var allTheTypes = Assembly.GetAssembly(typeof(TranslateExtension)).GetTypes(); + var allTheTypes = Assembly.GetAssembly(typeof(TranslateExtension))?.GetTypes(); + if (allTheTypes is null) + throw new NullReferenceException(); foreach (var type in allTheTypes.Where(t => t.Name.EndsWith("Extension") && t.GetInterface("IMarkupExtension") != null)) { - Assert.True(type.Namespace.Equals("Xamarin.CommunityToolkit.Extensions") || - type.Namespace.Equals("Xamarin.CommunityToolkit.Extensions.Internals"), - $"{type.FullName} not in nameof(Xamarin.CommunityToolkit.Extensions namespace"); + Assert.True(type?.Namespace?.Equals("Xamarin.CommunityToolkit.Extensions") is true || + type?.Namespace?.Equals("Xamarin.CommunityToolkit.Extensions.Internals") is true, + $"{type?.FullName} not in nameof(Xamarin.CommunityToolkit.Extensions namespace"); } } [Fact] public void MakeSureBehaviorsAreInTheRightNamespace() { - var allTheTypes = Assembly.GetAssembly(typeof(BaseBehavior<>)).GetTypes(); + var allTheTypes = Assembly.GetAssembly(typeof(BaseBehavior<>))?.GetTypes(); + if (allTheTypes is null) + throw new NullReferenceException(); foreach (var type in allTheTypes.Where(t => t.Name.EndsWith("Behavior") && t.IsSubclassOf(typeof(BaseBehavior<>)))) { - Assert.True(type.Namespace.Equals("Xamarin.CommunityToolkit.Behaviors"), - $"{type.FullName} not in Xamarin.CommunityToolkit.Behaviors namespace"); + Assert.True(type?.Namespace?.Equals("Xamarin.CommunityToolkit.Behaviors"), + $"{type?.FullName} not in Xamarin.CommunityToolkit.Behaviors namespace"); } } [Fact] public void MakeSureViewsAreInTheRightNamespace() { - var allTheTypes = Assembly.GetAssembly(typeof(AvatarView)).GetTypes(); + var allTheTypes = Assembly.GetAssembly(typeof(AvatarView))?.GetTypes(); + if (allTheTypes is null) + throw new NullReferenceException(); foreach (var type in allTheTypes.Where(t => t.IsSubclassOf(typeof(View)))) { - Assert.True(type.Namespace.Equals("Xamarin.CommunityToolkit.UI.Views") || - type.Namespace.Equals("Xamarin.CommunityToolkit.UI.Views.Internals"), - $"{type.FullName} not in Xamarin.CommunityToolkit.UI.Views namespace"); + Assert.True(type?.Namespace?.Equals("Xamarin.CommunityToolkit.UI.Views") is true || + type?.Namespace?.Equals("Xamarin.CommunityToolkit.UI.Views.Internals") is true, + $"{type?.FullName} not in Xamarin.CommunityToolkit.UI.Views namespace"); } } } diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/AsyncCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/AsyncCommand_Tests.cs index 63cbe4e0c..53ddb4f9d 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/AsyncCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/AsyncCommand_Tests.cs @@ -152,7 +152,7 @@ public void AsyncCommand_NoParameter_CanExecuteFalse_NoParameter_Test() public void AsyncCommand_NoParameter_NoCanExecute_Test() { // Arrange - Func canExecute = null; + Func? canExecute = null; var command = new AsyncCommand(NoParameterTask, canExecute); // Act @@ -189,7 +189,7 @@ public void AsyncCommand_RaiseCanExecuteChanged_MainThreadCreation_MainThreadExe Assert.True(didCanExecuteChangeFire); Assert.True(command.CanExecute(null)); - void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true; + void handleCanExecuteChanged(object? sender, EventArgs e) => didCanExecuteChangeFire = true; } [Fact] @@ -222,7 +222,7 @@ public Task AsyncCommand_RaiseCanExecuteChanged_BackgroundThreadCreation_Backgro Assert.True(didCanExecuteChangeFire); Assert.True(command.CanExecute(null)); - void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true; + void handleCanExecuteChanged(object? sender, EventArgs e) => didCanExecuteChangeFire = true; }); [Fact] @@ -258,14 +258,14 @@ await Task.Run(async () => Assert.True(command.CanExecute(null)); }); - void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true; + void handleCanExecuteChanged(object? sender, EventArgs e) => didCanExecuteChangeFire = true; } [Fact] public async Task AsyncCommand_RaiseCanExecuteChanged_BackgroundThreadCreation_MainThreadExecution_Test() { // Arrange - AsyncCommand command = null; + AsyncCommand? command = null; var didCanExecuteChangeFire = false; var canCommandExecute = false; @@ -289,20 +289,23 @@ await Task.Run(async () => }).ConfigureAwait(true); // Act + if (command is null) + throw new NullReferenceException(); + command.RaiseCanExecuteChanged(); // Assert Assert.True(didCanExecuteChangeFire); Assert.True(command.CanExecute(null)); - void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true; + void handleCanExecuteChanged(object? sender, EventArgs e) => didCanExecuteChangeFire = true; } [Fact] public async Task AsyncCommand_ChangeCanExecute_Test() { // Arrange - var canExecuteChangedTCS = new TaskCompletionSource(); + var canExecuteChangedTCS = new TaskCompletionSource(); var canCommandExecute = false; var didCanExecuteChangeFire = false; @@ -322,16 +325,14 @@ public async Task AsyncCommand_ChangeCanExecute_Test() Assert.False(didCanExecuteChangeFire); // Act -#pragma warning disable CS0618 // Type or member is obsolete command.ChangeCanExecute(); await canExecuteChangedTCS.Task; -#pragma warning restore CS0618 // Type or member is obsolete // Assert Assert.True(didCanExecuteChangeFire); Assert.True(command.CanExecute(null)); - void handleCanExecuteChanged(object sender, EventArgs e) + void handleCanExecuteChanged(object? sender, EventArgs e) { didCanExecuteChangeFire = true; canExecuteChangedTCS.SetResult(null); @@ -363,14 +364,14 @@ public async Task AsyncCommand_CanExecuteChanged_AllowsMultipleExecutions_Test() Assert.True(command.CanExecute(null)); Assert.Equal(0, canExecuteChangedCount); - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; } [Fact] public async Task AsyncCommand_CanExecuteChanged_DoesNotAllowMultipleExecutions_Test() { // Arrange - var canExecuteChangedGreaterThan1TCS = new TaskCompletionSource(); + var canExecuteChangedGreaterThan1TCS = new TaskCompletionSource(); var canExecuteChangedCount = 0; @@ -394,7 +395,7 @@ public async Task AsyncCommand_CanExecuteChanged_DoesNotAllowMultipleExecutions_ Assert.True(command.CanExecute(null)); Assert.Equal(2, canExecuteChangedCount); - void handleCanExecuteChanged(object sender, EventArgs e) + void handleCanExecuteChanged(object? sender, EventArgs e) { if (++canExecuteChangedCount > 1) canExecuteChangedGreaterThan1TCS.SetResult(null); diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/IAsyncCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/IAsyncCommand_Tests.cs index 8c7bdc80a..c4d700278 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/IAsyncCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/IAsyncCommand_Tests.cs @@ -201,7 +201,7 @@ public async Task IAsyncCommand_CanExecuteChanged_AllowsMultipleExecutions_Test( Assert.True(command.CanExecute(null)); Assert.Equal(0, canExecuteChangedCount); - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; } [Fact] @@ -229,7 +229,7 @@ public async Task IAsyncCommand_CanExecuteChanged_DoesNotAllowMultipleExecutions Assert.True(command.CanExecute(null)); Assert.Equal(2, canExecuteChangedCount); - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; } } } \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/ICommand_AsyncCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/ICommand_AsyncCommand_Tests.cs index 691eff1fa..1e8ba3806 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/ICommand_AsyncCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncCommandTests/ICommand_AsyncCommand_Tests.cs @@ -43,7 +43,7 @@ public async Task ICommand_Execute_StringParameter_Test(string parameter) public void ICommand_ExecuteAsync_InvalidValueTypeParameter_Test() { // Arrange - InvalidCommandParameterException actualInvalidCommandParameterException = null; + InvalidCommandParameterException? actualInvalidCommandParameterException = null; var expectedInvalidCommandParameterException = new InvalidCommandParameterException(typeof(string), typeof(int)); ICommand command = new AsyncCommand(StringParameterTask); @@ -61,7 +61,7 @@ public void ICommand_ExecuteAsync_InvalidValueTypeParameter_Test() public void ICommand_ExecuteAsync_InvalidReferenceTypeParameter_Test() { // Arrange - InvalidCommandParameterException actualInvalidCommandParameterException = null; + InvalidCommandParameterException? actualInvalidCommandParameterException = null; var expectedInvalidCommandParameterException = new InvalidCommandParameterException(typeof(int), typeof(string)); ICommand command = new AsyncCommand(IntParameterTask); @@ -78,7 +78,7 @@ public void ICommand_ExecuteAsync_InvalidReferenceTypeParameter_Test() public void ICommand_ExecuteAsync_ValueTypeParameter_Test() { // Arrange - InvalidCommandParameterException actualInvalidCommandParameterException = null; + InvalidCommandParameterException? actualInvalidCommandParameterException = null; var expectedInvalidCommandParameterException = new InvalidCommandParameterException(typeof(int)); ICommand command = new AsyncCommand(IntParameterTask); @@ -197,7 +197,7 @@ public async Task ICommand_Parameter_CanExecuteChanged_AllowsMultipleExecutions_ ICommand command = new AsyncCommand(IntParameterTask); - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(Delay); @@ -239,7 +239,7 @@ public async Task ICommand_Parameter_CanExecuteChanged_DoesNotAllowMultipleExecu Assert.True(command.CanExecute(null)); Assert.Equal(2, canExecuteChangedCount); - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; } [Fact] @@ -251,7 +251,7 @@ public async Task ICommand_NoParameter_CanExecuteChanged_AllowsMultipleExecution ICommand command = new AsyncCommand(() => IntParameterTask(Delay)); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(null); @@ -277,7 +277,7 @@ public async Task ICommand_NoParameter_CanExecuteChanged_DoesNotAllowMultipleExe ICommand command = new AsyncCommand(() => IntParameterTask(Delay), allowsMultipleExecutions: false); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(null); diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/AsyncValueCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/AsyncValueCommand_Tests.cs index 152aed39e..1e83d0c7b 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/AsyncValueCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/AsyncValueCommand_Tests.cs @@ -175,7 +175,7 @@ public void AsyncValueCommandNoParameter_CanExecuteFalseNoParameter_Test() public void AsyncValueCommandNoParameter_NoCanExecute_Test() { // Arrange - Func canExecute = null; + Func? canExecute = null; var command = new AsyncValueCommand(NoParameterTask, canExecute); // Act @@ -188,7 +188,7 @@ public void AsyncValueCommandNoParameter_NoCanExecute_Test() public async Task AsyncValueCommand_RaiseCanExecuteChanged_Test() { // Arrange - var handleCanExecuteChangedTCS = new TaskCompletionSource(); + var handleCanExecuteChangedTCS = new TaskCompletionSource(); var canCommandExecute = false; var didCanExecuteChangeFire = false; @@ -215,7 +215,7 @@ public async Task AsyncValueCommand_RaiseCanExecuteChanged_Test() Assert.True(didCanExecuteChangeFire); Assert.True(command.CanExecute(null)); - void handleCanExecuteChanged(object sender, EventArgs e) + void handleCanExecuteChanged(object? sender, EventArgs e) { didCanExecuteChangeFire = true; handleCanExecuteChangedTCS.SetResult(null); @@ -226,7 +226,7 @@ void handleCanExecuteChanged(object sender, EventArgs e) public async Task AsyncValueCommand_ChangeCanExecute_Test() { // Arrange - var handleCanExecuteChangedTCS = new TaskCompletionSource(); + var handleCanExecuteChangedTCS = new TaskCompletionSource(); var canCommandExecute = false; var didCanExecuteChangeFire = false; @@ -255,7 +255,7 @@ public async Task AsyncValueCommand_ChangeCanExecute_Test() Assert.True(didCanExecuteChangeFire); Assert.True(command.CanExecute(null)); - void handleCanExecuteChanged(object sender, EventArgs e) + void handleCanExecuteChanged(object? sender, EventArgs e) { didCanExecuteChangeFire = true; handleCanExecuteChangedTCS.SetResult(null); @@ -271,7 +271,7 @@ public async Task AsyncValueCommand_Parameter_CanExecuteChanged_AllowsMultipleEx var command = new AsyncValueCommand(IntParameterTask); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; Assert.True(command.AllowsMultipleExecutions); @@ -299,7 +299,7 @@ public async Task AsyncValueCommand_Parameter_CanExecuteChanged_DoesNotAllowMult var command = new AsyncValueCommand(IntParameterTask, allowsMultipleExecutions: false); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; Assert.False(command.AllowsMultipleExecutions); @@ -327,7 +327,7 @@ public async Task AsyncValueCommand_NoParameter_CanExecuteChanged_AllowsMultiple var command = new AsyncValueCommand(() => IntParameterTask(Delay)); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; Assert.True(command.AllowsMultipleExecutions); @@ -355,7 +355,7 @@ public async Task AsyncValueCommand_NoParameter_CanExecuteChanged_DoesNotAllowMu var command = new AsyncValueCommand(() => IntParameterTask(Delay), allowsMultipleExecutions: false); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; Assert.False(command.AllowsMultipleExecutions); diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/ICommand_AsyncValueCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/ICommand_AsyncValueCommand_Tests.cs index fc7265ffa..587ae2290 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/ICommand_AsyncValueCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/ICommand_AsyncValueCommand_Tests.cs @@ -43,7 +43,7 @@ public async Task ICommand_Execute_StringParameter_Test(string parameter) public async Task ICommand_Execute_InvalidValueTypeParameter_Test() { // Arrange - InvalidCommandParameterException actualInvalidCommandParameterException = null; + InvalidCommandParameterException? actualInvalidCommandParameterException = null; var expectedInvalidCommandParameterException = new InvalidCommandParameterException(typeof(string), typeof(int)); ICommand command = new AsyncValueCommand(StringParameterTask); @@ -69,7 +69,7 @@ public async Task ICommand_Execute_InvalidValueTypeParameter_Test() public async Task ICommand_Execute_InvalidReferenceTypeParameter_Test() { // Arrange - InvalidCommandParameterException actualInvalidCommandParameterException = null; + InvalidCommandParameterException? actualInvalidCommandParameterException = null; var expectedInvalidCommandParameterException = new InvalidCommandParameterException(typeof(int), typeof(string)); ICommand command = new AsyncValueCommand(IntParameterTask); @@ -95,7 +95,7 @@ public async Task ICommand_Execute_InvalidReferenceTypeParameter_Test() public async Task ICommand_Execute_ValueTypeParameter_Test() { // Arrange - InvalidCommandParameterException actualInvalidCommandParameterException = null; + InvalidCommandParameterException? actualInvalidCommandParameterException = null; var expectedInvalidCommandParameterException = new InvalidCommandParameterException(typeof(int)); ICommand command = new AsyncValueCommand(IntParameterTask); @@ -224,7 +224,7 @@ public async Task ICommand_Parameter_CanExecuteChanged_AllowsMultipleExecutions_ ICommand command = new AsyncValueCommand(IntParameterTask); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(Delay); @@ -249,7 +249,7 @@ public async Task ICommand_Parameter_CanExecuteChanged_DoesNotAllowMultipleExecu ICommand command = new AsyncValueCommand(IntParameterTask, allowsMultipleExecutions: false); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(Delay); @@ -275,7 +275,7 @@ public async Task ICommand_NoParameter_CanExecuteChanged_AllowsMultipleExecution ICommand command = new AsyncValueCommand(() => IntParameterTask(Delay)); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(null); @@ -301,7 +301,7 @@ public async Task ICommand_NoParameter_CanExecuteChanged_DoesNotAllowMultipleExe ICommand command = new AsyncValueCommand(() => IntParameterTask(Delay), allowsMultipleExecutions: false); command.CanExecuteChanged += handleCanExecuteChanged; - void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++; + void handleCanExecuteChanged(object? sender, EventArgs e) => canExecuteChangedCount++; // Act command.Execute(null); diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncCommand_Tests.cs index 6b5618c3c..2f4f65408 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncCommand_Tests.cs @@ -13,7 +13,7 @@ public class CommandFactoryAsyncCommandTests : BaseCommandTests public void AsyncCommand_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -61,7 +61,7 @@ public async Task AsyncCommand_ObjectCanExecuteParameter() public void AsyncCommand_FuncBool_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -73,7 +73,7 @@ public void AsyncCommand_FuncBool_NullExecuteParameter() public async Task AsyncCommand_FuncBool_NullCanExecuteParameter() { // Arrange - Func canExecute = null; + Func? canExecute = null; var command = CommandFactory.Create(NoParameterTask, canExecute); // Act @@ -112,7 +112,7 @@ public async Task AsyncCommand_FuncBool_ValidExecuteParameter_ValidCanExecutePar public void AsyncCommandT_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -162,7 +162,7 @@ public async Task AsyncCommandT_ObjectCanExecuteParameter() public void AsyncCommandT_FuncBool_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -174,7 +174,7 @@ public void AsyncCommandT_FuncBool_NullExecuteParameter() public async Task AsyncCommandT_FuncBool_NullCanExecuteParameter() { // Arrange - Func canExecute = null; + Func? canExecute = null; var command = CommandFactory.Create(IntParameterTask, canExecute); // Act @@ -213,7 +213,7 @@ public async Task AsyncCommandT_FuncBool_ValidExecuteParameter_ValidCanExecutePa public void AsyncCommandTExecuteTCanExecute_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncValueCommand_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncValueCommand_Tests.cs index 2655be1e4..387663ec4 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncValueCommand_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_AsyncValueCommand_Tests.cs @@ -14,7 +14,7 @@ public class CommandFactoryAsyncValueCommandTests : BaseAsyncValueCommandTests public void AsyncValueCommand_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -62,7 +62,7 @@ public async Task AsyncValueCommand_ObjectCanExecuteParameter() public void AsyncValueCommand_FuncBool_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -74,7 +74,7 @@ public void AsyncValueCommand_FuncBool_NullExecuteParameter() public async Task AsyncValueCommand_FuncBool_NullCanExecuteParameter() { // Arrange - Func canExecute = null; + Func? canExecute = null; var command = CommandFactory.Create(NoParameterTask, canExecute); // Act @@ -113,7 +113,7 @@ public async Task AsyncValueCommand_FuncBool_ValidExecuteParameter_ValidCanExecu public void AsyncValueCommandT_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -163,7 +163,7 @@ public async Task AsyncValueCommandT_ObjectCanExecuteParameter() public void AsyncValueCommandT_FuncBool_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act @@ -175,7 +175,7 @@ public void AsyncValueCommandT_FuncBool_NullExecuteParameter() public async Task AsyncValueCommandT_FuncBool_NullCanExecuteParameter() { // Arrange - Func canExecute = null; + Func? canExecute = null; var command = CommandFactory.Create(IntParameterTask, canExecute); // Act @@ -214,7 +214,7 @@ public async Task AsyncValueCommandT_FuncBool_ValidExecuteParameter_ValidCanExec public void AsyncValueCommandTExecuteTCanExecute_NullExecuteParameter() { // Arrange - Func execute = null; + Func? execute = null; // Act diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_Command_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_Command_Tests.cs index b6e4f48d4..635b6fada 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_Command_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ICommandTests/CommandFactoryTests/CommandFactory_Command_Tests.cs @@ -1,6 +1,5 @@ using System; using System.Windows.Input; -using Xamarin.CommunityToolkit.Exceptions; using Xamarin.CommunityToolkit.ObjectModel; using Xunit; @@ -12,7 +11,7 @@ public class CommandFactoryCommandTests : BaseCommandTests public void Action_NullExecuteParameter() { // Arrange - Action execute = null; + Action? execute = null; // Act @@ -71,7 +70,7 @@ public void Action_ValidCanExecuteParameter() public void ActionObject_NullExecuteParameter() { // Arrange - Action execute = null; + Action? execute = null; // Act @@ -132,7 +131,7 @@ public void ActionObject_ValidCanExecuteParameter() public void ActionInt_NullExecuteParameter() { // Arrange - Action execute = null; + Action? execute = null; // Act diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableObject_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableObject_Tests.cs index 009506d37..060fbf7e5 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableObject_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableObject_Tests.cs @@ -7,21 +7,16 @@ namespace Xamarin.CommunityToolkit.UnitTests.ObjectModel { public sealed class ObservableObject_Tests { - Person person; - - public ObservableObject_Tests() + readonly Person person = new Person { - person = new Person - { - FirstName = "James", - LastName = "Montemagno" - }; - } + FirstName = "James", + LastName = "Montemagno" + }; [Fact] public void OnPropertyChanged() { - PropertyChangedEventArgs updated = null; + PropertyChangedEventArgs? updated = null; person.PropertyChanged += (sender, args) => { updated = args; @@ -30,13 +25,13 @@ public void OnPropertyChanged() person.FirstName = "Motz"; Assert.NotNull(updated); - Assert.Equal(nameof(person.FirstName), updated.PropertyName); + Assert.Equal(nameof(person.FirstName), updated?.PropertyName); } [Fact] public void OnDidntChange() { - PropertyChangedEventArgs updated = null; + PropertyChangedEventArgs? updated = null; person.PropertyChanged += (sender, args) => { updated = args; diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableRangeCollection_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableRangeCollection_Tests.cs index beba839f1..13222b067 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableRangeCollection_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/ObservableRangeCollection_Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.Linq; using Xamarin.CommunityToolkit.ObjectModel; using Xunit; using Xunit.Sdk; @@ -121,7 +122,7 @@ public void RemoveRangeRemoveFact() throw new XunitException("Expected and actual OldItems don't match."); for (var i = 0; i < expected.Length; i++) { - if (expected[i] != (int)e.OldItems[i]) + if (expected[i] != (int?)e.OldItems[i]) throw new XunitException("Expected and actual OldItems don't match."); } }; @@ -176,12 +177,6 @@ public void RemoveRange_should_NOT_mutate_collection_when_source_data_is_not_pre Assert.Equal(6, collection.Count); } - class CollectionWrapper - { - public readonly ObservableRangeCollection Collection = new ObservableRangeCollection(); - public ObservableRangeCollection NullCollection; - } - [Fact] public void AddCollection() { @@ -200,6 +195,7 @@ public void AddToNullCollection() { var toAdd = new[] { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3 }; +#pragma warning disable CS8670 // Object or collection initializer implicitly dereferences possibly null member. Assert.Throws(() => { var wrapper = new CollectionWrapper() @@ -207,6 +203,14 @@ public void AddToNullCollection() NullCollection = { toAdd } }; }); +#pragma warning restore CS8670 // Object or collection initializer implicitly dereferences possibly null member. + } + + class CollectionWrapper + { + public ObservableRangeCollection Collection { get; } = new ObservableRangeCollection(); + + public ObservableRangeCollection? NullCollection { get; init; } } } } \ No newline at end of file diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/Person.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/Person.cs index 25c7b0dff..25993c9cc 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/Person.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/ObjectModel/Person.cs @@ -5,14 +5,14 @@ namespace Xamarin.CommunityToolkit.UnitTests.ObjectModel { class Person : ObservableObject { - string firstName; - string lastName; + string firstName = string.Empty; + string lastName = string.Empty; - public Action Changed { get; set; } + public Action? Changed { get; set; } - public Action Changing { get; set; } + public Action? Changing { get; set; } - public Func Validate { get; set; } + public Func? Validate { get; set; } public string FirstName { diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Views/MediaSource_Tests.cs b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Views/MediaSource_Tests.cs index 013c75f9b..1fc571a25 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Views/MediaSource_Tests.cs +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Views/MediaSource_Tests.cs @@ -32,7 +32,7 @@ public void TestHelpers() public void TestImplicitFileConversion() { var mediaElement = new UI.Views.MediaElement { Source = "File.mp4" }; - Assert.True(mediaElement.Source != null); + Assert.NotNull(mediaElement.Source); Assert.IsType(mediaElement.Source); Assert.Equal("File.mp4", ((Core.FileMediaSource)mediaElement.Source).File); } @@ -40,7 +40,7 @@ public void TestImplicitFileConversion() [Fact] public void TestImplicitStringConversionWhenNull() { - string s = null; + string? s = null; var sut = (Core.MediaSource)s; Assert.IsType(sut); Assert.Null(((Core.FileMediaSource)sut).File); @@ -50,7 +50,7 @@ public void TestImplicitStringConversionWhenNull() public void TestImplicitUriConversion() { var mediaElement = new UI.Views.MediaElement { Source = new Uri("http://xamarin.com/media.mp4") }; - Assert.True(mediaElement.Source != null); + Assert.NotNull(mediaElement.Source); Assert.IsType(mediaElement.Source); Assert.Equal("http://xamarin.com/media.mp4", ((Core.UriMediaSource)mediaElement.Source).Uri.AbsoluteUri); } @@ -59,7 +59,7 @@ public void TestImplicitUriConversion() public void TestImplicitStringUriConversion() { var mediaElement = new UI.Views.MediaElement { Source = "http://xamarin.com/media.mp4" }; - Assert.True(mediaElement.Source != null); + Assert.NotNull(mediaElement.Source); Assert.IsType(mediaElement.Source); Assert.Equal("http://xamarin.com/media.mp4", ((Core.UriMediaSource)mediaElement.Source).Uri.AbsoluteUri); } @@ -67,7 +67,7 @@ public void TestImplicitStringUriConversion() [Fact] public void TestImplicitUriConversionWhenNull() { - Uri u = null; + Uri? u = null; var sut = (Core.MediaSource)u; Assert.Null(sut); } diff --git a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj index 506115a4f..bf7e510f4 100644 --- a/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj +++ b/src/CommunityToolkit/Xamarin.CommunityToolkit.UnitTests/Xamarin.CommunityToolkit.UnitTests.csproj @@ -2,7 +2,9 @@ netcoreapp2.1;netcoreapp3.1;net461 - + enable + nullable + latest false diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectExtensions.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectExtensions.cs index 73bbcbb1f..1b4e10e42 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectExtensions.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectExtensions.cs @@ -13,12 +13,12 @@ public static TBindable Bind( BindableProperty targetProperty, string path = bindingContextPath, BindingMode mode = BindingMode.Default, - IValueConverter converter = null, - object converterParameter = null, - string stringFormat = null, - object source = null, - object targetNullValue = null, - object fallbackValue = null) where TBindable : BindableObject + IValueConverter? converter = null, + object? converterParameter = null, + string? stringFormat = null, + object? source = null, + object? targetNullValue = null, + object? fallbackValue = null) where TBindable : BindableObject { bindable.SetBinding( targetProperty, @@ -36,12 +36,12 @@ public static TBindable Bind( BindableProperty targetProperty, string path = bindingContextPath, BindingMode mode = BindingMode.Default, - Func convert = null, - Func convertBack = null, - string stringFormat = null, - object source = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + Func? convert = null, + Func? convertBack = null, + string? stringFormat = null, + object? source = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject { var converter = new FuncConverter(convert, convertBack); bindable.SetBinding( @@ -60,13 +60,13 @@ public static TBindable Bind( BindableProperty targetProperty, string path = bindingContextPath, BindingMode mode = BindingMode.Default, - Func convert = null, - Func convertBack = null, - TParam converterParameter = default, - string stringFormat = null, - object source = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + Func? convert = null, + Func? convertBack = null, + TParam? converterParameter = default, + string? stringFormat = null, + object? source = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject { var converter = new FuncConverter(convert, convertBack); bindable.SetBinding( @@ -84,12 +84,12 @@ public static TBindable Bind( this TBindable bindable, string path = bindingContextPath, BindingMode mode = BindingMode.Default, - IValueConverter converter = null, - object converterParameter = null, - string stringFormat = null, - object source = null, - object targetNullValue = null, - object fallbackValue = null) where TBindable : BindableObject + IValueConverter? converter = null, + object? converterParameter = null, + string? stringFormat = null, + object? source = null, + object? targetNullValue = null, + object? fallbackValue = null) where TBindable : BindableObject { bindable.Bind( DefaultBindableProperties.GetFor(bindable), @@ -102,12 +102,12 @@ public static TBindable Bind( this TBindable bindable, string path = bindingContextPath, BindingMode mode = BindingMode.Default, - Func convert = null, - Func convertBack = null, - string stringFormat = null, - object source = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + Func? convert = null, + Func? convertBack = null, + string? stringFormat = null, + object? source = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject { var converter = new FuncConverter(convert, convertBack); bindable.Bind( @@ -121,13 +121,13 @@ public static TBindable Bind( this TBindable bindable, string path = bindingContextPath, BindingMode mode = BindingMode.Default, - Func convert = null, - Func convertBack = null, - TParam converterParameter = default, - string stringFormat = null, - object source = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + Func? convert = null, + Func? convertBack = null, + TParam? converterParameter = default, + string? stringFormat = null, + object? source = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject { var converter = new FuncConverter(convert, convertBack); bindable.Bind( @@ -141,9 +141,9 @@ public static TBindable Bind( public static TBindable BindCommand( this TBindable bindable, string path = bindingContextPath, - object source = null, - string parameterPath = bindingContextPath, - object parameterSource = null) where TBindable : BindableObject + object? source = null, + string? parameterPath = bindingContextPath, + object? parameterSource = null) where TBindable : BindableObject { (var commandProperty, var parameterProperty) = DefaultBindableProperties.GetForCommand(bindable); diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectMultiBindExtensions.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectMultiBindExtensions.cs index 6eeec55b2..fc3bcf9d7 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectMultiBindExtensions.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/BindableObjectMultiBindExtensions.cs @@ -12,12 +12,12 @@ public static TBindable Bind( BindableProperty targetProperty, BindingBase binding1, BindingBase binding2, - Func, TDest> convert = null, - Func> convertBack = null, + Func, TDest>? convert = null, + Func>? convertBack = null, BindingMode mode = BindingMode.Default, - string stringFormat = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + string? stringFormat = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject => bindable.Bind( targetProperty, new List { binding1, binding2 }, @@ -34,13 +34,13 @@ public static TBindable Bind( BindableProperty targetProperty, BindingBase binding1, BindingBase binding2, - Func, TParam, TDest> convert = null, - Func> convertBack = null, - TParam converterParameter = default, + Func, TParam?, TDest>? convert = null, + Func>? convertBack = null, + TParam? converterParameter = default, BindingMode mode = BindingMode.Default, - string stringFormat = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + string? stringFormat = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject => bindable.Bind( targetProperty, new List { binding1, binding2 }, @@ -58,12 +58,12 @@ public static TBindable Bind( BindingBase binding1, BindingBase binding2, BindingBase binding3, - Func, TDest> convert = null, - Func> convertBack = null, + Func, TDest>? convert = null, + Func>? convertBack = null, BindingMode mode = BindingMode.Default, - string stringFormat = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + string? stringFormat = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject => bindable.Bind( targetProperty, new List { binding1, binding2, binding3 }, @@ -81,13 +81,13 @@ public static TBindable Bind, TParam, TDest> convert = null, - Func> convertBack = null, - TParam converterParameter = default, + Func, TParam?, TDest>? convert = null, + Func>? convertBack = null, + TParam? converterParameter = default, BindingMode mode = BindingMode.Default, - string stringFormat = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + string? stringFormat = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject => bindable.Bind( targetProperty, new List { binding1, binding2, binding3 }, @@ -106,12 +106,12 @@ public static TBindable Bind, TDest> convert = null, - Func> convertBack = null, + Func, TDest>? convert = null, + Func>? convertBack = null, BindingMode mode = BindingMode.Default, - string stringFormat = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + string? stringFormat = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject => bindable.Bind( targetProperty, new List { binding1, binding2, binding3, binding4 }, @@ -130,13 +130,13 @@ public static TBindable Bind, TParam, TDest> convert = null, - Func> convertBack = null, - TParam converterParameter = default, + Func, TParam?, TDest>? convert = null, + Func>? convertBack = null, + TParam? converterParameter = default, BindingMode mode = BindingMode.Default, - string stringFormat = null, - TDest targetNullValue = default, - TDest fallbackValue = default) where TBindable : BindableObject + string? stringFormat = null, + TDest? targetNullValue = default, + TDest? fallbackValue = default) where TBindable : BindableObject => bindable.Bind( targetProperty, new List { binding1, binding2, binding3, binding4 }, @@ -153,11 +153,11 @@ public static TBindable Bind( BindableProperty targetProperty, IList bindings, IMultiValueConverter converter, - object converterParameter = default, + object? converterParameter = default, BindingMode mode = BindingMode.Default, - string stringFormat = null, - object targetNullValue = null, - object fallbackValue = null) where TBindable : BindableObject + string? stringFormat = null, + object? targetNullValue = null, + object? fallbackValue = null) where TBindable : BindableObject { bindable.SetBinding(targetProperty, new MultiBinding { diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/ElementExtensions.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/ElementExtensions.cs index 05bf63c77..1c0652eb8 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/ElementExtensions.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/ElementExtensions.cs @@ -41,7 +41,7 @@ public static TElement RemoveDynamicResources(this TElement element, p public static TElement Effects(this TElement element, params Effect[] effects) where TElement : Element { - for (int i = 0; i < effects.Length; i++) + for (var i = 0; i < effects.Length; i++) element.Effects.Add(effects[i]); return element; } @@ -59,7 +59,7 @@ public static TFontElement Italic(this TFontElement fontElement) w public static TFontElement Font( this TFontElement fontElement, - string family = null, + string? family = null, double? size = null, bool? bold = null, bool? italic = null) where TFontElement : Element, IFontElement diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/ElementGesturesExtensions.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/ElementGesturesExtensions.cs index 2aea06ddb..e8d581169 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/ElementGesturesExtensions.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/ElementGesturesExtensions.cs @@ -13,9 +13,9 @@ public static class ElementGesturesExtensions public static TGestureElement BindClickGesture( this TGestureElement gestureElement, string commandPath = bindingContextPath, - object commandSource = null, - string parameterPath = null, - object parameterSource = null) where TGestureElement : Element, IGestureRecognizers + object? commandSource = null, + string? parameterPath = null, + object? parameterSource = null) where TGestureElement : Element, IGestureRecognizers => ClickGesture(gestureElement, g => g.BindCommand(commandPath, commandSource, parameterPath, parameterSource)); /// Add a , @@ -24,9 +24,9 @@ public static TGestureElement BindClickGesture( public static TGestureElement BindSwipeGesture( this TGestureElement gestureElement, string commandPath = bindingContextPath, - object commandSource = null, - string parameterPath = null, - object parameterSource = null) where TGestureElement : Element, IGestureRecognizers + object? commandSource = null, + string? parameterPath = null, + object? parameterSource = null) where TGestureElement : Element, IGestureRecognizers => SwipeGesture(gestureElement, g => g.BindCommand(commandPath, commandSource, parameterPath, parameterSource)); /// Add a , @@ -35,9 +35,9 @@ public static TGestureElement BindSwipeGesture( public static TGestureElement BindTapGesture( this TGestureElement gestureElement, string commandPath = bindingContextPath, - object commandSource = null, - string parameterPath = null, - object parameterSource = null) where TGestureElement : Element, IGestureRecognizers + object? commandSource = null, + string? parameterPath = null, + object? parameterSource = null) where TGestureElement : Element, IGestureRecognizers => TapGesture(gestureElement, g => g.BindCommand(commandPath, commandSource, parameterPath, parameterSource)); /// Add a , diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/FuncConverter.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/FuncConverter.cs index ca14bacbc..d435ea093 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/FuncConverter.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/FuncConverter.cs @@ -6,25 +6,25 @@ namespace Xamarin.CommunityToolkit.Markup { public class FuncConverter : IValueConverter { - readonly Func convert; - readonly Func convertBack; + readonly Func? convert; + readonly Func? convertBack; - readonly Func convertWithParam; - readonly Func convertBackWithParam; + readonly Func? convertWithParam; + readonly Func? convertBackWithParam; - readonly Func convertWithParamAndCulture; - readonly Func convertBackWithParamAndCulture; + readonly Func? convertWithParamAndCulture; + readonly Func? convertBackWithParamAndCulture; - public FuncConverter(Func convertWithParamAndCulture = null, Func convertBackWithParamAndCulture = null) + public FuncConverter(Func? convertWithParamAndCulture = null, Func? convertBackWithParamAndCulture = null) { this.convertWithParamAndCulture = convertWithParamAndCulture; this.convertBackWithParamAndCulture = convertBackWithParamAndCulture; } - public FuncConverter(Func convertWithParam = null, Func convertBackWithParam = null) + public FuncConverter(Func? convertWithParam = null, Func? convertBackWithParam = null) { this.convertWithParam = convertWithParam; this.convertBackWithParam = convertBackWithParam; } - public FuncConverter(Func convert = null, Func convertBack = null) + public FuncConverter(Func? convert = null, Func? convertBack = null) { this.convert = convert; this.convertBack = convertBack; } - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { if (convert != null) { @@ -50,7 +50,7 @@ public object Convert(object value, Type targetType, object parameter, CultureIn return default(TDest); } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { if (convertBack != null) { @@ -79,19 +79,19 @@ public object ConvertBack(object value, Type targetType, object parameter, Cultu public class FuncConverter : FuncConverter { - public FuncConverter(Func convert = null, Func convertBack = null) + public FuncConverter(Func? convert = null, Func? convertBack = null) : base(convert, convertBack) { } } public class FuncConverter : FuncConverter { - public FuncConverter(Func convert = null, Func convertBack = null) + public FuncConverter(Func? convert = null, Func? convertBack = null) : base(convert, convertBack) { } } public class FuncConverter : FuncConverter { - public FuncConverter(Func convert = null, Func convertBack = null) + public FuncConverter(Func? convert = null, Func? convertBack = null) : base(convert, convertBack) { } } diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/FuncMultiConverter.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/FuncMultiConverter.cs index d7030c57e..398e36056 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/FuncMultiConverter.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/FuncMultiConverter.cs @@ -6,25 +6,25 @@ namespace Xamarin.CommunityToolkit.Markup { public class FuncMultiConverter : IMultiValueConverter { - readonly Func convert; - readonly Func convertBack; + readonly Func? convert; + readonly Func? convertBack; - readonly Func convertWithParam; - readonly Func convertBackWithParam; + readonly Func? convertWithParam; + readonly Func? convertBackWithParam; - readonly Func convertWithParamAndCulture; - readonly Func convertBackWithParamAndCulture; + readonly Func? convertWithParamAndCulture; + readonly Func? convertBackWithParamAndCulture; - public FuncMultiConverter(Func convertWithParamAndCulture = null, Func convertBackWithParamAndCulture = null) + public FuncMultiConverter(Func? convertWithParamAndCulture = null, Func? convertBackWithParamAndCulture = null) { this.convertWithParamAndCulture = convertWithParamAndCulture; this.convertBackWithParamAndCulture = convertBackWithParamAndCulture; } - public FuncMultiConverter(Func convertWithParam = null, Func convertBackWithParam = null) + public FuncMultiConverter(Func? convertWithParam = null, Func? convertBackWithParam = null) { this.convertWithParam = convertWithParam; this.convertBackWithParam = convertBackWithParam; } - public FuncMultiConverter(Func convert = null, Func convertBack = null) + public FuncMultiConverter(Func? convert = null, Func? convertBack = null) { this.convert = convert; this.convertBack = convertBack; } - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + public object? Convert(object[] values, Type targetType, object? parameter, CultureInfo culture) { if (convert != null) return convert(values); @@ -47,7 +47,7 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur return BindableProperty.UnsetValue; } - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + public object?[]? ConvertBack(object? value, Type[] targetTypes, object? parameter, CultureInfo culture) { if (convertBack != null) { @@ -76,85 +76,91 @@ public object[] ConvertBack(object value, Type[] targetTypes, object parameter, public class FuncMultiConverter : FuncMultiConverter { - static T To(object value) => value != null ? (T)value : default; + static T? To(object? value) => value != null ? (T)value : default; - static object[] ToObjects(ValueTuple values) => new object[] { values.Item1, values.Item2 }; + static object?[] ToObjects(ValueTuple values) => new object?[] { values.Item1, values.Item2 }; public FuncMultiConverter( - Func, TDest> convert = null, - Func> convertBack = null) + Func, TDest>? convert = null, + Func>? convertBack = null) : base( convert == null ? default(Func) : (object[] values) => convert((To(values[0]), To(values[1]))), - convertBack == null ? default(Func) : (TDest value) => ToObjects(convertBack(value))) { } + convertBack == null ? default(Func) : (TDest? value) => ToObjects(convertBack(value))) + { } } public class FuncMultiConverter : FuncMultiConverter { - static T To(object value) => value != null ? (T)value : default; + static T? To(object? value) => value != null ? (T)value : default; - static object[] ToObjects(ValueTuple values) => new object[] { values.Item1, values.Item2, values.Item3 }; + static object?[] ToObjects(ValueTuple values) => new object?[] { values.Item1, values.Item2, values.Item3 }; public FuncMultiConverter( - Func, TDest> convert = null, - Func> convertBack = null) + Func, TDest>? convert = null, + Func>? convertBack = null) : base( convert == null ? default(Func) : (object[] values) => convert((To(values[0]), To(values[1]), To(values[2]))), - convertBack == null ? default(Func) : (TDest value) => ToObjects(convertBack(value))) { } + convertBack == null ? default(Func) : (TDest? value) => ToObjects(convertBack(value))) + { } } public class FuncMultiConverter : FuncMultiConverter { - static T To(object value) => value != null ? (T)value : default; + static T? To(object? value) => value != null ? (T)value : default; - static object[] ToObjects(ValueTuple values) => new object[] { values.Item1, values.Item2, values.Item3, values.Item4 }; + static object?[] ToObjects(ValueTuple values) => new object?[] { values.Item1, values.Item2, values.Item3, values.Item4 }; public FuncMultiConverter( - Func, TDest> convert = null, - Func> convertBack = null) + Func, TDest>? convert = null, + Func>? convertBack = null) : base( convert == null ? default(Func) : (object[] values) => convert((To(values[0]), To(values[1]), To(values[2]), To(values[3]))), - convertBack == null ? default(Func) : (TDest value) => ToObjects(convertBack(value))) { } + convertBack == null ? default(Func) : (TDest? value) => ToObjects(convertBack(value))) + { } } public class FuncMultiConverterWithParam : FuncMultiConverter { - static T To(object value) => value != null ? (T)value : default; + static T? To(object? value) => value != null ? (T)value : default; - static object[] ToObjects(ValueTuple values) => new object[] { values.Item1, values.Item2 }; + static object?[] ToObjects(ValueTuple values) => new object?[] { values.Item1, values.Item2 }; public FuncMultiConverterWithParam( - Func, TParam, TDest> convert = null, - Func> convertBack = null) + Func, TParam?, TDest>? convert = null, + Func>? convertBack = null) : base( - convert == null ? default(Func) : (object[] values, TParam param) => convert((To(values[0]), To(values[1])), param), - convertBack == null ? default(Func) : (TDest value, TParam param) => ToObjects(convertBack(value, param))) { } + convert == null ? default(Func) : (object[] values, TParam? param) => convert((To(values[0]), To(values[1])), param), + convertBack == null ? default(Func) : (TDest? value, TParam? param) => ToObjects(convertBack(value, param))) + { } } public class FuncMultiConverterWithParam : FuncMultiConverter { - static T To(object value) => value != null ? (T)value : default; + static T? To(object value) => value != null ? (T)value : default; - static object[] ToObjects(ValueTuple values) => new object[] { values.Item1, values.Item2, values.Item3 }; + static object?[] ToObjects(ValueTuple values) => new object?[] { values.Item1, values.Item2, values.Item3 }; public FuncMultiConverterWithParam( - Func, TParam, TDest> convert = null, - Func> convertBack = null) + Func, TParam?, TDest>? convert = null, + Func>? convertBack = null) : base( - convert == null ? default(Func) : (object[] values, TParam param) => convert((To(values[0]), To(values[1]), To(values[2])), param), - convertBack == null ? default(Func) : (TDest value, TParam param) => ToObjects(convertBack(value, param))) { } + convert == null ? default(Func) : (object[] values, TParam? param) => convert((To(values[0]), To(values[1]), To(values[2])), param), + convertBack == null ? default(Func) : (TDest? value, TParam? param) => ToObjects(convertBack(value, param))) + { } } public class FuncMultiConverterWithParam : FuncMultiConverter { - static T To(object value) => value != null ? (T)value : default; + static T? To(object? value) => value != null ? (T)value : default; - static object[] ToObjects(ValueTuple values) => new object[] { values.Item1, values.Item2, values.Item3, values.Item4 }; + static object?[] ToObjects(ValueTuple values) => new object?[] { values.Item1, values.Item2, values.Item3, values.Item4 }; public FuncMultiConverterWithParam( - Func, TParam, TDest> convert = null, - Func> convertBack = null) + Func, TParam?, TDest>? convert = null, + Func>? convertBack = null) : base( - convert == null ? default(Func) : (object[] values, TParam param) => convert((To(values[0]), To(values[1]), To(values[2]), To(values[3])), param), - convertBack == null ? default(Func) : (TDest value, TParam param) => ToObjects(convertBack(value, param))) { } + convert == null ? default(Func) : (object[] values, TParam? param) => convert((To(values[0]), To(values[1]), To(values[2]), To(values[3])), param), + convertBack == null ? default(Func) : (TDest? value, TParam? param) => ToObjects(convertBack(value, param))) + { } } } \ No newline at end of file diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/RelativeLayout.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/RelativeLayout.cs index a5a3789a7..83f618f17 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/RelativeLayout.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/RelativeLayout.cs @@ -42,14 +42,14 @@ public class BoundsConstrainedView : ConstrainedView readonly Bounds bounds; public BoundsConstrainedView(View view, Bounds bounds) - : base(view) { this.bounds = bounds; } + : base(view) => this.bounds = bounds; public override void AddTo(RelativeLayout layout) => layout.Children.Add(view, bounds); } public class ExpressionsConstrainedView : ConstrainedView { - Expression x, y, width, height; + Expression? x, y, width, height; public ExpressionsConstrainedView(View view) : base(view) { } @@ -67,7 +67,7 @@ public ExpressionsConstrainedView(View view) public class ConstraintsConstrainedView : ConstrainedView { - Constraint x, y, width, height; + Constraint? x, y, width, height; public ConstraintsConstrainedView(View view) : base(view) { } @@ -103,7 +103,7 @@ public abstract class ConstrainedView { protected readonly View view; - protected ConstrainedView(View view) { this.view = view; } + protected ConstrainedView(View view) => this.view = view; public abstract void AddTo(RelativeLayout layout); } diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/Style.cs b/src/Markup/Xamarin.CommunityToolkit.Markup/Style.cs index e640f7ed3..66b7722f5 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/Style.cs +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/Style.cs @@ -4,7 +4,7 @@ namespace Xamarin.CommunityToolkit.Markup { public class Style where T : BindableObject { - public static implicit operator Style(Style style) => style?.FormsStyle; + public static implicit operator Style?(Style? style) => style?.FormsStyle; public Style FormsStyle { get; } diff --git a/src/Markup/Xamarin.CommunityToolkit.Markup/Xamarin.CommunityToolkit.Markup.csproj b/src/Markup/Xamarin.CommunityToolkit.Markup/Xamarin.CommunityToolkit.Markup.csproj index 93991dd56..60d2281de 100644 --- a/src/Markup/Xamarin.CommunityToolkit.Markup/Xamarin.CommunityToolkit.Markup.csproj +++ b/src/Markup/Xamarin.CommunityToolkit.Markup/Xamarin.CommunityToolkit.Markup.csproj @@ -32,6 +32,9 @@ true xamarin,xamarin.forms,toolkit,kit,communitytoolkit,xamarincommunitytoolkit,markup,csharpformarkup,csharp,csharpmarkup Debug;Release + enable + nullable + latest