diff --git a/PowerKit.Tests/BoolExtensionsTests.cs b/PowerKit.Tests/BoolExtensionsTests.cs index 6424e67..c4e3a64 100644 --- a/PowerKit.Tests/BoolExtensionsTests.cs +++ b/PowerKit.Tests/BoolExtensionsTests.cs @@ -15,4 +15,15 @@ public void ParseOrNull_Test() bool.ParseOrNull("yes").Should().BeNull(); bool.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + bool.ParseOrDefault("true").Should().BeTrue(); + bool.ParseOrDefault("false").Should().BeFalse(); + bool.ParseOrDefault("yes").Should().BeFalse(); + bool.ParseOrDefault("yes", true).Should().BeTrue(); + bool.ParseOrDefault(null).Should().BeFalse(); + } } diff --git a/PowerKit.Tests/DateTimeExtensionsTests.cs b/PowerKit.Tests/DateTimeExtensionsTests.cs index cd2f242..887e5e6 100644 --- a/PowerKit.Tests/DateTimeExtensionsTests.cs +++ b/PowerKit.Tests/DateTimeExtensionsTests.cs @@ -15,4 +15,17 @@ public void ParseOrNull_Test() DateTime.ParseOrNull("not a date").Should().BeNull(); DateTime.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + DateTime.ParseOrDefault("2024-06-15").Should().Be(new DateTime(2024, 6, 15)); + DateTime.ParseOrDefault("not a date").Should().Be(default(DateTime)); + DateTime + .ParseOrDefault("not a date", new DateTime(2000, 1, 1)) + .Should() + .Be(new DateTime(2000, 1, 1)); + DateTime.ParseOrDefault(null).Should().Be(default(DateTime)); + } } diff --git a/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs b/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs index 383ed04..d61d38e 100644 --- a/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs +++ b/PowerKit.Tests/DateTimeOffsetExtensionsTests.cs @@ -18,4 +18,20 @@ public void ParseOrNull_Test() DateTimeOffset.ParseOrNull("not a date").Should().BeNull(); DateTimeOffset.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + DateTimeOffset + .ParseOrDefault("2024-06-15T00:00:00+00:00") + .Should() + .Be(new DateTimeOffset(2024, 6, 15, 0, 0, 0, TimeSpan.Zero)); + DateTimeOffset.ParseOrDefault("not a date").Should().Be(default(DateTimeOffset)); + DateTimeOffset + .ParseOrDefault("not a date", new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero)) + .Should() + .Be(new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero)); + DateTimeOffset.ParseOrDefault(null).Should().Be(default(DateTimeOffset)); + } } diff --git a/PowerKit.Tests/DecimalExtensionsTests.cs b/PowerKit.Tests/DecimalExtensionsTests.cs index e586012..3b4710d 100644 --- a/PowerKit.Tests/DecimalExtensionsTests.cs +++ b/PowerKit.Tests/DecimalExtensionsTests.cs @@ -15,4 +15,15 @@ public void ParseOrNull_Test() decimal.ParseOrNull("abc").Should().BeNull(); decimal.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + decimal.ParseOrDefault("3.14").Should().Be(3.14m); + decimal.ParseOrDefault("-1.5").Should().Be(-1.5m); + decimal.ParseOrDefault("abc").Should().Be(0m); + decimal.ParseOrDefault("abc", -1m).Should().Be(-1m); + decimal.ParseOrDefault(null).Should().Be(0m); + } } diff --git a/PowerKit.Tests/DoubleExtensionsTests.cs b/PowerKit.Tests/DoubleExtensionsTests.cs index 12c69d5..56a75a1 100644 --- a/PowerKit.Tests/DoubleExtensionsTests.cs +++ b/PowerKit.Tests/DoubleExtensionsTests.cs @@ -15,4 +15,15 @@ public void ParseOrNull_Test() double.ParseOrNull("abc").Should().BeNull(); double.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + double.ParseOrDefault("3.14").Should().Be(3.14); + double.ParseOrDefault("-1.5").Should().Be(-1.5); + double.ParseOrDefault("abc").Should().Be(0.0); + double.ParseOrDefault("abc", -1.0).Should().Be(-1.0); + double.ParseOrDefault(null).Should().Be(0.0); + } } diff --git a/PowerKit.Tests/GuidExtensionsTests.cs b/PowerKit.Tests/GuidExtensionsTests.cs index db6978b..d427c7d 100644 --- a/PowerKit.Tests/GuidExtensionsTests.cs +++ b/PowerKit.Tests/GuidExtensionsTests.cs @@ -17,4 +17,18 @@ public void ParseOrNull_Test() Guid.ParseOrNull("not-a-guid").Should().BeNull(); Guid.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + Guid.ParseOrDefault("12345678-1234-1234-1234-123456789abc") + .Should() + .Be(new Guid("12345678-1234-1234-1234-123456789abc")); + Guid.ParseOrDefault("not-a-guid").Should().Be(Guid.Empty); + Guid.ParseOrDefault("not-a-guid", new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")) + .Should() + .Be(new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")); + Guid.ParseOrDefault(null).Should().Be(Guid.Empty); + } } diff --git a/PowerKit.Tests/IntExtensionsTests.cs b/PowerKit.Tests/IntExtensionsTests.cs index 95d04ac..722c8e8 100644 --- a/PowerKit.Tests/IntExtensionsTests.cs +++ b/PowerKit.Tests/IntExtensionsTests.cs @@ -15,4 +15,15 @@ public void ParseOrNull_Test() int.ParseOrNull("abc").Should().BeNull(); int.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + int.ParseOrDefault("42").Should().Be(42); + int.ParseOrDefault("-7").Should().Be(-7); + int.ParseOrDefault("abc").Should().Be(0); + int.ParseOrDefault("abc", -1).Should().Be(-1); + int.ParseOrDefault(null).Should().Be(0); + } } diff --git a/PowerKit.Tests/LongExtensionsTests.cs b/PowerKit.Tests/LongExtensionsTests.cs index 46b08e1..d36a9ff 100644 --- a/PowerKit.Tests/LongExtensionsTests.cs +++ b/PowerKit.Tests/LongExtensionsTests.cs @@ -15,4 +15,15 @@ public void ParseOrNull_Test() long.ParseOrNull("abc").Should().BeNull(); long.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + long.ParseOrDefault("9876543210").Should().Be(9876543210L); + long.ParseOrDefault("-1").Should().Be(-1L); + long.ParseOrDefault("abc").Should().Be(0L); + long.ParseOrDefault("abc", -1L).Should().Be(-1L); + long.ParseOrDefault(null).Should().Be(0L); + } } diff --git a/PowerKit.Tests/TimeSpanExtensionsTests.cs b/PowerKit.Tests/TimeSpanExtensionsTests.cs index 3bc5e6d..f54fb59 100644 --- a/PowerKit.Tests/TimeSpanExtensionsTests.cs +++ b/PowerKit.Tests/TimeSpanExtensionsTests.cs @@ -15,4 +15,17 @@ public void ParseOrNull_Test() TimeSpan.ParseOrNull("not a timespan").Should().BeNull(); TimeSpan.ParseOrNull(null).Should().BeNull(); } + + [Fact] + public void ParseOrDefault_Test() + { + // Act & assert + TimeSpan.ParseOrDefault("1:30:00").Should().Be(new TimeSpan(1, 30, 0)); + TimeSpan.ParseOrDefault("not a timespan").Should().Be(TimeSpan.Zero); + TimeSpan + .ParseOrDefault("not a timespan", TimeSpan.FromSeconds(5)) + .Should() + .Be(TimeSpan.FromSeconds(5)); + TimeSpan.ParseOrDefault(null).Should().Be(TimeSpan.Zero); + } } diff --git a/PowerKit/Extensions/BoolExtensions.cs b/PowerKit/Extensions/BoolExtensions.cs index ed76d1f..f70e36d 100644 --- a/PowerKit/Extensions/BoolExtensions.cs +++ b/PowerKit/Extensions/BoolExtensions.cs @@ -15,5 +15,11 @@ internal static class BoolExtensions /// public static bool? ParseOrNull(string? str) => bool.TryParse(str, out var result) ? result : null; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static bool ParseOrDefault(string? str, bool defaultValue = default) => + bool.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/DateTimeExtensions.cs b/PowerKit/Extensions/DateTimeExtensions.cs index 6cc7f33..c5354c5 100644 --- a/PowerKit/Extensions/DateTimeExtensions.cs +++ b/PowerKit/Extensions/DateTimeExtensions.cs @@ -27,5 +27,22 @@ DateTimeStyles styles /// public static DateTime? ParseOrNull(string? str) => DateTime.ParseOrNull(str, CultureInfo.CurrentCulture, DateTimeStyles.None); + + /// + /// Parses the string as a using the specified format provider and styles, + /// returning if parsing fails. + /// + public static DateTime ParseOrDefault( + string? str, + IFormatProvider? formatProvider, + DateTimeStyles styles, + DateTime defaultValue = default + ) => DateTime.ParseOrNull(str, formatProvider, styles) ?? defaultValue; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static DateTime ParseOrDefault(string? str, DateTime defaultValue = default) => + DateTime.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/DateTimeOffsetExtensions.cs b/PowerKit/Extensions/DateTimeOffsetExtensions.cs index 6cdeeb2..78e19d7 100644 --- a/PowerKit/Extensions/DateTimeOffsetExtensions.cs +++ b/PowerKit/Extensions/DateTimeOffsetExtensions.cs @@ -27,5 +27,24 @@ DateTimeStyles styles /// public static DateTimeOffset? ParseOrNull(string? str) => DateTimeOffset.ParseOrNull(str, CultureInfo.CurrentCulture, DateTimeStyles.None); + + /// + /// Parses the string as a using the specified format provider and styles, + /// returning if parsing fails. + /// + public static DateTimeOffset ParseOrDefault( + string? str, + IFormatProvider? formatProvider, + DateTimeStyles styles, + DateTimeOffset defaultValue = default + ) => DateTimeOffset.ParseOrNull(str, formatProvider, styles) ?? defaultValue; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static DateTimeOffset ParseOrDefault( + string? str, + DateTimeOffset defaultValue = default + ) => DateTimeOffset.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/DecimalExtensions.cs b/PowerKit/Extensions/DecimalExtensions.cs index 5d973ae..524c797 100644 --- a/PowerKit/Extensions/DecimalExtensions.cs +++ b/PowerKit/Extensions/DecimalExtensions.cs @@ -27,5 +27,22 @@ internal static class DecimalExtensions /// public static decimal? ParseOrNull(string? str) => decimal.ParseOrNull(str, NumberStyles.Number, CultureInfo.CurrentCulture); + + /// + /// Parses the string as a using the specified styles and format provider, + /// returning if parsing fails. + /// + public static decimal ParseOrDefault( + string? str, + NumberStyles styles, + IFormatProvider? formatProvider, + decimal defaultValue = default + ) => decimal.ParseOrNull(str, styles, formatProvider) ?? defaultValue; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static decimal ParseOrDefault(string? str, decimal defaultValue = default) => + decimal.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/DoubleExtensions.cs b/PowerKit/Extensions/DoubleExtensions.cs index c4fcac5..d9b33ae 100644 --- a/PowerKit/Extensions/DoubleExtensions.cs +++ b/PowerKit/Extensions/DoubleExtensions.cs @@ -31,5 +31,22 @@ internal static class DoubleExtensions NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.CurrentCulture ); + + /// + /// Parses the string as a using the specified styles and format provider, + /// returning if parsing fails. + /// + public static double ParseOrDefault( + string? str, + NumberStyles styles, + IFormatProvider? formatProvider, + double defaultValue = default + ) => double.ParseOrNull(str, styles, formatProvider) ?? defaultValue; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static double ParseOrDefault(string? str, double defaultValue = default) => + double.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/GuidExtensions.cs b/PowerKit/Extensions/GuidExtensions.cs index 53dfa74..247c27e 100644 --- a/PowerKit/Extensions/GuidExtensions.cs +++ b/PowerKit/Extensions/GuidExtensions.cs @@ -16,5 +16,11 @@ internal static class GuidExtensions /// public static Guid? ParseOrNull(string? str) => Guid.TryParse(str, out var result) ? result : null; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static Guid ParseOrDefault(string? str, Guid defaultValue = default) => + Guid.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/IntExtensions.cs b/PowerKit/Extensions/IntExtensions.cs index 445fd43..8e7e8ca 100644 --- a/PowerKit/Extensions/IntExtensions.cs +++ b/PowerKit/Extensions/IntExtensions.cs @@ -27,5 +27,22 @@ internal static class IntExtensions /// public static int? ParseOrNull(string? str) => int.ParseOrNull(str, NumberStyles.Integer, CultureInfo.CurrentCulture); + + /// + /// Parses the string as an using the specified styles and format provider, + /// returning if parsing fails. + /// + public static int ParseOrDefault( + string? str, + NumberStyles styles, + IFormatProvider? formatProvider, + int defaultValue = default + ) => int.ParseOrNull(str, styles, formatProvider) ?? defaultValue; + + /// + /// Parses the string as an , returning if parsing fails. + /// + public static int ParseOrDefault(string? str, int defaultValue = default) => + int.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/LongExtensions.cs b/PowerKit/Extensions/LongExtensions.cs index 6353138..343e717 100644 --- a/PowerKit/Extensions/LongExtensions.cs +++ b/PowerKit/Extensions/LongExtensions.cs @@ -27,5 +27,22 @@ internal static class LongExtensions /// public static long? ParseOrNull(string? str) => long.ParseOrNull(str, NumberStyles.Integer, CultureInfo.CurrentCulture); + + /// + /// Parses the string as a using the specified styles and format provider, + /// returning if parsing fails. + /// + public static long ParseOrDefault( + string? str, + NumberStyles styles, + IFormatProvider? formatProvider, + long defaultValue = default + ) => long.ParseOrNull(str, styles, formatProvider) ?? defaultValue; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static long ParseOrDefault(string? str, long defaultValue = default) => + long.ParseOrNull(str) ?? defaultValue; } } diff --git a/PowerKit/Extensions/TimeSpanExtensions.cs b/PowerKit/Extensions/TimeSpanExtensions.cs index f4da8e2..d0ce30a 100644 --- a/PowerKit/Extensions/TimeSpanExtensions.cs +++ b/PowerKit/Extensions/TimeSpanExtensions.cs @@ -24,5 +24,21 @@ internal static class TimeSpanExtensions /// public static TimeSpan? ParseOrNull(string? str) => TimeSpan.ParseOrNull(str, CultureInfo.CurrentCulture); + + /// + /// Parses the string as a using the specified format provider, + /// returning if parsing fails. + /// + public static TimeSpan ParseOrDefault( + string? str, + IFormatProvider? formatProvider, + TimeSpan defaultValue = default + ) => TimeSpan.ParseOrNull(str, formatProvider) ?? defaultValue; + + /// + /// Parses the string as a , returning if parsing fails. + /// + public static TimeSpan ParseOrDefault(string? str, TimeSpan defaultValue = default) => + TimeSpan.ParseOrNull(str) ?? defaultValue; } }