Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ csharp_prefer_braces = false:suggestion
#Style - expression bodied member options

# Expression-bodied members
csharp_style_expression_bodied_methods = false:suggestion
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_properties = true
csharp_style_expression_bodied_properties = when_on_single_line:suggestion
csharp_style_expression_bodied_indexers = false:warning
Expand Down
66 changes: 47 additions & 19 deletions Ical.Net.Tests/CalDateTimeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -234,20 +234,20 @@ public void EqualityShouldBeTransitive()
}


[Test, TestCaseSource(nameof(DateOnlyArithmeticTestCases))]
public (DateTime Value, bool HasTime) DateOnlyArithmeticTests(Func<IDateTime, IDateTime> operation)
[Test, TestCaseSource(nameof(DateOnlyValidArithmeticTestCases))]
public (DateTime Value, bool HasTime) DateOnlyValidArithmeticTests(Func<IDateTime, IDateTime> operation)
{
var result = operation(new CalDateTime(2025, 1, 15));
return (result.Value, result.HasTime);
}

public static IEnumerable DateOnlyArithmeticTestCases()
public static IEnumerable DateOnlyValidArithmeticTestCases()
{
var dateTime = new DateTime(2025, 1, 15);

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.Subtract(TimeSpan.FromDays(1))))
.Returns((dateTime.AddDays(-1), false))
.SetName($"{nameof(IDateTime.Subtract)} 1 day TimeSpan HasTime=false");
.SetName($"{nameof(IDateTime.Subtract)} 1 day TimeSpan");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.AddYears(1)))
.Returns((dateTime.AddYears(1), false))
Expand All @@ -263,31 +263,37 @@ public static IEnumerable DateOnlyArithmeticTestCases()

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.AddHours(24)))
.Returns((dateTime.AddHours(24), false))
.SetName($"{nameof(IDateTime.AddHours)} 24 hours HasTime=false");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.AddHours(1)))
.Returns((dateTime.AddHours(1), true))
.SetName($"{nameof(IDateTime.AddHours)} 1 hour HasTime=true");
.SetName($"{nameof(IDateTime.AddHours)} 24 hours");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.AddMinutes(24 * 60)))
.Returns((dateTime.AddMinutes(24 * 60), false))
.SetName($"{nameof(IDateTime.AddMinutes)} 1 day in minutes HasTime=false");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.AddMinutes(23 * 60)))
.Returns((dateTime.AddMinutes(23 * 60), true))
.SetName($"{nameof(IDateTime.AddMinutes)} 23 hours in minutes HasTime=true");
.SetName($"{nameof(IDateTime.AddMinutes)} 1 day in minutes");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.AddSeconds(TimeSpan.FromDays(1).Seconds)))
.Returns((dateTime.AddSeconds(TimeSpan.FromDays(1).Seconds), false))
.SetName($"{nameof(IDateTime.AddSeconds)} 1 day in seconds HasTime=false");
.SetName($"{nameof(IDateTime.AddSeconds)} 1 day in seconds");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.Add(TimeSpan.FromDays(1))))
.Returns((dateTime.Add(TimeSpan.FromDays(1)), false))
.SetName($"{nameof(IDateTime.Add)} 1 day TimeSpan HasTime=false");
.SetName($"{nameof(IDateTime.Add)} 1 day TimeSpan");

yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.Add(TimeSpan.FromSeconds(30))))
.Returns((dateTime.Add(TimeSpan.FromSeconds(30)), true))
.SetName($"{nameof(IDateTime.Add)} 30 seconds TimeSpan HasTime=true");
yield return new TestCaseData(new Func<IDateTime, IDateTime>(dt => dt.Add(TimeSpan.Zero)))
.Returns((dateTime.Add(TimeSpan.Zero), false))
.SetName($"{nameof(IDateTime.Add)} TimeSpan.Zero");
}

[Test]
public void DateOnlyInvalidArithmeticTests()
{
var dt = new CalDateTime(2025, 1, 15);

Assert.Multiple(() =>
{
Assert.That(() => dt.Add(TimeSpan.FromHours(1)), Throws.TypeOf<InvalidOperationException>());
Assert.That(() => dt.AddHours(2), Throws.TypeOf<InvalidOperationException>());
Assert.That(() => dt.AddMinutes(3), Throws.TypeOf<InvalidOperationException>());
Assert.That(() => dt.AddSeconds(4), Throws.TypeOf<InvalidOperationException>());
});
}

[Test]
Expand Down Expand Up @@ -316,4 +322,26 @@ public void Simple_PropertyAndMethod_HasTime_Tests()
Assert.That(new CalDateTime(new CalDateTime(2025, 1, 1)), Is.EqualTo(new CalDateTime(2025, 1, 1)));
});
}

public static IEnumerable<TestCaseData> AddAndSubtractTestCases()
{
yield return new TestCaseData(new CalDateTime(2024, 10, 27, 0, 0, 0, tzId: null), TimeSpan.FromHours(4))
.SetName("Floating");

yield return new TestCaseData(new CalDateTime(2024, 10, 27, 0, 0, 0, tzId: CalDateTime.UtcTzId), TimeSpan.FromHours(4))
.SetName("UTC");

yield return new TestCaseData(new CalDateTime(2024, 10, 27, 0, 0, 0, tzId: "Europe/Paris"), TimeSpan.FromHours(4))
.SetName("Zoned Date/Time with DST change");
}

[Test, TestCaseSource(nameof(AddAndSubtractTestCases))]
public void AddAndSubtract_ShouldBeReversible(CalDateTime t, TimeSpan d)
{
Assert.Multiple(() =>
{
Assert.That(t.Add(d).Subtract(d), Is.EqualTo(t));
Assert.That(t.Add(d).Subtract(t), Is.EqualTo(d));
});
}
}
Loading
Loading