private static void ConvertEventsToFreeBusy(
            ExchangeUser user,
            AtomEntryCollection entries,
            DateTimeRange coveredRange,
            List <string> busyMonthValues,
            List <string> busyBase64Data,
            List <string> tentativeMonthValues,
            List <string> tentativeBase64Data)
        {
            List <DateTimeRange> busyTimes      = new List <DateTimeRange>();
            List <DateTimeRange> tentativeTimes = new List <DateTimeRange>();

            foreach (EventEntry googleAppsEvent in entries)
            {
                ConvertEventToFreeBusy(user, googleAppsEvent, coveredRange, busyTimes, tentativeTimes);
            }

            FreeBusyConverter.CondenseFreeBusyTimes(busyTimes);
            FreeBusyConverter.CondenseFreeBusyTimes(tentativeTimes);

            FreeBusyConverter.ConvertDateTimeBlocksToBase64String(coveredRange.Start,
                                                                  coveredRange.End,
                                                                  busyTimes,
                                                                  busyMonthValues,
                                                                  busyBase64Data);

            FreeBusyConverter.ConvertDateTimeBlocksToBase64String(coveredRange.Start,
                                                                  coveredRange.End,
                                                                  tentativeTimes,
                                                                  tentativeMonthValues,
                                                                  tentativeBase64Data);
        }
        public void TestCondenseFreeBusyTimes()
        {
            DateTimeRange        range             = null;
            List <DateTimeRange> testFreeBusyTimes = new List <DateTimeRange>();
            List <DateTimeRange> expectedResult    = new List <DateTimeRange>();

            // The first test case is
            // Event 1 [.....]
            // Event 2    [.....]
            // Event 3       [.....]
            // Result  [...........]
            range = new DateTimeRange(DateTime.Parse("2007-06-01T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-01T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-01T07:30:00.000Z"),
                                      DateTime.Parse("2007-06-01T08:30:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-01T08:00:00.000Z"),
                                      DateTime.Parse("2007-06-01T09:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-01T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-01T09:00:00.000Z"));
            expectedResult.Add(range);

            // The second test case is
            // Event 1 [.....]
            // Event 2       [.....]
            // Result  [...........]
            range = new DateTimeRange(DateTime.Parse("2007-06-02T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-02T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-02T08:00:00.000Z"),
                                      DateTime.Parse("2007-06-02T09:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-02T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-02T09:00:00.000Z"));
            expectedResult.Add(range);

            // The third test case is
            // Event 1 [.....]
            // Event 2 [.....]
            // Result  [.....]
            range = new DateTimeRange(DateTime.Parse("2007-06-03T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-03T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-03T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-03T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-03T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-03T08:00:00.000Z"));
            expectedResult.Add(range);

            // The forth test case is
            // Event 1 [..]
            // Event 2    [.....]
            // Event 3          [..]
            // Result  [...........]
            range = new DateTimeRange(DateTime.Parse("2007-06-04T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-04T07:30:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-04T07:30:00.000Z"),
                                      DateTime.Parse("2007-06-04T08:30:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-04T08:30:00.000Z"),
                                      DateTime.Parse("2007-06-04T09:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-04T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-04T09:00:00.000Z"));
            expectedResult.Add(range);

            // The fifth test case is
            // Event 1 [..........]
            // Event 2   [.....]
            // Result  [..........]
            range = new DateTimeRange(DateTime.Parse("2007-06-05T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-05T09:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-05T07:30:00.000Z"),
                                      DateTime.Parse("2007-06-05T08:30:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-05T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-05T09:00:00.000Z"));
            expectedResult.Add(range);

            // The sixth test case is
            // Event 1 [.....]
            // Event 2 [...]
            // Result  [.....]
            range = new DateTimeRange(DateTime.Parse("2007-06-06T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-06T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-06T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-06T07:30:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-06T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-06T08:00:00.000Z"));
            expectedResult.Add(range);

            // The seventh test case is
            // Event 1 [.....]
            // Event 2   [...]
            // Result  [.....]
            range = new DateTimeRange(DateTime.Parse("2007-06-07T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-07T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-07T07:30:00.000Z"),
                                      DateTime.Parse("2007-06-07T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-07T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-07T08:00:00.000Z"));
            expectedResult.Add(range);

            // The eight test case is
            // Event 1 [...............]
            // Event 2   [...]
            // Event 3          [...]
            // Result  [...............]
            range = new DateTimeRange(DateTime.Parse("2007-06-08T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-08T10:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-08T07:30:00.000Z"),
                                      DateTime.Parse("2007-06-08T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-08T08:30:00.000Z"),
                                      DateTime.Parse("2007-06-08T09:00:00.000Z"));
            testFreeBusyTimes.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-08T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-08T10:00:00.000Z"));
            expectedResult.Add(range);

            // The ninth test case is
            // Event 1 [.....]
            // Event 2            [.....]
            // Result  [.....]    [.....]
            range = new DateTimeRange(DateTime.Parse("2007-06-09T07:00:00.000Z"),
                                      DateTime.Parse("2007-06-09T08:00:00.000Z"));
            testFreeBusyTimes.Add(range);
            expectedResult.Add(range);

            range = new DateTimeRange(DateTime.Parse("2007-06-09T09:00:00.000Z"),
                                      DateTime.Parse("2007-06-09T10:00:00.000Z"));
            testFreeBusyTimes.Add(range);
            expectedResult.Add(range);

            testFreeBusyTimes.Sort(ReverseCompareRanges);

            List <DateTimeRange> copyFreeBusyTimes = new List <DateTimeRange>();

            foreach (DateTimeRange temp in testFreeBusyTimes)
            {
                copyFreeBusyTimes.Add(new DateTimeRange(temp.Start, temp.End));
            }

            List <DateTimeRange> oldResult = OldCondenseFreeBusyTimes(copyFreeBusyTimes);

            FreeBusyConverter.CondenseFreeBusyTimes(testFreeBusyTimes);

            Assert.IsTrue(CompareRangeLists(testFreeBusyTimes, expectedResult));
            Assert.IsTrue(CompareRangeLists(testFreeBusyTimes, oldResult));
        }