Exemple #1
0
        /// <summary>
        /// 檢查是否符合指定標準章節結構
        /// </summary>
        /// <param name="standard">標準結構</param>
        /// <param name="mode">檢查模式</param>
        /// <returns>是否符合結構</returns>
        public bool IsMatch(Section standard, MatchModes mode = MatchModes.Basic)
        {
            var subsections         = this.Children.Where(x => x is Section).Select(x => (Section)x).ToList <Section>();
            var standardSubsections = standard.Children.Where(x => x is Section).Select(x => (Section)x).ToList <Section>();

            //嚴格模式必須數量也一樣
            if (mode == MatchModes.Full && subsections.Count != standardSubsections.Count)
            {
                return(false);
            }

            //去除不再標準內的章節
            subsections = subsections.Where(x => standardSubsections.Any(y => y.HeaderText == x.HeaderText)).ToList();

            //標題不符合或章節數量不符合
            if (standard.HeaderText != this.HeaderText ||
                subsections.Count != standardSubsections.Count)
            {
                return(false);
            }

            //無子章節
            if (standardSubsections.Count() == 0)
            {
                return(true);
            }

            //順序檢驗
            if (mode != MatchModes.Basic)
            {
                for (int i = 0;
                     i < standardSubsections.Count;
                     i++)
                {
                    if (standardSubsections[i].HeaderText ==
                        subsections[i].HeaderText &&
                        subsections[i].IsMatch(standardSubsections[i]))
                    {
                        continue;
                    }
                    return(false);
                }
                return(true);
            }

            //基礎檢驗
            return(standardSubsections
                   .All(x => subsections.Any(
                            y => y.HeaderText == x.HeaderText &&
                            y.IsMatch(x)
                            )));
        }
Exemple #2
0
        /// <summary>
        /// Spawns a Searcher to search retrieved files for Amazon order numbers. Automatically conducts search operation upon completion of object initialization.
        /// </summary>
        /// <param name="pidsIn">List of pids to search</param>
        /// <param name="ordersIn">List of order numbers to find</param>
        /// <param name="dir">Folder for this session created by the Retriever</param>
        /// <param name="isVerbose">Verbose console output feedback</param>
        /// <param name="matchMultiple">Continue searching for order after first match</param>
        public Searcher(string[] pidsIn, string[] ordersIn, string dir, bool isVerbose, MatchModes matchModeIn)
        {
            Console.Write("\nSpawning Searcher... \n");

            // Initialize properties
            this.PidSearchChecklist = new PidChecklistPair[pidsIn.Length];
            for (int i = 0; i < pidsIn.Length; i++)
                PidSearchChecklist[i] = new PidChecklistPair(pidsIn[i], false);
            this.TargetDirectory = dir;
            this.NumOrdersFound = 0;
            this.CurrentOrderToFind = new StringBuilder("");
            this.CurrentPidSearch = new StringBuilder("");
            this.VerboseOutput = isVerbose;

            this.SearchMatchMode = matchModeIn;
            switch (SearchMatchMode)
            {
                case MatchModes.Single:
                    this.OrderFindChecklist = new OrderChecklistSet[ordersIn.Length];
                    for (int i = 0; i < ordersIn.Length; i++)
                        OrderFindChecklist[i] = new OrderChecklistSet(ordersIn[i], false, "");
                    break;
                case MatchModes.Multiple:
                case MatchModes.AmzEU:
                    this.OrderFindChecklist = new OrderChecklistSet[ordersIn.Length];
                    for (int i = 0; i < ordersIn.Length; i++)
                        OrderFindChecklist[i] = new OrderChecklistSet(ordersIn[i], false, "");
                    this.MultipleOrderFindChecklist = new List<MultipleOrderResultListSet>();
                    break;
                default:
                    break;
            }

            if (VerboseOutput)
            {
                Console.WriteLine();
                Console.WriteLine("SEARCHER PARAMETERS");
                Console.WriteLine(string.Concat("Num of orders to find: ", OrderFindChecklist.Length));
                Console.WriteLine();
            }

            if (OrderInputIsValid())
                DoLocate();
        }
Exemple #3
0
        public void GetDeferredEvalFor_GivenStringConditionNodeWithNoConditionSuppliedAndRulesEngineConfiguredToUseDataTypeDefaultWhenMissing_ReturnsFuncThatEvalsFalse()
        {
            // Arrange
            StringConditionNode <ConditionType> conditionNode = new StringConditionNode <ConditionType>(ConditionType.IsoCurrency, Operators.Equal, "EUR");

            Mock <IOperatorEvalStrategy> mockOperatorEvalStrategy = new Mock <IOperatorEvalStrategy>();

            mockOperatorEvalStrategy.Setup(x => x.Eval(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(false);

            Mock <IOperatorEvalStrategyFactory> mockOperatorEvalStrategyFactory = new Mock <IOperatorEvalStrategyFactory>();

            mockOperatorEvalStrategyFactory.Setup(x => x.GetOperatorEvalStrategy(It.IsAny <Operators>()))
            .Returns(mockOperatorEvalStrategy.Object);

            IEnumerable <Condition <ConditionType> > conditions = new Condition <ConditionType>[]
            {
                new Condition <ConditionType>
                {
                    Type  = ConditionType.IsoCountryCode,
                    Value = "PT"
                }
            };

            MatchModes matchMode = MatchModes.Exact;

            RulesEngineOptions rulesEngineOptions = RulesEngineOptions.NewWithDefaults();

            rulesEngineOptions.MissingConditionBehavior = MissingConditionBehaviors.UseDataTypeDefault;

            DeferredEval sut = new DeferredEval(mockOperatorEvalStrategyFactory.Object, rulesEngineOptions);

            // Act
            Func <IEnumerable <Condition <ConditionType> >, bool> actual = sut.GetDeferredEvalFor(conditionNode, matchMode);
            bool actualEvalResult = actual.Invoke(conditions);

            // Assert
            actualEvalResult.Should().BeFalse();

            mockOperatorEvalStrategyFactory.Verify(x => x.GetOperatorEvalStrategy(It.IsAny <Operators>()), Times.Once());
            mockOperatorEvalStrategy.Verify(x => x.Eval(It.IsAny <string>(), It.IsAny <string>()), Times.Once());
        }
Exemple #4
0
        public void GetDeferredEvalFor_GivenUnknownConditionNodeType_ThrowsNotSupportedException()
        {
            // Arrange
            Mock <IValueConditionNode <ConditionType> > mockValueConditionNode = new Mock <IValueConditionNode <ConditionType> >();

            Mock <IOperatorEvalStrategyFactory> mockOperatorEvalStrategyFactory = new Mock <IOperatorEvalStrategyFactory>();

            MatchModes matchMode = MatchModes.Exact;

            RulesEngineOptions rulesEngineOptions = RulesEngineOptions.NewWithDefaults();

            DeferredEval sut = new DeferredEval(mockOperatorEvalStrategyFactory.Object, rulesEngineOptions);

            // Act
            NotSupportedException notSupportedException = Assert.Throws <NotSupportedException>(() => sut.GetDeferredEvalFor(mockValueConditionNode.Object, matchMode));

            // Assert
            notSupportedException.Should().NotBeNull();
            notSupportedException.Message.Should().Be($"Unsupported value condition node: '{mockValueConditionNode.Object.GetType().Name}'.");
        }
Exemple #5
0
        public void GetDeferredEvalFor_GivenDecimalConditionNode_ReturnsFuncToEvalConditionsCollection()
        {
            // Arrange
            DecimalConditionNode <ConditionType> conditionNode = new DecimalConditionNode <ConditionType>(ConditionType.PluviosityRate, Operators.GreaterThan, 50);

            Mock <IOperatorEvalStrategy> mockOperatorEvalStrategy = new Mock <IOperatorEvalStrategy>();

            mockOperatorEvalStrategy.Setup(x => x.Eval(It.IsAny <decimal>(), It.IsAny <decimal>()))
            .Returns(true);

            Mock <IOperatorEvalStrategyFactory> mockOperatorEvalStrategyFactory = new Mock <IOperatorEvalStrategyFactory>();

            mockOperatorEvalStrategyFactory.Setup(x => x.GetOperatorEvalStrategy(It.IsAny <Operators>()))
            .Returns(mockOperatorEvalStrategy.Object);

            IEnumerable <Condition <ConditionType> > conditions = new Condition <ConditionType>[]
            {
                new Condition <ConditionType>
                {
                    Type  = ConditionType.PluviosityRate,
                    Value = 78
                }
            };

            MatchModes matchMode = MatchModes.Exact;

            RulesEngineOptions rulesEngineOptions = RulesEngineOptions.NewWithDefaults();

            DeferredEval sut = new DeferredEval(mockOperatorEvalStrategyFactory.Object, rulesEngineOptions);

            // Act
            Func <IEnumerable <Condition <ConditionType> >, bool> actual = sut.GetDeferredEvalFor(conditionNode, matchMode);
            bool actualEvalResult = actual.Invoke(conditions);

            // Assert
            actualEvalResult.Should().BeTrue();

            mockOperatorEvalStrategyFactory.Verify(x => x.GetOperatorEvalStrategy(It.IsAny <Operators>()), Times.Once());
            mockOperatorEvalStrategy.Verify(x => x.Eval(It.IsAny <decimal>(), It.IsAny <decimal>()), Times.Once());
        }
 private ISpecification <IEnumerable <Condition <TConditionType> > > BuildSpecification(IConditionNode <TConditionType> conditionNode, MatchModes matchMode)
 {
     return(conditionNode switch
     {
         IValueConditionNode <TConditionType> valueConditionNode => this.BuildSpecificationForValueNode(valueConditionNode, matchMode),
         ComposedConditionNode <TConditionType> composedConditionNode => this.BuildSpecificationForComposedNode(composedConditionNode, matchMode),
         _ => throw new NotSupportedException($"Unsupported condition node: '{conditionNode.GetType().Name}'."),
     });
 public Func <IEnumerable <Condition <TConditionType> >, bool> GetDeferredEvalFor <TConditionType>(IValueConditionNode <TConditionType> valueConditionNode, MatchModes matchMode)
 {
     return(valueConditionNode switch
     {
         IntegerConditionNode <TConditionType> integerConditionNode => (conditions) => Eval <IntegerConditionNode <TConditionType>, TConditionType, int>(conditions, integerConditionNode, matchMode),
         DecimalConditionNode <TConditionType> decimalConditionNode => (conditions) => Eval <DecimalConditionNode <TConditionType>, TConditionType, decimal>(conditions, decimalConditionNode, matchMode),
         StringConditionNode <TConditionType> stringConditionNode => (conditions) => Eval <StringConditionNode <TConditionType>, TConditionType, string>(conditions, stringConditionNode, matchMode),
         BooleanConditionNode <TConditionType> booleanConditionNode => (conditions) => Eval <BooleanConditionNode <TConditionType>, TConditionType, bool>(conditions, booleanConditionNode, matchMode),
         _ => throw new NotSupportedException($"Unsupported value condition node: '{valueConditionNode.GetType().Name}'."),
     });