예제 #1
0
        public void RubberStamp_Conditions_RegexCondition_Regex_Validate_Number_Test()
        {
            var condition = new RegexCondition <TestClass, string>(p => p.Index.ToString(), @"^[0-9]");

            Assert.IsTrue(condition.IsValid(new TestClass {
                Index = 1234567890
            }));
        }
예제 #2
0
        public void RubberStamp_Conditions_RegexCondition_Regex_InValid_Number_Test()
        {
            var condition = new RegexCondition <TestClass, string>(p => p.Email, @"^[0-9]");

            Assert.IsFalse(condition.IsValid(new TestClass {
                Email = "test"
            }));
        }
예제 #3
0
        public void RubberStamp_Conditions_RegexCondition_Regex_Validate_Characters_Test()
        {
            var condition = new RegexCondition <TestClass, string>(p => p.Email, @"^[a-zA-Z]");

            Assert.IsTrue(condition.IsValid(new TestClass {
                Email = "abcABC"
            }));
        }
        public virtual IAcceptInputTransition <T> ActivateRegexNFATransitionFromRegexCondition(RegexCondition <T> regex)
        {
            if (regex == null)
            {
                throw new ArgumentNullException(nameof(regex));
            }

            var result = this.DynamicInvokeShunt(RegexStateMachineActivationContextInfoBase <T> .ActivateRegexNFATransitionFromRegexConditionSource, regex);

            if (result.Success)
            {
                return((IAcceptInputTransition <T>)result.ReturnValue);
            }
            else
            {
                return(new BasicRegexFATransition <T>(regex.Condition));
            }
        }
예제 #5
0
        public ICondition GetCondition(RuleItem item)
        {
            IEnumerable <Source.Model.Condition> srcConditions = item.Conditions;
            ICondition mainCondition = null;

            switch (item.Type)
            {
            case RuleItemType.Regex:
                mainCondition = new RegexCondition(item.Key);
                break;

            case RuleItemType.Terminal:
                mainCondition = new TextCondition(item.Key);
                break;

            case RuleItemType.Lemma:
                mainCondition = new LemmaCondition(item.Key);
                break;

            case RuleItemType.Morphology:
                // главный морфологический ключ объединяется
                // с второстепенными морфологичекими условиями
                var morphKeys = item.Key.Split(',');

                if (item.Conditions != null)
                {
                    morphKeys = morphKeys.Concat(item.Conditions
                                                 .Where(c => c.Key == "морф")
                                                 .SelectMany(c => c.Values))
                                .ToArray();
                }

                mainCondition = new MorphologyCondition(morphKeys);
                srcConditions = srcConditions?.Where(x => x.Key != "морф");
                break;

            case RuleItemType.Everything:
                mainCondition = new EverythingCondition();
                break;
            }

            if (item.HasConditions)
            {
                var adConds = _compileConditions(srcConditions).ToArray();

                if (adConds.Length == 1 && mainCondition == null)
                {
                    mainCondition = adConds[0];
                }
                else if (mainCondition == null)
                {
                    mainCondition = new AndCondition(adConds);
                }
                else
                {
                    mainCondition = new AndCondition(new[] { mainCondition }.Concat(adConds));
                }
            }

            return(mainCondition);
        }
예제 #6
0
            public IAcceptInputTransition <string> ActivateRegexNFATransitionFromRegexCondition(RegexCondition <string> regex)
            {
                if (regex == null)
                {
                    throw new ArgumentNullException(nameof(regex));
                }

                RangeSet <string> set = new RangeSet <string>(this.rangeInfo);

                if (regex is RegexConst <string> regexConst)
                {
                    set.Add(regexConst.ConstValue);
                }
                else if (regex is RegexRange <string> regexRange)
                {
                    set.AddRange(regexRange.Minimum, regexRange.Maximum, regexRange.CanTakeMinimum, regexRange.CanTakeMaximum);
                }
                else if (regex is IRange <string> range)
                {
                    set.AddRange(range.Minimum, range.Maximum, range.CanTakeMinimum, range.CanTakeMaximum);
                }
                else
                {
                    throw new NotSupportedException();
                }

                return(new RangeSetRegexFATransition <string, BasicRegexNFAState <string> >(set));
            }