rianjs / ical.net

ical.NET - an open source iCal library for .NET
MIT License
782 stars 230 forks source link

BYHOUR does not work when STARTDATE does not has time (Attached with unit test code) Appreciate if anyone can help? #535

Open sherlynwong opened 2 years ago

sherlynwong commented 2 years ago
    [Test]
    public void SkippedOccurrenceOnWeeklyPattern()
    {
        const int evaluationsCount = 1;
        var eventStart = new CalDateTime(new DateTime(2021, 11, 15, 0, 0, 0, DateTimeKind.Local)); //monday
        var eventEnd = new CalDateTime(new DateTime(2021, 11, 21 , 0, 0, 0, DateTimeKind.Local));//sunday
        var vEvent = new CalendarEvent
        {
            DtStart = eventStart,
            DtEnd = eventEnd,
            Duration = new TimeSpan(0,1,0,0)
        };

        var pattern = new RecurrencePattern
        {
            Frequency = FrequencyType.Weekly,
            ByDay = new List<WeekDay> { new WeekDay(DayOfWeek.Monday) },
            ByHour = new List<int>() { 2 }
        };

        vEvent.RecurrenceRules.Add(pattern);
        var calendar = new Calendar();
        calendar.Events.Add(vEvent);

        var intervalStart = eventStart;
        var intervalEnd = intervalStart.AddDays(7 * evaluationsCount);

        var occurrences = RecurrenceUtil.GetOccurrences(
            recurrable: vEvent,
            periodStart: intervalStart,
            periodEnd: intervalEnd,
            includeReferenceDateInResults: false);
        var occurrenceSet = new HashSet<IDateTime>(occurrences.Select(o => o.Period.StartTime));

        Assert.AreEqual(evaluationsCount, occurrenceSet.Count);

        var observed = occurrenceSet.FirstOrDefault().AsDateTimeOffset;
        var expected = new CalDateTime(2021, 11, 15, 2, 0, 0).AsDateTimeOffset;
        var isEquals = observed.Equals(expected);
        Assert.IsTrue(isEquals, $"Expected {expected.ToString("s")}, but Observed {observed.ToString("s")}");
    }

Attached with the unit test.

Expected 2021-11-15T02:00:00, but Observed 2021-11-15T00:00:00

Suspect the issue caused by this method

ical.net-master\src\Ical.Net\Evaluation\RecurrencePatternEvaluator.cs
method HashSet Evaluate(IDateTime referenceDate, DateTime periodStart, DateTime periodEnd, bool includeReferenceDateInResults)

The TIME of expected occurrence somehow goes missing