/// <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) ))); }
/// <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(); }
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()); }
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}'."); }
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}'."), });