public void CheckMenology_False() { DayRule rule = new TriodionRule(); var modifiedRule = new ModifiedRule() { DayRule = rule }; Assert.IsFalse(TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule)); }
/// <summary> /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов. /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ /// </summary> /// <param name="modifiedRule"></param> /// <param name="menologyRule"></param> /// <param name="triodionRule"></param> /// <returns>Правило для обработки, список текстов богослужений</returns> private (DayRule MajorRule, IEnumerable <DayWorship> Menologies, IEnumerable <DayWorship> Triodions, bool ModifiedIsUsed) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule) { //Приоритет Минеи IDayRule menologyToCompare = SetValues(menologyRule , out int menologyPriority , TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule?.DayRule)); //Приоритет Триоди IDayRule triodionToCompare = SetValues(triodionRule , out int triodionPriority , TypeEqualsOrSubclassOf <TriodionRule> .Is(modifiedRule?.DayRule)); IDayRule SetValues(DayRule dr, out int p, bool typeEqualsOrSubclassOf) { IDayRule r = null; p = int.MaxValue; if (typeEqualsOrSubclassOf) { r = modifiedRule;//.DayRule; p = modifiedRule.Priority; } else if (dr != null) { r = dr; p = dr.Template.Priority; } return(r); }; IDayRule majorRule = null; var menologies = new List <DayWorship>(); var triodions = new List <DayWorship>(); int result = menologyPriority - triodionPriority; //сравниваем switch (result) { case 1: case 0: //senior Triodion, junior Menology majorRule = triodionToCompare; menologies.AddRange(menologyToCompare.DayWorships); triodions.AddRange(triodionToCompare.DayWorships); break; case -1: //senior Menology, junior Triodion majorRule = menologyToCompare; menologies.AddRange(menologyToCompare.DayWorships); triodions.AddRange(triodionToCompare.DayWorships); break; default: if (result < -1) { //только Минея majorRule = menologyToCompare; menologies.AddRange(menologyToCompare.DayWorships); } else { //только Триодь majorRule = triodionToCompare; triodions.AddRange(triodionToCompare.DayWorships); } break; } //Вводим переменную для того, чтобы затем обнулить ссылку на ModifiedRule bool modifiedRuleIsUsed = false; //если это измененное правило, то возвращаем правило, на которое оно указывает if (majorRule is ModifiedRule mr) { majorRule = mr.DayRule; modifiedRuleIsUsed = true; } return(majorRule as DayRule, menologies, triodions, modifiedRuleIsUsed); }
/// <summary> /// Из трех правил выбирает главное и составляет коллекцию богослужебных текстов. /// Считаем, что ModifiedRule не является ДОПОЛНЕНИЕМ /// </summary> /// <param name="modifiedRule"></param> /// <param name="menologyRule"></param> /// <param name="triodionRule"></param> /// <returns>Правило для обработки, список текстов богослужений</returns> private (DayRule, IEnumerable <DayWorship>) CalculatePriorities(ModifiedRule modifiedRule, MenologyRule menologyRule, TriodionRule triodionRule) { //Приоритет Минеи IDayRule menologyToCompare = SetValues(menologyRule, out int menologyPriority, typeof(MenologyRule)); //Приоритет Триоди IDayRule triodionToCompare = SetValues(triodionRule, out int triodionPriority, typeof(TriodionRule)); IDayRule SetValues(DayRule dr, out int p, Type t) { IDayRule r = null; p = int.MaxValue; if (modifiedRule?.RuleEntity.GetType().Equals(t) == true) { r = modifiedRule; p = modifiedRule.Priority; } else if (dr != null) { r = dr; p = dr.Template.Priority; } return(r); }; var rulesList = new List <IDayRule>(); int result = menologyPriority - triodionPriority; //сравниваем switch (result) { case 1: case 0: //senior Triodion, junior Menology rulesList.Add(triodionToCompare); rulesList.Add(menologyToCompare); break; case -1: //senior Menology, junior Triodion rulesList.Add(menologyToCompare); rulesList.Add(triodionToCompare); break; default: if (result < -1) { //только Минея rulesList.Add(menologyToCompare); } else { //только Триодь rulesList.Add(triodionToCompare); } break; } //формируем список текстов List <DayWorship> dayWorships = new List <DayWorship>(); rulesList.ForEach(c => dayWorships.AddRange(c.DayWorships)); //находим главное правило var rule = rulesList.First(); //если это измененное правило, то возвращаем правило, на которое оно указывает if (rule is ModifiedRule) { rule = (rule as ModifiedRule).RuleEntity; } return(rule as DayRule, dayWorships); }