Exemplo n.º 1
0
        public void CheckMenology_False()
        {
            DayRule rule         = new TriodionRule();
            var     modifiedRule = new ModifiedRule()
            {
                DayRule = rule
            };

            Assert.IsFalse(TypeEqualsOrSubclassOf <MenologyRule> .Is(modifiedRule.DayRule));
        }
Exemplo n.º 2
0
        /// <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);
        }