public void Variables_Test() { DateTime date = new DateTime(2017, 11, 09); string xml = TestDataXmlReader.GetXmlString("VariablesTest.xml"); var handler = new CollectorRuleHandler <IHavingVariables>() { Settings = RuleHandlerSettingsTestFactory.Create(1, date, xml) }; var ruleContainer = TestRuleSerializer.Deserialize <RootContainer>(xml); ruleContainer.Interpret(handler); var result = handler.GetResult(); var variables = new List <string>(); foreach (var r in result) { variables.AddRange(r.GetVariableNames().Select(c => c.Item1)); } variables = variables.Distinct().ToList(); Assert.AreEqual(2, variables.Count); }
/// <summary> /// Возвращает все дочерние элементы согласно введенного generic типа /// </summary> /// <typeparam name="T"></typeparam> /// <param name="date"></param> /// <param name="handler"></param> /// <returns></returns> protected ExecContainer GetChildElements <T>(IRuleHandler handler) //where T : RuleExecutable, ICustomInterpreted { //используем специальный обработчик //чтобы создать список источников канонов на обработку var childrenHandler = new CollectorRuleHandler <T>() { Settings = handler.Settings }; foreach (RuleElement elem in ChildElements) { elem.Interpret(childrenHandler); } return(childrenHandler.GetResult()); }
/// <summary> /// Возвращает все дочерние элементы согласно введенного generic типа /// </summary> /// <typeparam name="T">Тип элемента правил для поиска</typeparam> /// <param name="predicate">Дополнительные условия для поиска</param> /// <returns></returns> public IReadOnlyList <T> GetChildElements <T>(RuleHandlerSettings settings, Func <T, bool> predicate = null) //where T : RuleExecutable, ICustomInterpreted { //используем специальный обработчик //чтобы найти все дочерние элементы по искомым признакам var childrenHandler = new CollectorRuleHandler <T>() { Settings = settings }; //Interpret(childrenHandler); foreach (RuleElementBase elem in ChildElements) { elem.Interpret(childrenHandler); } var result = childrenHandler.GetResult(); return((predicate != null) ? result.Where(predicate).ToList() : result); }
/// <summary> /// Возвращает коллекцию элементов для замены, отвечающих условиям /// </summary> /// <param name="settings"></param> /// <param name="element"></param> /// <param name="predicate"></param> /// <returns></returns> public IReadOnlyList <IAsAdditionElement> GetAsAdditionChildElements(IRuleHandler handler, RuleHandlerSettings settings, IAsAdditionElement element, Func <IAsAdditionElement, bool> predicate = null) { #region old version ////используем специальный обработчик ////чтобы найти все дочерние элементы по искомым признакам //var childrenHandler = new AsAdditionElementHandler(element, predicate) { Settings = settings }; ////Interpret(childrenHandler); //foreach (RuleElementBase elem in ChildElements) //{ // elem.Interpret(childrenHandler); //} //return childrenHandler.GetResult(); #endregion var elements = _addElementsDict.GetValueOrDefault(GetKey(handler, settings)); //Проверяем, существует ли коллекция if (elements == null) { //создаем ее var childrenHandler = new CollectorRuleHandler <IAsAdditionElement>(); Interpret(childrenHandler); elements = new List <IAsAdditionElement>(childrenHandler.GetResult()); _addElementsDict.Add(GetKey(handler, settings), elements); } return(elements.Where(c => c.AsAdditionName == element.AsAdditionName) .Where(predicate) .ToList()); }