/// <summary>
        /// Retrieves eligibility parameters, transforms them into eligibilities, groups into rule sets and builds a Composite structure.
        /// </summary>
        /// <param name="productId">Build an eligibility structure belonging to the specified product.</param>
        /// <returns>Product's Composite eligibility structure.</returns>
        public IEligibility Create(int productId)
        {
            IQueryable <ProductEligibilityParam> eligibilityParameters = _prodEligRepository.GetProductEligibilityParams(productId);
            IList <IEligibility> eligibilities           = _eligibilityMapper.MapParamsToEligibility(eligibilityParameters.ToList <ProductEligibilityParam>());
            IList <IEligibility> rawRuleSetEligibilities = new List <IEligibility>();
            IEligibility         compositeEligibilities  = null;
            IEligibility         ruleSetEligibility      = null;
            int ruleSetCount = eligibilities.Any() ? eligibilities.Max(e => e.RuleSet) : 0;     // .Max() throws if collection is empty.

            for (int i = 1; i <= ruleSetCount; i++)
            {
                // Rule set 1 is handled differently from the subsequent rule sets.
                if (i == 1)
                {
                    ruleSetEligibility = CreateRuleSet <RuleSet1Eligibility>(eligibilities.Where(e => e.RuleSet == i));
                    rawRuleSetEligibilities.Add(ruleSetEligibility);
                }
                else
                {
                    ruleSetEligibility = CreateRuleSet <RuleSetOtherEligibility>(eligibilities.Where(e => e.RuleSet == i));
                    rawRuleSetEligibilities.Add(ruleSetEligibility);
                }
                ruleSetEligibility.RuleSet = i;
            }
            // Process the list of IEligibles into a Composite structure, based on rulesets.
            compositeEligibilities = CreateComposite(rawRuleSetEligibilities);
            return(compositeEligibilities);
        }
        /// <summary>
        /// Takes basic list of eligibility parameters and transforms it into a list of eligibilities.
        /// Multiple eligibility parameters might be necessary to create a single eligibility.
        /// </summary>
        /// <param name="eligParams">A list with a basic representation of eligibility parameters.</param>
        /// <returns>A list of eligibilities, with no particular structure.</returns>
        public IList <IEligibility> MapParamsToEligibility(IList <ProductEligibilityParam> eligParams)
        {
            string              eligibilityName = String.Empty;
            int                 ruleSet         = 0;
            Type                type;
            IEligibility        eligible = null;
            List <IEligibility> eligList = new List <IEligibility>();

            foreach (ProductEligibilityParam param in eligParams.OrderBy(p => p.RuleSet).ThenBy(p => p.EligibilityName))
            {
                // Multiple parameters might belong to the same eligibility.
                if (eligibilityName != param.EligibilityName || ruleSet != param.RuleSet)
                {
                    type     = typeof(IEligibility).Assembly.GetTypes().Single(t => t.Name == param.EligibilityName);
                    eligible = (IEligibility)Activator.CreateInstance(type);
                    eligible.GetType().GetProperty("RuleSet").SetValue(eligible, param.RuleSet);
                    eligibilityName = param.EligibilityName;
                    ruleSet         = param.RuleSet;
                    eligList.Add(eligible);
                }
                // Set eligibilities property values.
                eligible.GetType().GetProperty(param.ParamName).SetValue(eligible, param.ParamValue);
            }
            return(eligList);
        }
        public void Return_Null_Object_If_No_Eligibilities()
        {
            // Arrange
            _targetBuilder.WithNoEligibility();
            CompositeEligibilityFactory target = _targetBuilder.Build();

            // Act
            IEligibility result     = target.Create(1);
            IEligibility nullResult = result as NullEligibility;

            // Assert
            Assert.IsInstanceOfType(nullResult, typeof(NullEligibility));
            _targetBuilder._mockMapper.Verify(m => m.MapParamsToEligibility(It.IsAny <IList <ProductEligibilityParam> >()), Times.Once);
        }
        /// <summary>
        /// Goes through provided flat rule set structure and builds a hierarchical composite structure.
        /// </summary>
        /// <param name="rawEligibilities">A flat list of rule set eligibilities.</param>
        /// <returns>A hierarchical composite structure of rule set eligibilities</returns>
        private IEligibility CreateComposite(IList <IEligibility> rawEligibilities)
        {
            IEligibility compositeEligibilities = null;

            if (rawEligibilities.Count == 0)
            {
                return(new NullEligibility());
            }
            // Rule set 1 becomes the composite root by default.
            compositeEligibilities = rawEligibilities[0];
            // Skip the last eligibility as it doesn't contain any new Composites.
            for (int i = 1; i < rawEligibilities.Count; i++)
            {
                compositeEligibilities.AddComponent(rawEligibilities[i]);
                compositeEligibilities = rawEligibilities[i];
            }
            // Return composite root.
            return(rawEligibilities[0]);
        }
Пример #5
0
 public void AddComponent(IEligibility eligibility)
 {
     throw new NotImplementedException();
 }
Пример #6
0
 public void AddComponent(IEligibility eligibility)
 {
     Components.Add(eligibility);
 }
        public void Can_Create_A_Composite_With_Multiple_Rule_Set_With_Multiple_Eligibility()
        {
            // Arrange
            _targetBuilder.WithMultipleRuleSetWithMultipleEligibility(1);
            CompositeEligibilityFactory target = _targetBuilder.Build();

            // Act
            IEligibility result = target.Create(1);
            // Retrieve first rule set.
            RuleSet1Eligibility       ruleSetOne      = result as RuleSet1Eligibility;
            FormSubtypeEligibility    formSubtype1    = ruleSetOne.Components[0] as FormSubtypeEligibility;
            SubscriberTypeEligibility subscriberType1 = ruleSetOne.Components[1] as SubscriberTypeEligibility;
            TariffsEligibility        tariffs1        = ruleSetOne.Components[2] as TariffsEligibility;

            // Retrieve second rule set.
            RuleSetOtherEligibility   ruleSetTwo      = ruleSetOne.Components[3] as RuleSetOtherEligibility;
            FormSubtypeEligibility    formSubtype2    = ruleSetTwo.Components[0] as FormSubtypeEligibility;
            SubscriberTypeEligibility subscriberType2 = ruleSetTwo.Components[1] as SubscriberTypeEligibility;

            // Retrieve third rule set.
            RuleSetOtherEligibility   ruleSetThree    = ruleSetTwo.Components[2] as RuleSetOtherEligibility;
            SubscriberTypeEligibility subscriberType3 = ruleSetThree.Components[0] as SubscriberTypeEligibility;
            TariffsEligibility        tariffs2        = ruleSetThree.Components[1] as TariffsEligibility;

            // Retrieve fourth rule set.
            RuleSetOtherEligibility   ruleSetFour     = ruleSetThree.Components[2] as RuleSetOtherEligibility;
            SubscriberTypeEligibility subscriberType4 = ruleSetFour.Components[0] as SubscriberTypeEligibility;
            TariffsEligibility        tariffs3        = ruleSetFour.Components[1] as TariffsEligibility;

            // Assert - RuleSet1Eligibility representing Rule set 1
            Assert.IsNotNull(ruleSetOne);
            Assert.IsTrue(ruleSetOne.RuleSet == 1);
            Assert.IsTrue(ruleSetOne.Components.Count == 4);
            // Assert - FormSubtypeEligibility in Rule set 1
            Assert.IsNotNull(formSubtype1);
            Assert.IsTrue(formSubtype1.RuleSet == 1);
            Assert.IsTrue(formSubtype1.ValidSubtypes == "1,5,7");
            // Assert - SubscriberTypeEligibility in Rule set 1
            Assert.IsNotNull(subscriberType1);
            Assert.IsTrue(subscriberType1.RuleSet == 1);
            Assert.IsTrue(subscriberType1.SubscriberType == "1,2,3");
            // Assert - TariffsEligibility in Rule set 1
            Assert.IsNotNull(tariffs1);
            Assert.IsTrue(tariffs1.RuleSet == 1);
            Assert.IsTrue(tariffs1.AllowedTariffs == "14,27,61");
            // Assert - RuleSetOtherEligibility representing Rule set 2
            Assert.IsNotNull(ruleSetTwo);
            Assert.IsTrue(ruleSetTwo.RuleSet == 2);
            // Assert - FormSubtypeEligibility in Rule set 2
            Assert.IsNotNull(formSubtype2);
            Assert.IsTrue(formSubtype2.RuleSet == 2);
            Assert.IsTrue(formSubtype2.ValidSubtypes == "1");
            // Assert - SubscriberTypeEligibility in Rule set 2
            Assert.IsNotNull(subscriberType2);
            Assert.IsTrue(subscriberType2.RuleSet == 2);
            Assert.IsTrue(subscriberType2.SubscriberType == "2");
            // Assert - RuleSetOtherEligibility representing Rule set 3
            Assert.IsNotNull(ruleSetThree);
            Assert.IsTrue(ruleSetThree.RuleSet == 3);
            // Assert - SubscriberTypeEligibility in Rule set 3
            Assert.IsNotNull(subscriberType3);
            Assert.IsTrue(subscriberType3.RuleSet == 3);
            Assert.IsTrue(subscriberType3.SubscriberType == "3");
            // Assert - TariffsEligibility in Rule set 3
            Assert.IsNotNull(tariffs2);
            Assert.IsTrue(tariffs2.RuleSet == 3);
            Assert.IsTrue(tariffs2.AllowedTariffs == "61");
            // Assert - RuleSetOtherEligibility representing Rule set 4
            Assert.IsNotNull(ruleSetFour);
            Assert.IsTrue(ruleSetFour.RuleSet == 4);
            // Assert - SubscriberTypeEligibility in Rule set 4
            Assert.IsNotNull(subscriberType4);
            Assert.IsTrue(subscriberType4.RuleSet == 4);
            Assert.IsTrue(subscriberType4.SubscriberType == "1");
            // Assert - TariffsEligibility in Rule set 4
            Assert.IsNotNull(tariffs3);
            Assert.IsTrue(tariffs3.RuleSet == 4);
            Assert.IsTrue(tariffs3.AllowedTariffs == "14");
        }