public void MSOUTSPS_S02_TC36_TriggerExceptionDeletion_UpdateRecurrenceData()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            #region  Add one recurrence item

            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);
            cmds.Add(MethodCmdEnum.New);

            // Setting recurring setting
            DateTime eventDateOfRecurrence = DateTime.Today.Date.AddDays(1);
            string eventTitle = this.GetUniqueListItemTitle("DailyRecurrenceEvent");
            Dictionary<string, string> settingsOfDailyRecurring = this.GetDailyRecurrenceSettingWithwindowEnd(eventTitle, eventDateOfRecurrence, "1", 10);
            List<Dictionary<string, string>> addedItemsOfRecurrence = new List<Dictionary<string, string>>();
            addedItemsOfRecurrence.Add(settingsOfDailyRecurring);

            // add a  recurrence appointment item whose duration is 10 days, and each instance of this recurrence item will be repeat on "Daily". There should be 10 instances of this item.
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addedItemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

            // Get list item id from the response of UpdateListItems operation.
            this.VerifyResponseOfUpdateListItem(updateResult);
            List<string> addedRecurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);
            XmlNode[] zrowItemsOfRecurrenceAppointment = this.GetZrowItems(updateResult.Results[0].Any);

            // Validate the RecurrenceData Field
            string updatedRecurrenceDataValue = Common.GetZrowAttributeValue(zrowItemsOfRecurrenceAppointment, 0, "ows_RecurrenceData");
            this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML));

            #endregion  Add one recurrence item

            #region Add exception item
            // add an exception appointment item whose event day is different from recurrence item.
            DateTime exceptionEventDate = eventDateOfRecurrence.AddDays(1).AddHours(2);

            // The second recurrence instance will be replaced by exception item.
            DateTime overwrittenRecerrenceEventDate = eventDateOfRecurrence.AddDays(1);

            // Get the recurrence item id.
            string recurrenceItemId = addedRecurrenceItemIds[0];

            // Set the exception item setting.
            string exceptionItemTitle = this.GetUniqueListItemTitle("ExceptionItem");
            Dictionary<string, string> settingsOfException = this.GetExceptionsItemSettingForRecurrenceEvent(
                                                                                exceptionEventDate,
                                                                                overwrittenRecerrenceEventDate,
                                                                                exceptionItemTitle,
                                                                                recurrenceItemId,
                                                                                settingsOfDailyRecurring);

            List<Dictionary<string, string>> addeditemsOfException = new List<Dictionary<string, string>>();
            addeditemsOfException.Add(settingsOfException);
            UpdateListItemsUpdates updatesOfException = this.CreateUpdateListItems(cmds, addeditemsOfException, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResultOfException = OutspsAdapter.UpdateListItems(listId, updatesOfException);

            // Get the exception item Id, and only add 1 exception item in this UpdateListItems call.
            List<string> exceptionItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResultOfException, 1);

            #endregion Add exception item

            #region Update the RecurrenData field to trigger exception deletion.

            // Update the RecurrenceData field and append the deleteExceptions element.
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();

            // recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.mo;

            // Set the windowEnd value, the recurrence will be end on one month later, and the repeat frequency is weekly.
            DateTime winEndDate = eventDateOfRecurrence.Date.AddDays(30);
            recurrenceXMLData.recurrence.rule.Item = winEndDate;

            // Repeat Pattern, set it as weekly repeat.
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();

            // Setting the WeeklyFrequencyValue
            RepeatPatternWeekly repeatPatternWeeklyData = new RepeatPatternWeekly();
            repeatPatternWeeklyData.weekFrequency = "1";
            repeatPatternWeeklyData.mo = TrueFalseDOW.TRUE;
            repeatPatternWeeklyData.moSpecified = true;
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternWeeklyData;

            // Update the RecurrenData field
            string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);
            settingsOfDailyRecurring["RecurrenceData"] = recurrenceXMLString;

            List<MethodCmdEnum> updateRecurrencecmds = new List<MethodCmdEnum>(1);
            updateRecurrencecmds.Add(MethodCmdEnum.Update);

            // Set target update list item
            settingsOfDailyRecurring.Add("ID", recurrenceItemId);

            // Update the recurrence item with updated RecurrenceData field value.
            List<Dictionary<string, string>> updatedRecurrenceSettings = new List<Dictionary<string, string>>();
            updatedRecurrenceSettings.Add(settingsOfDailyRecurring);
            UpdateListItemsUpdates updatesOfDeletion = this.CreateUpdateListItems(updateRecurrencecmds, updatedRecurrenceSettings, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResultOfTriggerExceptionDeletion = OutspsAdapter.UpdateListItems(listId, updatesOfDeletion);
            this.VerifyResponseOfUpdateListItem(updateResultOfTriggerExceptionDeletion);

            #endregion Update the RecurrenData field to trigger exception deletion.

            XmlNode[] zrowItemsOfGetListItemChangesSinceToken = this.GetListItemsChangesFromSUT(listId);

            // If the exception item data does not present in zrow items array in response of GetListItemChangesSinceToken, then capture R445023, R900
            int zrowIndexOfExceptionItem = this.TryGetZrowItemIndexByListItemId(zrowItemsOfGetListItemChangesSinceToken, exceptionItemIds[0]);

            if (Common.IsRequirementEnabled(445023, this.Site))
            {
                this.Site.Assert.AreEqual<int>(
                                        -1,
                                        zrowIndexOfExceptionItem,
                                        "The exception item data should absent in zrow items array in response of GetListItemChangesSinceToken");

                // Verify MS-OUTSPS requirement: MS-OUTSPS_R445023
                this.Site.CaptureRequirement(
                                          445023,
                                          @"[In Appendix B: Product Behavior] Implementation does trigger exception deletion when RecurrenceData is updated.(<27>Windows SharePoint Services3.0 and above does delete exception items when these properties are updated.)");
            }

            this.Site.Assert.AreEqual<int>(
                                       -1,
                                       zrowIndexOfExceptionItem,
                                       "The exception item data should absent in zrow items array in response of GetListItemChangesSinceToken");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R900
            this.Site.CaptureRequirement(
                                      900,
                                      @"[In RecurrenceXML complex type]deleteExceptions: This element MUST be present if and only if RecurrenceXML is written by a protocol client in UpdateListItems (section 3.1.4.10) and the protocol client requests that the protocol server delete all exception items for this recurrence. See section 3.2.1.1 for details about exception items and recurrences.");
        }
        public void MSOUTSPS_S02_TC01_OperationListItemsForAppointment()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            Dictionary<string, string> recurEventFieldsSetting = new Dictionary<string, string>();
            DateTime eventDate = DateTime.Today.Date.AddDays(1);
            DateTime endDate = eventDate.AddHours(1);
            string eventDateValue = this.GetGeneralFormatTimeString(eventDate);
            string endDateValue = this.GetGeneralFormatTimeString(endDate);
            string eventTitle = this.GetUniqueListItemTitle("RecurrenceEvent");

            // Recurring data
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();
            RepeatPatternDaily repeatPatternDailyData = new RepeatPatternDaily();

            // Setting the dayFrequencyValue
            repeatPatternDailyData.dayFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDailyData;
            recurrenceXMLData.recurrence.rule.Item = "7";
            string recurrenceXmlString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Setting necessary fields' value
            recurEventFieldsSetting.Add("EventDate", eventDateValue);

            // The ending date and time of the appointment.
            recurEventFieldsSetting.Add("EndDate", endDateValue);

            // If the EventType indicates a recurring event, then fRecurrence MUST be "1". 
            recurEventFieldsSetting.Add("EventType", "1");

            // "0" means this is not an all-day event.
            recurEventFieldsSetting.Add("fAllDayEvent", "0");

            // "1" means this is a recurrence event.
            recurEventFieldsSetting.Add("fRecurrence", "1");

            // If EventType is "1", this property MUST contain a valid RecurrenceXML.
            recurEventFieldsSetting.Add("RecurrenceData", recurrenceXmlString);

            // If EventType is "1", this property MUST contain a valid TimeZoneXML.
            TimeZoneXML customPacificTimeZone = this.GetCustomPacificTimeZoneXmlSetting();
            recurEventFieldsSetting.Add("XMLTZone", this.GetTimeZoneXMLString(customPacificTimeZone));

            // Setting Duration field's value
            recurEventFieldsSetting.Add("Duration", "0");
            recurEventFieldsSetting.Add("Title", eventTitle);

            List<Dictionary<string, string>> addeditemsOfRecurrence = new List<Dictionary<string, string>>();
            addeditemsOfRecurrence.Add(recurEventFieldsSetting);

            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);
            cmds.Add(MethodCmdEnum.New);

            // add a  recurrence appointment item
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addeditemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);
            this.VerifyResponseOfUpdateListItem(updateResult);

            XmlNode[] zrowitems = this.GetListItemsChangesFromSUT(listId);
            int listItemIndex = this.GetZrowItemIndexByListItemId(zrowitems, "1");
            string actualEventDateValue = Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_EventDate");
            string actualEndDateValue = Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_EndDate");
            string actualTimeZone = Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_XMLTZone");
            #region Capture code
            
            // Verify MS-OUTSPS requirement: MS-OUTSPS_R879
            this.Site.CaptureRequirementIfAreEqual<string>(
                this.GetTimeZoneXMLString(customPacificTimeZone),
                actualTimeZone,
                879,
                "[In Complex Types][The complex type]TimeZoneRule Contains daylight saving time (DST) biases and TransitionDate elements (section 2.2.4.8).");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R880
            // TimeZoneXML is included in request, this requirement can be captured directly if the operation executes successfully.
            this.Site.CaptureRequirement(
                880,
                "[In Complex Types][The complex type]TimeZoneXML Contains a TimeZoneRule (section 2.2.4.6).");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R950
            // TimeZoneXML is included in request, this requirement can be captured directly if the operation executes successfully.
            this.Site.CaptureRequirement(
                950,
                @"[In TimeZoneXML complex type]The TimeZoneXML complex type contains a TimeZoneRule (section 2.2.4.6) to define a time zone.
                <s:complexType name=""TimeZoneXML"">
                  <s:sequence>
                    <s:element name=""timeZoneRule"" type=""tns:TimeZoneRule"" />
                  </s:sequence>
                </s:complexType>");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R952
            // TimeZoneXML is included in request, this requirement can be captured directly if the operation executes successfully.
            this.Site.CaptureRequirement(
                952,
                @"[In TransitionDate complex type] The TransitionDate complex type contains transition dates for DST.
                <s:complexType name=""TransitionDate"">
                  <s:sequence>
                    <s:element name=""transitionRule"">
                      <s:complexType>
                        <s:simpleContent>
                          <s:extension base=""s:string"">
                            <s:attribute name=""day"" type=""tns:DayOfWeek"" default=""su"" use=""optional"" />
                            <s:attribute name=""month"" type=""s:integer"" use=""required"" />
                            <s:attribute name=""dayOfMonth"" type=""s:integer"" use=""optional"" />
                            <s:attribute name=""weekdayOfMonth"" type=""tns:WeekdayOfMonth"" default=""first"" use=""optional"" />
                          </s:extension>
                        </s:simpleContent>
                      </s:complexType>
                    </s:element>
                    <s:element name=""transitionTime"" type=""s:string"" />
                  </s:sequence>
                </s:complexType>");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R881
            this.Site.CaptureRequirementIfAreEqual<string>(
                this.GetTimeZoneXMLString(customPacificTimeZone),
                actualTimeZone,
                881,
                "[In Complex Types][The complex type]TransitionDate Contains DST transition dates.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R945
            // TimeZoneRule is included in request, this requirement can be captured directly if the operation executes successfully.
            this.Site.CaptureRequirement(
                945,
                @"[In TimeZoneRule complex type] The TimeZoneRule complex type contains DST biases and TransitionDate (section 2.2.4.8) elements.
                <s:complexType name=""TimeZoneRule"">
                  <s:sequence>
                    <s:element name=""standardBias"" type=""s:integer"" />
                    <s:element name=""additionalDaylightBias"" type=""s:integer"" minOccurs=""0"" />
                    <s:element name=""standardDate"" type=""s1:TransitionDate"" minOccurs=""0"" />
                    <s:element name=""daylightDate"" type=""s1:TransitionDate"" minOccurs=""0"" />
                  </s:sequence>
                </s:complexType>");

            // If the EndDate and EventDate fields' values equal to the values the client set in upon steps, then capture R1264
            DateTime actualEndDate;
            if (!DateTime.TryParse(actualEndDateValue, out actualEndDate))
            {
                this.Site.Assert.Fail("The EndDate field value should be a valid DateTime format.");
            }

            DateTime actualEventDate;
            if (!DateTime.TryParse(actualEventDateValue, out actualEventDate))
            {
                this.Site.Assert.Fail("The EventDate field value should be a valid DateTime format.");
            }

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R267
            this.Site.CaptureRequirementIfIsTrue(
                DateTime.Parse(actualEndDateValue) >= DateTime.Parse(actualEventDateValue),
                267,
                "[In Appointment-Specific Schema]EndDate MUST be equal to or later than EventDate.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R271
            this.Site.CaptureRequirementIfIsTrue(
                DateTime.Parse(actualEndDateValue) >= DateTime.Parse(actualEventDateValue),
                271,
                "[In Appointment-Specific Schema]EventDate MUST be equal to or earlier than EndDate.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R272
            this.Site.CaptureRequirementIfIsFalse(
                string.IsNullOrEmpty(actualEventDateValue),
                272,
                "[In Appointment-Specific Schema]EventDate MUST NOT be empty or missing.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R275
            this.Site.CaptureRequirementIfIsFalse(
                string.IsNullOrEmpty(Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_EventType")),
                275,
                "[In Appointment-Specific Schema]EventType MUST NOT be empty or missing.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R288
            this.Site.CaptureRequirementIfIsFalse(
                string.IsNullOrEmpty(Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_fRecurrence")),
                288,
                "[In Appointment-Specific Schema]fRecurrence MUST NOT be empty or missing.");

            #endregion
        }
        public void MSOUTSPS_S02_TC27_RecurrenceAppointmentItem_TrueFalseDOWSimleType()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            // Setting recurring setting
            DateTime eventDateOfRecurrence = DateTime.Today.Date.AddDays(1);
            Dictionary<string, string> settingsOfDailyRecurring = this.GetDailyRecurrenceSettingWithwindowEnd(this.GetUniqueListItemTitle("WeeklyRecurrence"), eventDateOfRecurrence, "1", 10);

            // Setting common recurrenceXMLData setting
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.mo;

            // Set the windowEnd value, the recurrence will be end on one month later, and the repeat frequency is weekly.
            DateTime winEndDate = eventDateOfRecurrence.Date.AddMonths(1);
            recurrenceXMLData.recurrence.rule.Item = winEndDate;

            // Repeat Pattern, set it as weekly repeat.
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();

            // Setting the monthFrequency. every month repeat.
            RepeatPatternWeekly repeatPatternWeekly = new RepeatPatternWeekly();
            repeatPatternWeekly.weekFrequency = "1";

            // Set TrueFalseDOW.True
            repeatPatternWeekly.mo = TrueFalseDOW.TRUE;
            repeatPatternWeekly.moSpecified = true;

            // Set TrueFalseDOW.FALSE
            repeatPatternWeekly.tu = TrueFalseDOW.FALSE;
            repeatPatternWeekly.tuSpecified = true;

            // Set TrueFalseDOW.@true
            repeatPatternWeekly.we = TrueFalseDOW.@true;
            repeatPatternWeekly.weSpecified = true;

            // Set TrueFalseDOW.@false
            repeatPatternWeekly.th = TrueFalseDOW.@false;
            repeatPatternWeekly.thSpecified = true;

            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternWeekly;
            string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);
            this.Site.Assert.IsTrue(
                            settingsOfDailyRecurring.ContainsKey("RecurrenceData"),
                            "The fields setting should contain RecurrenceData field setting.");

            settingsOfDailyRecurring["RecurrenceData"] = recurrenceXMLString;

            List<Dictionary<string, string>> addedItemsOfRecurrence = new List<Dictionary<string, string>>();
            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>();

            addedItemsOfRecurrence.Add(settingsOfDailyRecurring);
            cmds.Add(MethodCmdEnum.New);

            // Add list item with specified TrueFalseDOW values
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addedItemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

            // Get the listItem id and the related RecurrenceData
            this.VerifyResponseOfUpdateListItem(updateResult);
            List<string> addedRecurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);

            XmlNode[] zrowItems = this.GetListItemsChangesFromSUT(listId);
            int zrowIndexOfAddedItem = this.GetZrowItemIndexByListItemId(zrowItems, addedRecurrenceItemIds[0]);
            string actualRecurrenceData = Common.GetZrowAttributeValue(zrowItems, zrowIndexOfAddedItem, "ows_RecurrenceData");

            // If the actual RecurrenceData field value is equal to the value set in the request, then capture R1041, R1042, R1043, R1044
            this.Site.Assert.AreEqual<string>(
                                recurrenceXMLString.ToLower(),
                                actualRecurrenceData.ToLower(),
                                "The actual RecurrenceData field value is equal to the value set in the request of UpdateListItems operation.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1041
            this.Site.CaptureRequirement(
                        1041,
                        @"[TrueFalseDOW][The enumeration value]TRUE[of the type TrueFalseDOW means]true");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1042
            this.Site.CaptureRequirement(
                        1042,
                        @"[TrueFalseDOW][The enumeration value]FALSE[of the type TrueFalseDOW means]false");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1043
            this.Site.CaptureRequirement(
                        1043,
                        @"[TrueFalseDOW][The enumeration value]true[of the type TrueFalseDOW means]true");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1044
            this.Site.CaptureRequirement(
                        1044,
                        @"[TrueFalseDOW][The enumeration value]false[of the type TrueFalseDOW means]false");
        }
        public void MSOUTSPS_S02_TC28_OperationListItems_WeekdayOfMonth()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            #region  Add 5 recurrence item

            // Setting recurring setting
            DateTime eventDateOfRecurrence = DateTime.Today.Date.AddDays(1);

            // Setting common recurrenceXMLData setting
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.mo;

            // Set the windowEnd value, the recurrence will be end on one year later, and the repeat frequency is month.
            DateTime winEndDate = eventDateOfRecurrence.Date.AddYears(1);
            recurrenceXMLData.recurrence.rule.Item = winEndDate;

            // Repeat Pattern, set it as weekly repeat.
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();

            // Setting the monthFrequency. every month repeat.
            RepeatPatternMonthlyByDay repeatPatternMonthlyByDay = new RepeatPatternMonthlyByDay();
            repeatPatternMonthlyByDay.monthFrequency = 1;
            repeatPatternMonthlyByDay.monthFrequencySpecified = true;
            repeatPatternMonthlyByDay.fr = TrueFalseDOW.TRUE;
            repeatPatternMonthlyByDay.moSpecified = true;
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternMonthlyByDay;

            // Add 5 recurrence items with 5 values of WeekdayOfMonth enum.
            string[] namesOfWeekdayOfMonthEnum = Enum.GetNames(typeof(WeekdayOfMonth));
            Dictionary<string, string> listItemRecurrenceDataSettings = new Dictionary<string, string>();
            foreach (string enumNameItem in namesOfWeekdayOfMonthEnum)
            {
                List<Dictionary<string, string>> addedItemsOfRecurrence = new List<Dictionary<string, string>>();
                List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);

                string eventTitle = this.GetUniqueListItemTitle("MonthlyByDay");
                Dictionary<string, string> settingsOfDailyRecurring = this.GetDailyRecurrenceSettingWithwindowEnd(this.GetUniqueListItemTitle("DailyRecurrenceEvent"), eventDateOfRecurrence, "1", 10);
                this.Site.Assert.IsTrue(
                               settingsOfDailyRecurring.ContainsKey("RecurrenceData"),
                               "The fields setting should contain RecurrenceData field's setting.");

                this.Site.Assert.IsTrue(
                                     settingsOfDailyRecurring.ContainsKey("Title"),
                                     "The fields setting should contain Title field's setting.");

                settingsOfDailyRecurring["Title"] = eventTitle;

                RepeatPatternMonthlyByDay currentRepeatPattern = recurrenceXMLData.recurrence.rule.repeat.Item as RepeatPatternMonthlyByDay;
                this.Site.Assert.IsNotNull(currentRepeatPattern, "The RepeatPattern should be RepeatPatternMonthlyByDay type.");

                // Update the RecurrenData field
                WeekdayOfMonth currentWeekdayOfMonthValue = (WeekdayOfMonth)Enum.Parse(typeof(WeekdayOfMonth), enumNameItem, true);
                currentRepeatPattern.weekdayOfMonthSpecified = true;
                currentRepeatPattern.weekdayOfMonth = currentWeekdayOfMonthValue;
                string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);
                settingsOfDailyRecurring["RecurrenceData"] = recurrenceXMLString;

                // Add current list item
                addedItemsOfRecurrence.Add(settingsOfDailyRecurring);
                cmds.Add(MethodCmdEnum.New);

                UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addedItemsOfRecurrence, OnErrorEnum.Continue);
                UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

                // Get the listItem id and the related RecurrenceData
                this.VerifyResponseOfUpdateListItem(updateResult);
                List<string> addedRecurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);
                listItemRecurrenceDataSettings.Add(addedRecurrenceItemIds[0], recurrenceXMLString);
            }

            this.Site.Assert.AreEqual<int>(
                                    namesOfWeekdayOfMonthEnum.Length,
                                    listItemRecurrenceDataSettings.Count,
                                    "There should be match number of list items' Recurrence data setting");

            #endregion  Add 5 recurrence item

            XmlNode[] zrowItems = this.GetListItemsChangesFromSUT(listId);
            this.Site.Assert.AreEqual<int>(
                                    namesOfWeekdayOfMonthEnum.Length,
                                    zrowItems.Count(),
                                    "The current list should contain [{0}] list items.",
                                    namesOfWeekdayOfMonthEnum.Length);

            // Verify each WeekdayOfMonth value can be set in protocol SUT successfully.
            foreach (KeyValuePair<string, string> listItemRecurrenceDataItem in listItemRecurrenceDataSettings)
            {
                string currentListItemId = listItemRecurrenceDataItem.Key;
                int zrowIndexOfCurrentListItemId = this.GetZrowItemIndexByListItemId(zrowItems, currentListItemId);
                string actualRecurrenceData = Common.GetZrowAttributeValue(zrowItems, zrowIndexOfCurrentListItemId, "ows_RecurrenceData");
                this.Site.Assert.IsFalse(
                                string.IsNullOrEmpty(actualRecurrenceData),
                                "The actual RecurrenceData field should have value.");

                string expectedRecurrenceData = listItemRecurrenceDataItem.Value.ToLower();
                this.Site.Assert.AreEqual<string>(
                                    expectedRecurrenceData.ToLower(),
                                    actualRecurrenceData.ToLower(),
                                    "The RecurrenceData field value should match the value set in the request of UpdateListItems operation.");
            }

            // If passes upon verification, then capture R1045, R1047, R1048, R1049, R1050, R1051
            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1045
            this.Site.CaptureRequirement(
                                1045,
                                @"[In WeekdayOfMonth] When combined with a DayOfWeek or DayOfWeekOrMonth value, the WeekdayOfMonth simple type specifies a day of a week or month.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1047
            this.Site.CaptureRequirement(
                                1047,
                                @"[In WeekdayOfMonth][The enumeration value]first[of the type WeekdayOfMonth means]First");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1048
            this.Site.CaptureRequirement(
                                1048,
                                @"[In WeekdayOfMonth][The enumeration value]second[of the type WeekdayOfMonth means]Second");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1049
            this.Site.CaptureRequirement(
                                1049,
                                @"[In WeekdayOfMonth][The enumeration value]third[of the type WeekdayOfMonth means]Third");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1050
            this.Site.CaptureRequirement(
                                1050,
                                @"[In WeekdayOfMonth][The enumeration value]fourth[of the type WeekdayOfMonth means]Fourth");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1051
            this.Site.CaptureRequirement(
                                1051,
                                @"[In WeekdayOfMonth][The enumeration value]last[of the type WeekdayOfMonth means]Last");
        }
        public void MSOUTSPS_S02_TC22_RecurrenceAppointmentItem_RepeatPattern()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            // Setting recurring setting
            DateTime eventDateOfRecurrence = DateTime.Today.Date.AddDays(1);
            Dictionary<string, string> settingsOfDailyRecurring = this.GetDailyRecurrenceSettingWithwindowEnd(this.GetUniqueListItemTitle("DailyRecurrenceEvent"), eventDateOfRecurrence, "1", 10);
            this.Site.Assert.IsTrue(
                            settingsOfDailyRecurring.ContainsKey("RecurrenceData"),
                            "The fields setting collection should contain RecurrenceData field setting.");

            // Setting a daily recurrence setting for RecurrenceData field.
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Set the windowEnd value, the recurrence will be end on one week from current date.
            DateTime winEndDate = eventDateOfRecurrence.Date.AddDays(7);
            recurrenceXMLData.recurrence.rule.Item = winEndDate;

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();

            // Setting the RepeatPatternDaily
            RepeatPatternDaily repeatPatternDailyData = new RepeatPatternDaily();
            repeatPatternDailyData.dayFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDailyData;
            string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Setting the RecurrenceData field with RepeatPattern.daily
            settingsOfDailyRecurring["RecurrenceData"] = recurrenceXMLString;

            #region add a recurrence item

            List<Dictionary<string, string>> addedItemsOfRecurrence = new List<Dictionary<string, string>>();
            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);

            // Add current list item
            addedItemsOfRecurrence.Add(settingsOfDailyRecurring);
            cmds.Add(MethodCmdEnum.New);

            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addedItemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

            // Get the listItem id.
            this.VerifyResponseOfUpdateListItem(updateResult);
            List<string> addedRecurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);

            #endregion add a recurrence item

            XmlNode[] zrowItems = this.GetListItemsChangesFromSUT(listId);
            int zrowIndex = this.GetZrowItemIndexByListItemId(zrowItems, addedRecurrenceItemIds[0]);
            string actualRecurrenceXMLStringValue = Common.GetZrowAttributeValue(zrowItems, zrowIndex, "ows_RecurrenceData");

            // If the RecurrenceData field value equal to set in the request of UpdateListItems, that means setting of RepeatPattern.daily is set in the protocol SUT. If this verification passes then capture R903
            this.Site.Assert.AreEqual<string>(
                                    recurrenceXMLString.ToLower(),
                                    actualRecurrenceXMLStringValue.ToLower(),
                                    "The RecurrenceData value equal to set in the request of UpdateListItems");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R903
            this.Site.CaptureRequirement(
                           903,
                           @"[In RepeatPattern complex type]daily: If the recurrence is a daily recurrence, the daily element will be present.");
        }
        public void MSOUTSPS_S02_TC26_OperationListItems_DayOfWeekOrMonthSimpleType()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            #region  Add 5 recurrence item

            // Setting recurring setting
            DateTime eventDateOfRecurrence = DateTime.Today.Date.AddDays(1);

            // Setting common recurrenceXMLData setting
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();

            // Set the windowEnd value, the recurrence will be end on one week later, and the repeat frequency is daily.
            DateTime winEndDate = eventDateOfRecurrence.Date.AddDays(7);
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.Item = winEndDate;

            // Repeat Pattern, set it as weekly repeat.
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();

            // Setting the monthFrequency. every month repeat.
            RepeatPatternDaily repeatPatternDaily = new RepeatPatternDaily();
            repeatPatternDaily.dayFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDaily;

            // Add recurrence items with 10 values of WeekdayOfMonth enum.
            string[] namesOfDayOfWeekOrMonth = Enum.GetNames(typeof(DayOfWeekOrMonth));
            Dictionary<string, string> listItemRecurrenceDataSettings = new Dictionary<string, string>();
            foreach (string enumNameItem in namesOfDayOfWeekOrMonth)
            {
                List<Dictionary<string, string>> addedItemsOfRecurrence = new List<Dictionary<string, string>>();
                List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);

                string eventTitle = this.GetUniqueListItemTitle("DayOfWeekOrMonth");
                Dictionary<string, string> settingsOfDailyRecurring = this.GetDailyRecurrenceSettingWithwindowEnd(this.GetUniqueListItemTitle("DailyRecurrenceEvent"), eventDateOfRecurrence, "1", 10);
                this.Site.Assert.IsTrue(
                               settingsOfDailyRecurring.ContainsKey("RecurrenceData"),
                               "The fields setting should contain RecurrenceData field's setting.");

                this.Site.Assert.IsTrue(
                                     settingsOfDailyRecurring.ContainsKey("Title"),
                                     "The fields setting should contain Title field's setting.");

                settingsOfDailyRecurring["Title"] = eventTitle;

                // Update the RecurrenData field with recurrence.rule.firstDayOfWeek setting
                DayOfWeekOrMonth currentDayOfWeekOrMonthValue = (DayOfWeekOrMonth)Enum.Parse(typeof(DayOfWeekOrMonth), enumNameItem, true);
                recurrenceXMLData.recurrence.rule.firstDayOfWeek = currentDayOfWeekOrMonthValue;

                string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);
                settingsOfDailyRecurring["RecurrenceData"] = recurrenceXMLString;

                // Add current list item
                addedItemsOfRecurrence.Add(settingsOfDailyRecurring);
                cmds.Add(MethodCmdEnum.New);

                UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addedItemsOfRecurrence, OnErrorEnum.Continue);
                UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

                // Get the listItem id and the related RecurrenceData
                this.VerifyResponseOfUpdateListItem(updateResult);
                List<string> addedRecurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);
                listItemRecurrenceDataSettings.Add(addedRecurrenceItemIds[0], recurrenceXMLString);
            }

            this.Site.Assert.AreEqual<int>(
                                    namesOfDayOfWeekOrMonth.Length,
                                    listItemRecurrenceDataSettings.Count,
                                    "There should be match number of list items' Recurrence data setting");

            #endregion  Add 10 recurrence item

            XmlNode[] zrowItems = this.GetListItemsChangesFromSUT(listId);
            this.Site.Assert.AreEqual<int>(
                                    namesOfDayOfWeekOrMonth.Length,
                                    zrowItems.Count(),
                                    "The current list should contain [{0}] list items.",
                                    namesOfDayOfWeekOrMonth.Length);

            // Verify each WeekdayOfMonth value can be set in protocol SUT successfully.
            foreach (KeyValuePair<string, string> listItemRecurrenceDataItem in listItemRecurrenceDataSettings)
            {
                string currentListItemId = listItemRecurrenceDataItem.Key;
                int zrowIndexOfCurrentListItemId = this.GetZrowItemIndexByListItemId(zrowItems, currentListItemId);
                string actualRecurrenceData = Common.GetZrowAttributeValue(zrowItems, zrowIndexOfCurrentListItemId, "ows_RecurrenceData");
                this.Site.Assert.IsFalse(
                                string.IsNullOrEmpty(actualRecurrenceData),
                                "The actual RecurrenceData field should have value.");

                string expectedRecurrenceData = listItemRecurrenceDataItem.Value.ToLower();
                this.Site.Assert.AreEqual<string>(
                                    expectedRecurrenceData.ToLower(),
                                    actualRecurrenceData.ToLower(),
                                    "The RecurrenceData field value should match the value set in the request of UpdateListItems operation.");
            }

            // If upon verification pass, then capture R1001, R10031, R10032, R10033, R10034, R10035, R10036, R10037, R1004, R1005, R1006
            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1001
            this.Site.CaptureRequirement(
                            1001,
                            @"[In DayOfWeekOrMonth] The DayOfWeekOrMonth simple type specifies a day of the week or a day of the month.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1004
            this.Site.CaptureRequirement(
                            1004,
                            @"[In DayOfWeekOrMonth][The enumeration value]day[of the type DayOfWeekOrMonth means]Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, and Saturday are allowed.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1005
            this.Site.CaptureRequirement(
                            1005,
                            @"[In DayOfWeekOrMonth][The enumeration value]weekday[of the type DayOfWeekOrMonth means]Monday, Tuesday, Wednesday, Thursday, and Friday are allowed.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1006
            this.Site.CaptureRequirement(
                            1006,
                            @"[In DayOfWeekOrMonth][The enumeration value]weekend_day[of the type DayOfWeekOrMonth means]Sunday and Saturday are allowed.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10031
            this.Site.CaptureRequirement(
                            10031,
                            @"[In DayOfWeekOrMonth][The enumeration value]su[of the type DayOfWeekOrMonth means]Sunday");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10032
            this.Site.CaptureRequirement(
                            10032,
                            @"[In DayOfWeekOrMonth][The enumeration value]mo[of the type DayOfWeekOrMonth means]Monday");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10033
            this.Site.CaptureRequirement(
                            10033,
                            @"[In DayOfWeekOrMonth][The enumeration value]tu[of the type DayOfWeekOrMonth means]Tuesday");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10034
            this.Site.CaptureRequirement(
                            10034,
                            @"[In DayOfWeekOrMonth][The enumeration value]we[of the type DayOfWeekOrMonth means]Wednesday");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10035
            this.Site.CaptureRequirement(
                            10035,
                            @"[In DayOfWeekOrMonth][The enumeration value]th[of the type DayOfWeekOrMonth means]Thursday");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10036
            this.Site.CaptureRequirement(
                            10036,
                            @"[In DayOfWeekOrMonth][The enumeration value]fr[of the type DayOfWeekOrMonth means]Friday");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R10037
            this.Site.CaptureRequirement(
                            10037,
                            @"[In DayOfWeekOrMonth][The enumeration value]sa[of the type DayOfWeekOrMonth means]Saturday");
        }
        public void MSOUTSPS_S02_TC20_RecurrenceAppointmentItem_RecurrenceRulerepeatInstances()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            DateTime eventDate = DateTime.Today.Date.AddDays(1);

            Dictionary<string, string> recurEventFieldsSetting = this.GetDailyRecurrenceSettingWithwindowEnd(this.GetUniqueListItemTitle("YearlyRecurrenceItem"), eventDate, "1", 10);
            this.Site.Assert.IsTrue(
                            recurEventFieldsSetting.ContainsKey("RecurrenceData"),
                            "The fields setting collection should contain RecurrenceData field setting.");

            // Recurring data
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();
            RepeatPatternYearlyByDay repeatPatternYearlyByDay = new RepeatPatternYearlyByDay();

            // Setting the repeatPatternYearlyByDay value
            repeatPatternYearlyByDay.mo = TrueFalseDOW.TRUE;
            repeatPatternYearlyByDay.moSpecified = true;

            // Each year occurs one time.
            repeatPatternYearlyByDay.yearFrequency = "1";

            // Occurs on second week
            repeatPatternYearlyByDay.weekdayOfMonth = WeekdayOfMonth.second;
            repeatPatternYearlyByDay.weekdayOfMonthSpecified = true;

            // Occurs on current month
            repeatPatternYearlyByDay.month = eventDate.Month.ToString();
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternYearlyByDay;

            // Setting the repeatInstances to repeat ten times.
            recurrenceXMLData.recurrence.rule.Item = "10";

            string recurrenceXmlString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // If the EventType indicates a recurring event, then fRecurrence MUST be "1". 
            recurEventFieldsSetting["EventType"] = "1";

            // "0" means this is not an all-day event.
            recurEventFieldsSetting["fAllDayEvent"] = "0";

            // "1" means this is a recurrence event.
            recurEventFieldsSetting["fRecurrence"] = "1";

            // If EventType is "1", this property MUST contain a valid RecurrenceXML.
            recurEventFieldsSetting["RecurrenceData"] = recurrenceXmlString;
            DateTime endTime = eventDate.AddHours(1);

            // For yearly recurrence item, the end date must larger than the current year + repeatInstances.
            recurEventFieldsSetting["EndDate"] = this.GetGeneralFormatTimeString(endTime.AddYears(100));
            List<Dictionary<string, string>> addeditemsOfRecurrence = new List<Dictionary<string, string>>();
            addeditemsOfRecurrence.Add(recurEventFieldsSetting);

            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);
            cmds.Add(MethodCmdEnum.New);

            // add a recurrence appointment item
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addeditemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);
            this.VerifyResponseOfUpdateListItem(updateResult);
            XmlNode[] zrowitems = this.GetListItemsChangesFromSUT(listId);
            int listItemIndex = this.GetZrowItemIndexByListItemId(zrowitems, "1");

            #region Capture code

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1266
            this.Site.CaptureRequirementIfAreEqual(
                recurrenceXmlString,
                Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_RecurrenceData"),
                1266,
                "[In RecurrenceRule complex type] repeatInstances: Client set this value[repeatInstances], and later client retrieve the value[repeatInstances] from the server, they should be equal.specified by this element.");

            #endregion
        }
        public void MSOUTSPS_S02_TC21_RecurrenceAppointmentItem_RecurrenceDefinition()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            // Setting recurring setting
            DateTime eventDateOfRecurrence = DateTime.Today.Date.AddDays(1);
            Dictionary<string, string> settingsOfDailyRecurring = this.GetDailyRecurrenceSettingWithwindowEnd(this.GetUniqueListItemTitle("YearlyRecurrenceItem"), eventDateOfRecurrence, "1", 10);
            this.Site.Assert.IsTrue(
                            settingsOfDailyRecurring.ContainsKey("RecurrenceData"),
                            "The fields setting collection should contain RecurrenceData field setting.");

            // Setting a yearly recurrence setting for RecurrenceData field.
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Set the repeatInstances value, it will end after 3 occurrences.
            int repeatInstanceValue = 3;
            recurrenceXMLData.recurrence.rule.Item = repeatInstanceValue.ToString();

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();

            // Setting the RepeatPatternYearly, make the recurrence occur on 04-01 for every year.
            RepeatPatternYearly repeatPatternYearlyData = new RepeatPatternYearly();
            repeatPatternYearlyData.day = "1";
            repeatPatternYearlyData.month = "4";
            repeatPatternYearlyData.yearFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternYearlyData;
            string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Setting the RecurrenceData field with RepeatPattern
            settingsOfDailyRecurring["RecurrenceData"] = recurrenceXMLString;

            // Setting the EndDate field to match the Yearly and repeatInstances setting.
            this.Site.Assert.IsTrue(
                            settingsOfDailyRecurring.ContainsKey("EndDate"),
                            "The fields setting collection should contain EndDate field setting.");

            // The recurrence item end time.
            DateTime endTime = eventDateOfRecurrence.AddHours(1);

            // For yearly recurrence item, the end date must larger than the current year + repeatInstances.
            settingsOfDailyRecurring["EndDate"] = this.GetGeneralFormatTimeString(endTime.AddYears(100));

            #region add a recurrence item

            List<Dictionary<string, string>> addedItemsOfRecurrence = new List<Dictionary<string, string>>();
            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);

            // Add current list item
            addedItemsOfRecurrence.Add(settingsOfDailyRecurring);
            cmds.Add(MethodCmdEnum.New);

            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addedItemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

            // Get the listItem id.
            this.VerifyResponseOfUpdateListItem(updateResult);
            List<string> addedRecurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);

            #endregion add a recurrence item

            XmlNode[] zrowItems = this.GetListItemsChangesFromSUT(listId);
            int zrowIndex = this.GetZrowItemIndexByListItemId(zrowItems, addedRecurrenceItemIds[0]);
            string actualRecurrenceXMLStringValue = Common.GetZrowAttributeValue(zrowItems, zrowIndex, "ows_RecurrenceData");

            // If the RecurrenceData field value equal to set in the request of UpdateListItems, that means setting of RecurrenceDefinition.rule is set in the protocol SUT. If this verification passes then capture R897
            this.Site.Assert.AreEqual<string>(
                                    recurrenceXMLString.ToLower(),
                                    actualRecurrenceXMLStringValue.ToLower(),
                                    "The RecurrenceData value equal to set in the request of UpdateListItems");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R897
            this.Site.CaptureRequirement(
                           897,
                           @"[In RecurrenceDefinition complex type]rule: Contains a recurrence rule that defines a recurrence.");
        }
        public void MSOUTSPS_S02_TC19_RecurrenceAppointmentItem_RecurrenceRulerepeatForever()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            Dictionary<string, string> recurEventFieldsSetting = new Dictionary<string, string>();
            DateTime eventDate = DateTime.Today.Date.AddDays(1);
            DateTime endDate = eventDate.Date.AddHours(1);
            string eventDateValue = this.GetGeneralFormatTimeString(eventDate);
            string endDateValue = this.GetGeneralFormatTimeString(endDate);

            // Recurring data
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;
            recurrenceXMLData.recurrence.rule.Item = "FALSE";

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();
            RepeatPatternDaily repeatPatternDailyData = new RepeatPatternDaily();

            // Setting the dayFrequencyValue
            repeatPatternDailyData.dayFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDailyData;

            string recurrenceXmlString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Setting necessary fields' value
            recurEventFieldsSetting.Add("EventDate", eventDateValue);

            // The ending date and time of the appointment.
            recurEventFieldsSetting.Add("EndDate", endDateValue);

            // If the EventType indicates a recurring event, then fRecurrence MUST be "1". 
            recurEventFieldsSetting.Add("EventType", "1");

            // "0" means this is not an all-day event.
            recurEventFieldsSetting.Add("fAllDayEvent", "0");

            // "1" means this is a recurrence event.
            recurEventFieldsSetting.Add("fRecurrence", "1");

            // If EventType is "1", this property MUST contain a valid RecurrenceXML.
            recurEventFieldsSetting.Add("RecurrenceData", recurrenceXmlString);

            List<Dictionary<string, string>> addeditemsOfRecurrence = new List<Dictionary<string, string>>();
            addeditemsOfRecurrence.Add(recurEventFieldsSetting);

            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);
            cmds.Add(MethodCmdEnum.New);

            // add a  recurrence appointment item
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addeditemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);
            this.VerifyResponseOfUpdateListItem(updateResult);
            XmlNode[] zrowitems = this.GetListItemsChangesFromSUT(listId);
            int listItemIndex = this.GetZrowItemIndexByListItemId(zrowitems, "1");

            #region Capture code

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R1263
            this.Site.CaptureRequirementIfAreEqual(
                recurrenceXmlString,
                Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_RecurrenceData"),
                1263,
                "[In RecurrenceRule complex type] repeatForever: Client set this value[repeatForever], and later client retrieve the value[repeatForever] from the server, they should be equal.");

            #endregion
        }
        public void MSOUTSPS_S02_TC17_RecurrenceAppointmentItem_RecurrenceDataValid()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            Dictionary<string, string> recurEventFieldsSetting = new Dictionary<string, string>();
            DateTime eventDate = DateTime.Today.Date.AddDays(1);
            DateTime endDate = eventDate.Date.AddHours(1);
            string eventDateValue = this.GetGeneralFormatTimeString(eventDate);
            string endDateValue = this.GetGeneralFormatTimeString(endDate);
            string eventTitle = this.GetUniqueListItemTitle("RecurrenceEvent");

            recurEventFieldsSetting.Add("Title", eventTitle);

            // Recurring data
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();
            RepeatPatternDaily repeatPatternDailyData = new RepeatPatternDaily();

            // Setting the dayFrequencyValue
            repeatPatternDailyData.dayFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDailyData;
            recurrenceXMLData.recurrence.rule.Item = "7";
            string recurrenceXmlString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Setting necessary fields' value
            recurEventFieldsSetting.Add("EventDate", eventDateValue);

            // The ending date and time of the appointment.
            recurEventFieldsSetting.Add("EndDate", endDateValue);

            // If the EventType indicates a recurring event, then fRecurrence MUST be "1". 
            recurEventFieldsSetting.Add("EventType", "1");

            // "0" means this is not an all-day event.
            recurEventFieldsSetting.Add("fAllDayEvent", "0");

            // "1" means this is a recurrence event.
            recurEventFieldsSetting.Add("fRecurrence", "1");

            // If EventType is "1", this property MUST contain a valid RecurrenceXML.
            recurEventFieldsSetting.Add("RecurrenceData", recurrenceXmlString);

            List<Dictionary<string, string>> addeditemsOfRecurrence = new List<Dictionary<string, string>>();
            addeditemsOfRecurrence.Add(recurEventFieldsSetting);

            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);
            cmds.Add(MethodCmdEnum.New);

            // add a  recurrence appointment item
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addeditemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);

            XmlNode[] zrowitems = this.GetListItemsChangesFromSUT(listId);
            int listItemIndex = this.GetZrowItemIndexByListItemId(zrowitems, "1");
            XmlNode[] zrowItemsOfRecurrenceAppointment = this.GetZrowItems(updateResult.Results[0].Any);
            string updatedRecurrenceDataValue = Common.GetZrowAttributeValue(zrowItemsOfRecurrenceAppointment, 0, "ows_RecurrenceData");

            #region Capture code

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R297
            this.Site.CaptureRequirementIfIsTrue(
                Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_EventType") == "1" && Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_RecurrenceData") == recurrenceXmlString,
                297,
                "[In Appointment-Specific Schema]RecurrenceData: If EventType is 1, this property MUST contain a valid RecurrenceXML (section 2.2.4.4).");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R898
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                898,
                @"[In Complex Types]The RecurrenceXML complex type contains a RecurrenceDefinition (section 2.2.4.3).
                    <s:complexType name=""RecurrenceXML"">
                      <s:sequence>
                        <s:element name=""recurrence"" type=""tns:RecurrenceDefinition"" />
                        <s:element name=""deleteExceptions"" type=""s:string"" fixed=""true"" minOccurs=""0"" maxOccurs=""1"" />
                      </s:sequence>
                    </s:complexType>");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R877
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                877,
                "[In Complex Types][The complex type]RecurrenceXML Contains a RecurrenceDefinition (section 2.2.4.3).");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R896
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                896,
                @"[In RecurrenceDefinition complex type] The RecurrenceDefinition complex type contains a RecurrenceRule (section 2.2.4.2).   
                    <s:complexType name=""RecurrenceDefinition"">
                      <s:sequence>
                        <s:element name=""rule"" type=""tns:RecurrenceRule"" />
                      </s:sequence>
                    </s:complexType>");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R876
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                876,
                "[In Complex Types][The complex type]RecurrenceDefinition Contains a RecurrenceRule (section 2.2.4.2).");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R888
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                888,
                @"[In RecurrenceRule complex type] The RecurrenceRule complex type defines when a recurrence takes place.
                    <s:complexType name=""RecurrenceRule"">
                      <s:sequence>
                        <s:element name=""firstDayOfWeek"" type=""tns:DayOfWeekOrMonth"" />
                        <s:element name=""repeat"" type=""tns:RepeatPattern"" />
                        <s:choice>
                          <s:element name=""windowEnd"" type=""s:dateTime"" />
                          <s:element name=""repeatForever"">
                            <s:simpleType>
                              <s:restriction base=""s:string"">            
                                <s:enumeration value=""FALSE"" />
                              </s:restriction>
                            </s:simpleType>
                          </s:element>
                          <s:element name=""repeatInstances"" type=""s:integer"" />
                        </s:choice>
                      </s:sequence>
                    </s:complexType>");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R875
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                875,
                "[In Complex Types][The complex type]RecurrenceRule Defines when a recurrence takes place.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R878
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                878,
                "[In Complex Types][The complex type]RepeatPattern Contains a choice of elements which describe what days a recurrence occurs on.");

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R902
            this.Site.CaptureRequirementIfIsTrue(
                this.VerifyComplexTypesSchema(updatedRecurrenceDataValue, typeof(RecurrenceXML)),
                902,
                @"[In Complex Types]The RepeatPattern complex type contains a choice of elements which describe what days a recurrence occurs on.
                    <s:complexType name=""RepeatPattern"">
                        < s:choice >
                            < s:element name = ""daily"" >
                            < s:complexType >
                                < s:simpleContent >
                                < s:extension base = ""s:string"" >
                                    < s:attribute name = ""weekday"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""dayFrequency"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                </ s:extension >
                                </ s:simpleContent >
                            </ s:complexType >
                            </ s:element >
                            < s:element name = ""weekly"" >
                            < s:complexType >
                                < s:simpleContent >
                                < s:extension base = ""s:string"" >
                                    < s:attribute name = ""su"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""mo"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""tu"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""we"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""th"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""fr"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""sa"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""weekFrequency"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                </ s:extension >
                                </ s:simpleContent >
                            </ s:complexType >
                            </ s:element >
                            < s:element name = ""monthlyByDay"" >
                            < s:complexType >
                                < s:simpleContent >
                                < s:extension base = ""s:string"" >
                                    < s:attribute name = ""su"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""mo"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""tu"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""we"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""th"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""fr"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""sa"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""day"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""weekday"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""weekend_day"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""monthFrequency"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                    < s:attribute name = ""weekdayOfMonth"" type = ""tns:WeekdayOfMonth"" default= ""first"" use = ""optional"" />
                                </ s:extension >
                                </ s:simpleContent >
                            </ s:complexType >
                            </ s:element >
                            < s:element name = ""monthly"" >
                            < s:complexType >
                                < s:simpleContent >
                                < s:extension base = ""s:string"" >
                                    < s:attribute name = ""monthFrequency"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                    < s:attribute name = ""day"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                </ s:extension >
                                </ s:simpleContent >
                            </ s:complexType >
                            </ s:element >
                            < s:element name = ""yearly"" >
                            < s:complexType >
                                < s:simpleContent >
                                < s:extension base = ""s:string"" >
                                    < s:attribute name = ""yearFrequency"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                    < s:attribute name = ""month"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                    < s:attribute name = ""day"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                </ s:extension >
                                </ s:simpleContent >
                            </ s:complexType >
                            </ s:element >
                            < s:element name = ""yearlyByDay"" >
                            < s:complexType >
                                < s:simpleContent >
                                < s:extension base = ""s:string"" >
                                    < s:attribute name = ""su"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""mo"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""tu"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""we"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""th"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""fr"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""sa"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""day"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""weekday"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""weekend_day"" type = ""tns:TrueFalseDOW"" default= ""FALSE"" use = ""optional"" />
                                    < s:attribute name = ""yearFrequency"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                    < s:attribute name = ""month"" type = ""s:integer"" default= ""1"" use = ""optional"" />
                                    < s:attribute name = ""weekdayOfMonth"" type = ""tns:WeekdayOfMonth"" default= ""first"" use = ""optional"" />
                                </ s:extension >
                                </ s:simpleContent >
                            </ s:complexType >
                            </ s:element >
                        </ s:choice >
                        </ s:complexType >
                    ");

            #endregion
        }
        public void MSOUTSPS_S02_TC14_RecurrenceAppointmentItem_VerifyUIDField()
        {
            string listId = this.AddListToSUT(TemplateType.Events);

            Dictionary<string, string> recurEventFieldsSetting = new Dictionary<string, string>();
            DateTime eventDate = DateTime.Today.Date.AddDays(1);
            DateTime endDate = eventDate.Date.AddHours(1);
            string eventDateValue = this.GetGeneralFormatTimeString(eventDate);
            string endDateValue = this.GetGeneralFormatTimeString(endDate);
            string eventTitle = this.GetUniqueListItemTitle("RecurrenceEvent");

            recurEventFieldsSetting.Add("Title", eventTitle);

            Guid uid = Guid.NewGuid();

            // Recurring data
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();
            RepeatPatternDaily repeatPatternDailyData = new RepeatPatternDaily();

            // Setting the dayFrequencyValue
            repeatPatternDailyData.dayFrequency = "1";
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDailyData;
            recurrenceXMLData.recurrence.rule.Item = "7";
            string recurrenceXmlString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Setting necessary fields' value
            recurEventFieldsSetting.Add("EventDate", eventDateValue);

            // The ending date and time of the appointment.
            recurEventFieldsSetting.Add("EndDate", endDateValue);

            // "1" indicates a recurring event. 
            recurEventFieldsSetting.Add("EventType", "1");

            // "0" means this is not an all-day event.
            recurEventFieldsSetting.Add("fAllDayEvent", "0");

            // "1" means this is a recurrence event.
            recurEventFieldsSetting.Add("fRecurrence", "1");

            // If EventType is "1", this property MUST contain a valid RecurrenceXML.
            recurEventFieldsSetting.Add("RecurrenceData", recurrenceXmlString);

            List<Dictionary<string, string>> addeditemsOfRecurrence = new List<Dictionary<string, string>>();
            addeditemsOfRecurrence.Add(recurEventFieldsSetting);

            List<MethodCmdEnum> cmds = new List<MethodCmdEnum>(1);
            cmds.Add(MethodCmdEnum.New);

            // add a  recurrence appointment item
            UpdateListItemsUpdates updatesOfRecurrence = this.CreateUpdateListItems(cmds, addeditemsOfRecurrence, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResult = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrence);
            List<string> recurrenceItemIds = this.GetListItemIdsFromUpdateListItemsResponse(updateResult, 1);

            #region Update the recurrence event
            Dictionary<string, string> recurEventFieldsSettingUpdate = new Dictionary<string, string>();
            recurEventFieldsSettingUpdate.Add("ID", recurrenceItemIds[0]);

            // If fRecurrence is true, this property MUST contain a valid stringGUID.
            recurEventFieldsSettingUpdate.Add("UID", uid.ToString());

            List<Dictionary<string, string>> addeditemsOfRecurrenceUpdate = new List<Dictionary<string, string>>();
            addeditemsOfRecurrenceUpdate.Add(recurEventFieldsSettingUpdate);

            List<MethodCmdEnum> cmdsUpdate = new List<MethodCmdEnum>(1);
            cmdsUpdate.Add(MethodCmdEnum.Update);

            // Update the recurrence event
            UpdateListItemsUpdates updatesOfRecurrenceUpdate = this.CreateUpdateListItems(cmdsUpdate, addeditemsOfRecurrenceUpdate, OnErrorEnum.Continue);
            UpdateListItemsResponseUpdateListItemsResult updateResultUpdate = OutspsAdapter.UpdateListItems(listId, updatesOfRecurrenceUpdate);
            this.VerifyResponseOfUpdateListItem(updateResultUpdate);
            #endregion

            XmlNode[] zrowitems = this.GetListItemsChangesFromSUT(listId);
            int listItemIndex = this.GetZrowItemIndexByListItemId(zrowitems, "1");
            string actualUIDValue = Common.GetZrowAttributeValue(zrowitems, listItemIndex, "ows_UID");

            #region Capture code

            Guid actualUID;
            if (!Guid.TryParse(actualUIDValue, out actualUID))
            {
                this.Site.Assert.Fail("The UID field should be valid GUID format.");
            }

            // Verify MS-OUTSPS requirement: MS-OUTSPS_R312
            this.Site.CaptureRequirementIfAreEqual<Guid>(
                uid,
                actualUID,
                312,
                "[In Appointment-Specific Schema]UID MUST be changed if, and only if, the recurrence has been changed or added. ");

            #endregion
        }
Пример #12
0
        /// <summary>
        /// Generate a daily recurrence setting with specified dayFrequency, specified title and duration.
        /// </summary>
        /// <param name="eventTitle">A parameter represents the title of event.</param>
        /// <param name="eventDate">A parameter represents the event date of event. The end date of the event is computed from this parameter by this formula: eventDate + 1 hour.</param>
        /// <param name="dayFrequencyValue">A parameter represents the value of daily recurrent frequency.</param>
        /// <param name="durationOfRecurrence">A parameter represents the duration of the recurrence event </param>
        /// <returns>A return value represents the daily recurrence setting with computed windowEnd value. windowEnd value is computed from durationOfRecurrence and eventDate parameters.</returns>
        protected Dictionary<string, string> GetDailyRecurrenceSettingWithwindowEnd(string eventTitle, DateTime eventDate, string dayFrequencyValue, double durationOfRecurrence)
        {
            if (string.IsNullOrEmpty(eventTitle))
            {
                throw new ArgumentException("Value should not be null or empty", "eventTitle");
            }

            // Recurring data
            RecurrenceXML recurrenceXMLData = new RecurrenceXML();
            recurrenceXMLData.deleteExceptions = null;
            recurrenceXMLData.recurrence = new RecurrenceDefinition();
            recurrenceXMLData.recurrence.rule = new RecurrenceRule();
            recurrenceXMLData.recurrence.rule.firstDayOfWeek = DayOfWeekOrMonth.su;

            // Set the windowEnd value, the recurrence will be end on durationOfRecurrence + 1 days from current date, and the recurrence duration should be equal to durationOfRecurrence.
            DateTime endDate = eventDate.AddHours(1);
            DateTime winEndDate = eventDate.Date.AddDays(durationOfRecurrence);
            recurrenceXMLData.recurrence.rule.Item = winEndDate;

            // Repeat Pattern
            recurrenceXMLData.recurrence.rule.repeat = new RepeatPattern();
            RepeatPatternDaily repeatPatternDailyData = new RepeatPatternDaily();

            // Setting the dayFrequencyValue
            repeatPatternDailyData.dayFrequency = dayFrequencyValue;
            recurrenceXMLData.recurrence.rule.repeat.Item = repeatPatternDailyData;

            string recurrenceXMLString = this.GetRecurrenceXMLString(recurrenceXMLData);

            // Generate a daily recurrence setting with specified dayFrequency, specified title and durationOfRecurrence.
            Dictionary<string, string> dailyRecurrenceSetting = this.GetGeneralRecurrenceEventFieldsSetting(eventTitle, eventDate, endDate, recurrenceXMLString);
            return dailyRecurrenceSetting;
        }
Пример #13
0
        /// <summary>
        /// A method used to get a recurrence XML string, which is used to setting the recurrence appointment item on event list. 
        /// </summary>
        /// <param name="recurrenceXMLData">A parameter represents the RecurrenceXML type instance which include the setting the settings of recurrence appointment.</param>
        /// <returns>A return value represents the serialized xml string from specified RecurrenceXML type instance.</returns>
        protected string GetRecurrenceXMLString(RecurrenceXML recurrenceXMLData)
        {
            string serializedXMLstring = string.Empty;
            StringBuilder strBuilder = new StringBuilder();
            using (StringWriter stringWriter = new StringWriter(strBuilder))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(RecurrenceXML));
                xmlSerializer.Serialize(stringWriter, recurrenceXMLData);
                serializedXMLstring = strBuilder.ToString();
            }

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(serializedXMLstring);
            var recurrenceXMLElementitems = from XmlNode childNodeItem in xmlDoc.ChildNodes
                                            where childNodeItem.LocalName.Equals("RecurrenceXML", StringComparison.OrdinalIgnoreCase)
                                            select childNodeItem;

            if (0 == recurrenceXMLElementitems.Count())
            {
                this.Site.Assert.Fail("The de-serialize XML string should contain expected RecurrenceXML element. Current XML string:\r\n[{0}]", serializedXMLstring);
            }

            XmlElement recurrenceXMLElement = (XmlElement)recurrenceXMLElementitems.ElementAt<XmlNode>(0);
            serializedXMLstring = recurrenceXMLElement.InnerXml;
            serializedXMLstring = serializedXMLstring.Replace(@" xmlns=""http://schemas.microsoft.com/sharepoint/soap/""", string.Empty);
            return serializedXMLstring;
        }