コード例 #1
0
        public void ExecuteRuleSetRules_GivenRuleSet_OnlyRulesInRuleSetAreRun()
        {
            var patient = new Patient {
                Name = new Name()
            };

            var patientRuleCollection = new PatientRuleCollection();

            var runRuleCount = 0;

            foreach (var patientRule in patientRuleCollection)
            {
                var ruleBuilder = new RuleBuilder <RuleEngineContext <Patient>, Patient> (patientRule as Rule);
                ruleBuilder.Then(p => runRuleCount++).ElseThen(p => runRuleCount++);
            }

            var ruleEngine = new RuleEngine <Patient> (patientRuleCollection);

            var ruleEngineContext = new RuleEngineContext <Patient> (
                patient, new SelectAllRulesInRuleSetSelector(patientRuleCollection.PatientNameRuleSet));

            ruleEngineContext.WorkingMemory.AddContextObject(new Name());

            ruleEngine.ExecuteRules(ruleEngineContext);

            Assert.AreEqual(patientRuleCollection.PatientNameRuleSet.Count(), runRuleCount);
        }
コード例 #2
0
        public void ExecuteShouldRecommendDastRuleThenClause_WorkflowMessageCreated()
        {
            using (var serviceLocatorFixture = new ServiceLocatorFixture())
            {
                // Setup
                SetupServiceLocatorFixture(serviceLocatorFixture);
                var assessmentDefKey = Guid.NewGuid();
                var ruleCollection   =
                    new NidaWorkflowRuleCollection(
                        BuildIAssessmentDefinitionRepositoryMock(assessmentDefKey).Object,
                        BuildIRepositoryMock(null).Object,
                        new Mock <IAssessmentInstanceRepository>().Object);

                var assessmentDefinition = Substitute.For <AssessmentDefinition>();

                var assessmentInstance = new AssessmentInstanceFactory().Create(assessmentDefinition, Guid.NewGuid(), "TestName");
                assessmentInstance.ScoreComplete(new CodedConcept(new CodeSystem("", "", ""), "", ""), "test");
                var messageCollector  = new MessageCollector();
                var ruleEngineContext = new RuleEngineContext <AssessmentInstance>(assessmentInstance);
                ruleEngineContext.WorkingMemory.AddContextObject <IMessageCollector>(messageCollector, "MessageCollector");

                foreach (var action in ruleCollection.ShouldRecommendDastRule.ThenClauses)
                {
                    action(ruleEngineContext);
                }

                Assert.AreEqual(1, messageCollector.Messages.Count(), "Incorrect Number of messages.");
                Assert.AreEqual(typeof(WorkflowMessage), messageCollector.Messages.First().GetType());
                var workflowMessage = messageCollector.Messages.First() as WorkflowMessage;
                Assert.AreEqual(assessmentInstance.Key, workflowMessage.InitiatingAssessmentKey);
                Assert.AreEqual(DrugAbuseScreeningTest.AssessmentCodedConcept.Code, workflowMessage.RecommendedAssessmentDefinitionCode);
            }
        }
コード例 #3
0
        public void ExecuteRules_WithDisabledRule_DisabledRuleIsNotRun()
        {
            var patient = new Patient {
                Name = new Name()
            };

            var patientRuleCollection = new PatientRuleCollection();

            patientRuleCollection.FirstNameCannotBeNull.Disable();

            var ruleRun     = false;
            var ruleBuilder = new RuleBuilder <RuleEngineContext <Patient>, Patient> (patientRuleCollection.FirstNameCannotBeNull as Rule);

            ruleBuilder.Then(p => ruleRun = true).ElseThen(p => ruleRun = true);

            var ruleEngine = new RuleEngine <Patient> (patientRuleCollection);

            var ruleEngineContext = new RuleEngineContext <Patient> (patient);

            ruleEngineContext.WorkingMemory.AddContextObject(new Name());

            ruleEngine.ExecuteRules(ruleEngineContext);

            Assert.IsFalse(ruleRun);
        }
コード例 #4
0
        public void AddItemDefinition_Valid_ElseThenClauseUnSkipsItem()
        {
            var rule = new ItemSkippingRule <object>("1", "Rule");

            var itemDefinition = new ItemDefinition(new CodedConcept(new CodeSystem("1", "1", "Test"), "1", "Test"), ItemType.Question, null)
            {
                ItemMetadata = new ItemMetadata
                {
                    MetadataItems = new List <IMetadataItem>
                    {
                        new RequiredForCompletenessMetadataItem("Report")
                    }
                }
            };

            rule.AddItemDefinitionToSkip(itemDefinition);

            var itemInstance = new ItemInstance("1", "Test", true);

            var assessmentInstance = Substitute.For <AssessmentInstance>();

            assessmentInstance.AssessmentName.Returns("Test");

            var skippingContext = new SkippingContext();

            var context = new RuleEngineContext <AssessmentInstance>(assessmentInstance);

            context.WorkingMemory.AddContextObject(itemInstance, itemInstance.ItemDefinitionCode);
            context.WorkingMemory.AddContextObject(skippingContext);

            rule.ElseThenClauses.First().Invoke(context);

            CollectionAssert.Contains(skippingContext.UnSkippedItemDefinitions, itemDefinition);
        }
コード例 #5
0
ファイル: RuleProcessorTests.cs プロジェクト: girish66/REM
        public void Process_GivenNullRule_ThrowsArgumentException()
        {
            var customer          = new Customer();
            var ruleEngineContext = new RuleEngineContext <Customer> (customer);
            var ruleProcessor     = new RuleProcessor();

            ruleProcessor.Process(ruleEngineContext, null);
        }
コード例 #6
0
ファイル: PropertyRuleTests.cs プロジェクト: divyang4481/REM
        public void AddConstraint_WithNotNullContraint_ConstraintIsAdded()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, string> ( c => c.FirstName, "Rule 1" );
            rule.AddConstraint ( new NotNullConstraint () );

            var customer = new Customer ();
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );
            Assert.IsFalse ( whenResult );
        }
コード例 #7
0
        public void Run(AssessmentInstance assessmentInstance)
        {
            //TODO:If Required
            //Need to update pillar to allow for named rule collections _ruleCollectionFactory.CreateRuleCollection<AssessmentInstance>("NidaWorkflow");
            var ruleCollection    = IoC.CurrentContainer.Resolve <NidaWorkflowRuleCollection>();
            var ruleEngine        = _ruleEngineFactory.CreateRuleEngine(assessmentInstance, ruleCollection);
            var ruleEngineContext = new RuleEngineContext <AssessmentInstance>(assessmentInstance, new SelectAllRulesInRuleSetSelector(assessmentInstance.AssessmentName + "RuleSet"));

            ruleEngineContext.WorkingMemory.AddContextObject(_messageCollector, "MessageCollector");
            ruleEngine.ExecuteRules(ruleEngineContext);
        }
コード例 #8
0
ファイル: RuleTests.cs プロジェクト: divyang4481/REM
        public void Rule_WithWhenClause_WhenClauseIsCallable()
        {
            var customer = new Customer ();
            var ruleEngineContext = new RuleEngineContext<Customer> ( customer );
            Predicate<IRuleEngineContext> whenClause = e => string.IsNullOrWhiteSpace ( ( ( RuleEngineContext<Customer> )e ).Subject.FirstName );

            var rule = new Rule ( "Name" ) { WhenClause = whenClause };
            var isNullOrWhiteSpace = rule.WhenClause ( ruleEngineContext );

            Assert.IsTrue ( isNullOrWhiteSpace );
        }
コード例 #9
0
        /// <inheritdoc/>
        public override bool IsCompliant(object propertyValue, IRuleEngineContext ruleEngineContext)
        {
            var propertyRuleEngineContext = new RuleEngineContext <TProperty> (
                ( TProperty )propertyValue, ruleEngineContext.RuleViolationReporter, _ruleSelector, ruleEngineContext.NameProvider, ruleEngineContext);

            propertyRuleEngineContext.WorkingMemory.AddContextObject(ruleEngineContext.Subject);
            var ruleEngine = new RuleEngine <TProperty> (_ruleCollection);
            var result     = ruleEngine.ExecuteRules(propertyRuleEngineContext);

            return(!result.HasRuleViolation);
        }
コード例 #10
0
ファイル: RuleProcessorTests.cs プロジェクト: girish66/REM
        public void Process_GivenARule_CallsWhenClause()
        {
            var customer           = new Customer();
            var ruleEngineContext  = new RuleEngineContext <Customer> (customer);
            var mockRuleCollection = new MockRuleCollection();

            var ruleProcessor = new RuleProcessor();

            ruleProcessor.Process(ruleEngineContext, mockRuleCollection.MyMockRule);

            Assert.IsTrue(mockRuleCollection.WhenClauseCalled);
        }
コード例 #11
0
        public void CreateSpecificationRule_WithSpecification_SpecificationIsUsed()
        {
            var specification = new TestSpecification();
            var rule          = SpecificationRule.CreateSpecificationRule(specification, "Rule 1");

            var customer = new Customer();
            var context  = new RuleEngineContext <Customer> (customer);

            rule.WhenClause(context);

            Assert.IsTrue(specification.IsSatisfiedByCalled);
        }
コード例 #12
0
ファイル: RuleBuilderTests.cs プロジェクト: divyang4481/REM
        public void DoNotRunIfHasRuleViolation_ShouldRunClauseAdded()
        {
            var rule = new Rule ( "Rule1" );
            var ruleBuilder = new RuleBuilder<RuleEngineContext<Customer>, Customer> ( rule );
            ruleBuilder.DoNotRunIfHasRuleViolation ();

            var ruleEngineContext = new RuleEngineContext ( new Customer () );
            ruleEngineContext.RuleViolationReporter.Report ( new RuleViolation ( rule, null, null ) );

            var shouldRunResult = rule.ShouldRunRule ( ruleEngineContext );

            Assert.IsFalse ( shouldRunResult );
        }
コード例 #13
0
        public void InclusiveBetween_PropertyIsLessThenStartValue_RuleFails()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.InclusiveBetween ( 5, 15 );

            var customer = new Customer { Age = 1 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsFalse ( whenResult );
        }
コード例 #14
0
        public void InclusiveBetween_PropertyInBetweenValues_RulePasses()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.InclusiveBetween ( 5, 15 );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsTrue ( whenResult );
        }
コード例 #15
0
ファイル: RegexTests.cs プロジェクト: divyang4481/REM
        public void MatchesRegex_PropertyMatchesRegex_RulePasses()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.MatchesRegex ( "5" );

            var customer = new Customer { Age = 5 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsTrue ( whenResult );
        }
コード例 #16
0
ファイル: LessThenTests.cs プロジェクト: divyang4481/REM
        public void LessThen_ValueIsGreaterThanProperty_RulePasses()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.LessThen ( 15 );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsTrue ( whenResult );
        }
コード例 #17
0
        public void AddConstraint_WithNotNullContraint_ConstraintIsAdded()
        {
            var rule = PropertyRule.CreatePropertyRule <Customer, string> (c => c.FirstName, "Rule 1");

            rule.AddConstraint(new NotNullConstraint());

            var customer = new Customer();
            var context  = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #18
0
ファイル: MaxLengthTests.cs プロジェクト: divyang4481/REM
        public void MaxLength_PropertyLengthIsLessThenMaxLength_RulePasses()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, string> ( c => c.FirstName, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, string> ( rule );
            ruleBuilder.MaxLength ( 5 );

            var customer = new Customer { FirstName = "Fred" };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsTrue ( whenResult );
        }
コード例 #19
0
ファイル: EqualToTests.cs プロジェクト: divyang4481/REM
        public void EqualTo_ValueNotEqualToProperty_RuleFails()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.GreaterThan ( 15 );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsFalse ( whenResult );
        }
コード例 #20
0
ファイル: EqualToTests.cs プロジェクト: divyang4481/REM
        public void EqualTo_ValueEqualToProperty_RulePasses()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.EqualTo ( 5 );

            var customer = new Customer { Age = 5 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsTrue ( whenResult );
        }
コード例 #21
0
        public void LessThenOrEqualTo_ValueIsEqualToProperty_RulePasses ()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, int> ( c => c.Age, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, int> ( rule );
            ruleBuilder.LessThenOrEqualTo ( 10 );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsTrue ( whenResult );
        }
コード例 #22
0
ファイル: MaxLengthTests.cs プロジェクト: divyang4481/REM
        public void MaxLength_PropertyLengthIsGreaterThanMaxLength_RuleFails()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, string> ( c => c.FirstName, "Rule 1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, string> ( rule );
            ruleBuilder.MaxLength ( 5 );

            var customer = new Customer { FirstName = "123456" };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsFalse ( whenResult );
        }
コード例 #23
0
        private void ExecuteThenClause(IRuleEngineContext ruleEngineContext)
        {
            var propertyValue = PropertyValueDelegate.DynamicInvoke(ruleEngineContext.Subject) as IEnumerable;

            if (propertyValue != null)
            {
                foreach (var childSubject in propertyValue)
                {
                    var subContext = new RuleEngineContext(
                        childSubject, ruleEngineContext.RuleViolationReporter, _ruleSelector, ruleEngineContext.NameProvider, ruleEngineContext);
                    _executeRules(subContext);
                }
            }
        }
コード例 #24
0
        public void Rule_WithWhenClause_WhenClauseIsCallable()
        {
            var customer          = new Customer();
            var ruleEngineContext = new RuleEngineContext <Customer> (customer);
            Predicate <IRuleEngineContext> whenClause = e => string.IsNullOrWhiteSpace(((RuleEngineContext <Customer>)e).Subject.FirstName);

            var rule = new Rule("Name")
            {
                WhenClause = whenClause
            };
            var isNullOrWhiteSpace = rule.WhenClause(ruleEngineContext);

            Assert.IsTrue(isNullOrWhiteSpace);
        }
コード例 #25
0
ファイル: RuleProcessorTests.cs プロジェクト: girish66/REM
        public void Process_WhenWhenClauseReturnsFalse_DoesNotCallThenClause()
        {
            var customer           = new Customer();
            var ruleEngineContext  = new RuleEngineContext <Customer> (customer);
            var mockRuleCollection = new MockRuleCollection {
                WhenClauseReturns = false
            };

            var ruleProcessor = new RuleProcessor();

            ruleProcessor.Process(ruleEngineContext, mockRuleCollection.MyMockRule);

            Assert.IsFalse(mockRuleCollection.ThenClauseCalled);
        }
コード例 #26
0
        public void Constrain_WithAConstraint_AssignsConstraintToRule()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, string> ( c => c.FirstName, "Rule1" );
            var ruleBuilder = new PropertyRuleBuilder<RuleEngineContext<Customer>, Customer, string> ( rule );

            ruleBuilder.Constrain ( new NotNullConstraint () );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var whenResult = rule.WhenClause ( context );

            Assert.IsFalse ( whenResult );
        }
コード例 #27
0
        public void DoNotRunIfHasRuleViolation_ShouldRunClauseAdded()
        {
            var rule        = new Rule("Rule1");
            var ruleBuilder = new RuleBuilder <RuleEngineContext <Customer>, Customer> (rule);

            ruleBuilder.DoNotRunIfHasRuleViolation();

            var ruleEngineContext = new RuleEngineContext(new Customer());

            ruleEngineContext.RuleViolationReporter.Report(new RuleViolation(rule, null, null));

            var shouldRunResult = rule.ShouldRunRule(ruleEngineContext);

            Assert.IsFalse(shouldRunResult);
        }
コード例 #28
0
        public void AddConstraint_ValidConstraint_RunsWhenRuleExecuted()
        {
            var rule       = new ItemSkippingRule <object>("1", "Rule");
            var constraint = Substitute.For <IConstraint> ();

            rule.AddConstraint(constraint);

            var itemInstance = new ItemInstance("1", "Test", true);
            var context      = new RuleEngineContext <object> (itemInstance);

            context.WorkingMemory.AddContextObject(itemInstance, itemInstance.ItemDefinitionCode);

            rule.WhenClause.Invoke(context);

            constraint.Received().IsCompliant(Arg.Any <object> (), Arg.Any <IRuleEngineContext> ());
        }
コード例 #29
0
        public void When_GivenAWhenPredicate_AssignsWhenPredicateToRule()
        {
            var rule        = new Rule("Rule1");
            var ruleBuilder = new RuleBuilder <RuleEngineContext <Customer>, Customer> (rule);

            ruleBuilder.When(c => c.Age < 20);

            var customer = new Customer {
                Age = 10
            };
            var context = new RuleEngineContext <Customer> (customer);

            var lessThan20 = rule.WhenClause(context);

            Assert.IsTrue(lessThan20);
        }
コード例 #30
0
ファイル: RuleBuilderTests.cs プロジェクト: divyang4481/REM
        public void Then_ProvidingAThenClauseOverrideToTheBuilder_RuleShouldHaveAThenClauseOverride()
        {
            var rule = new Rule ( "Rule1" );
            var ruleBuilder = new RuleBuilder<RuleEngineContext<Customer>, Customer> ( rule );
            ruleBuilder.When ( ( cust, ctxt ) => true ).Then ( ( cust, ctxt ) => cust.Age++ );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            foreach ( var clause in rule.ThenClauses )
            {
                clause ( context );
            }

            Assert.AreEqual ( 11, customer.Age );
        }
コード例 #31
0
        public void ExclusiveBetween_PropertyInBetweenValues_RulePasses()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, int> (c => c.Age, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, int> (rule);

            ruleBuilder.ExclusiveBetween(5, 15);

            var customer = new Customer {
                Age = 10
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsTrue(whenResult);
        }
コード例 #32
0
        public void When_WithAWhenFunction_AssignsWhenFunctionToRule()
        {
            var rule        = new Rule("Rule1");
            var ruleBuilder = new RuleBuilder <RuleEngineContext <Customer>, Customer> (rule);

            ruleBuilder.When((cust, ctxt) => cust.Age < 20);

            var customer = new Customer {
                Age = 10
            };
            var context = new RuleEngineContext <Customer> (customer);

            var lessThan20 = rule.WhenClause(context);

            Assert.IsTrue(lessThan20);
        }
コード例 #33
0
ファイル: MinLengthTests.cs プロジェクト: girish66/REM
        public void MinLength_PropertyLengthIsEqualToMaxLength_RulePasses()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, string> (c => c.FirstName, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, string> (rule);

            ruleBuilder.MinLength(5);

            var customer = new Customer {
                FirstName = "12345"
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsTrue(whenResult);
        }
コード例 #34
0
        public void Constrain_WithAConstraint_AssignsConstraintToRule()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, string> (c => c.FirstName, "Rule1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, string> (rule);

            ruleBuilder.Constrain(new NotNullConstraint());

            var customer = new Customer {
                Age = 10
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #35
0
        public void CheckNonResponse_NotANonResponseValue_WhenClauseReturnsFalse()
        {
            var nonResponseValue = "TestNonResponse";
            var rule             = new ItemSkippingRule <object>("1", "Rule");

            rule.CheckNonResponse(new List <string> {
                nonResponseValue
            });

            var itemInstance = new ItemInstance("1", "Test", true);
            var context      = new RuleEngineContext <object>(itemInstance);

            context.WorkingMemory.AddContextObject(itemInstance, itemInstance.ItemDefinitionCode);

            Assert.IsFalse(rule.WhenClause.Invoke(context));
        }
コード例 #36
0
        public void ExclusiveBetween_PropertyIsGreaterThanEndValue_RuleFails()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, int> (c => c.Age, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, int> (rule);

            ruleBuilder.ExclusiveBetween(5, 15);

            var customer = new Customer {
                Age = 25
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #37
0
ファイル: RegexTests.cs プロジェクト: girish66/REM
        public void MatchesRegex_PropertyDoesNotMatchRegex_RuleFails()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, int> (c => c.Age, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, int> (rule);

            ruleBuilder.MatchesRegex("6");

            var customer = new Customer {
                Age = 5
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #38
0
        public void WhenClause_ConstraintFails_ReturnsFalse()
        {
            var rule       = new ItemSkippingRule <object>("1", "Rule");
            var constraint = Substitute.For <IConstraint>();

            constraint.IsCompliant(Arg.Any <object> (), Arg.Any <IRuleEngineContext> ()).Returns(false);

            rule.AddConstraint(constraint);

            var itemInstance = new ItemInstance("1", "Test", true);
            var context      = new RuleEngineContext <object>(itemInstance);

            context.WorkingMemory.AddContextObject(itemInstance, itemInstance.ItemDefinitionCode);

            Assert.IsFalse(rule.WhenClause.Invoke(context));
        }
コード例 #39
0
ファイル: EqualToTests.cs プロジェクト: girish66/REM
        public void EqualTo_ValueNotEqualToProperty_RuleFails()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, int> (c => c.Age, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, int> (rule);

            ruleBuilder.GreaterThan(15);

            var customer = new Customer {
                Age = 10
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #40
0
        public void MaxLength_PropertyLengthIsGreaterThanMaxLength_RuleFails()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, string> (c => c.FirstName, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, string> (rule);

            ruleBuilder.MaxLength(5);

            var customer = new Customer {
                FirstName = "123456"
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #41
0
        public void MeetsSpecification_PropertyDoesNotMeetSpecification_RuleFails()
        {
            var rule        = PropertyRule.CreatePropertyRule <Customer, int> (c => c.Age, "Rule 1");
            var ruleBuilder = new PropertyRuleBuilder <RuleEngineContext <Customer>, Customer, int> (rule);

            ruleBuilder.MeetsSpecification(new TestSpecification());

            var customer = new Customer {
                Age = 15
            };
            var context = new RuleEngineContext <Customer> (customer);

            var whenResult = rule.WhenClause(context);

            Assert.IsFalse(whenResult);
        }
コード例 #42
0
ファイル: SectionABasicRules.cs プロジェクト: girish66/REM
        public void Example3Test()
        {
            var subject = new Example3Subject {
                IsTrue = true
            };
            var ruleEngine = RuleEngine <Example3Subject> .CreateTypedRuleEngine();

            var ruleEngineContext     = new RuleEngineContext <Example3Subject>(subject);
            var example3ContextObject = new Example3ContextObject();

            ruleEngineContext.WorkingMemory.AddContextObject(example3ContextObject);

            ruleEngine.ExecuteRules(ruleEngineContext);

            Assert.AreEqual("hello world", example3ContextObject.Greeting);
        }
コード例 #43
0
ファイル: PropertyRuleTests.cs プロジェクト: divyang4481/REM
        public void AddConstraint_WithNotNullContraint_ARuleViolationIsAdded()
        {
            var rule = PropertyRule.CreatePropertyRule<Customer, string> ( c => c.FirstName, "Rule 1" );
            rule.AddConstraint ( new NotNullConstraint () );
            rule.AutoValidate = true;

            var customer = new Customer ();
            var context = new RuleEngineContext<Customer> ( customer );

            rule.WhenClause ( context );
            foreach ( var elseThenClause in rule.ElseThenClauses )
            {
                elseThenClause ( context );
            }

            Assert.IsTrue ( context.RuleViolationReporter.Count () == 1, "No Rule Violation was created." );
        }
コード例 #44
0
ファイル: RuleProcessorTests.cs プロジェクト: girish66/REM
        public void Process_WhenRuleIsSkipAndViolationError_RuleIsSkiped()
        {
            var customer           = new Customer();
            var ruleEngineContext  = new RuleEngineContext <Customer> (customer);
            var mockRuleCollection = new MockRuleCollection {
                WhenClauseReturns = false
            };

            ruleEngineContext.RuleViolationReporter.Report(new RuleViolation(mockRuleCollection.MyMockRule, null, null));
            (mockRuleCollection.MyMockRule as Rule).AddShouldRunClause(ctx => ctx.RuleViolationReporter.Count() == 0);

            var ruleProcessor = new RuleProcessor();

            ruleProcessor.Process(ruleEngineContext, mockRuleCollection.MyMockRule);

            Assert.IsFalse(mockRuleCollection.WhenClauseCalled);
        }
コード例 #45
0
ファイル: RuleTests.cs プロジェクト: divyang4481/REM
        public void Rule_WithThenClauses_ThenClausesAreCallable()
        {
            var customer = new Customer ();
            var ruleEngineContext = new RuleEngineContext<Customer> ( customer );

            var rule = new Rule ( "Name" );

            Action<IRuleEngineContext> thenClause1 = e => ( ( Customer )e.Subject ).Age = 20;
            rule.AddThenClause ( thenClause1 );

            Action<IRuleEngineContext> thenClause2 = e => ( ( Customer )e.Subject ).Age++;
            rule.AddThenClause ( thenClause2 );

            foreach ( var clause in rule.ThenClauses )
            {
                clause ( ruleEngineContext );
            }

            Assert.AreEqual ( 21, customer.Age );
        }
コード例 #46
0
        public void ThenClause_WithRuleCollection_CollectionRulesAreRun()
        {
            var rule = CollectionPropertyRule.CreateCollectionPropertyRule<Patient, IEnumerable<Address>> (
                p => p.Addresses, "Rule 1" );
            var addressRuleCollection = new AddressRuleCollection ();
            var ruleCalled = false;
            addressRuleCollection.NewRule ( () => addressRuleCollection.MyEmptyRule ).When ( c => ruleCalled = true );
            rule.WithRuleCollection ( addressRuleCollection );

            var patient = new Patient ();
            patient.Addresses.Add ( new Address ( null, null, null, null, null ) );

            var ruleEngineContext = new RuleEngineContext<Patient> ( patient );

            foreach ( var thenClause in rule.ThenClauses )
            {
                thenClause ( ruleEngineContext );
            }

            Assert.IsTrue ( ruleCalled );
        }
コード例 #47
0
        public void ExecuteRules_Duplicate_HasRuleViolations()
        {
            var payorCoverageTypeMock = new Mock<PayorCoverageCacheType>();
            payorCoverageTypeMock.SetupGet(pct => pct.WellKnownName).Returns("Test");

            var payorCoverageCache = new PayorCoverageCache(
                new Mock<Patient>().Object,
                new Mock<PayorCache>().Object,
                new DateRange(DateTime.Now, null),
                "12345",
                new PayorSubscriberCache(
                    new Address(
                        "Test",
                        null,
                        "City",
                        new Mock<CountyArea>().Object,
                        new Mock<StateProvince>().Object,
                        new Mock<Country>().Object,
                        new PostalCode("12345")),
                    null,
                    new Mock<AdministrativeGender>().Object,
                    new PersonName(string.Empty, "Fred", null, "Savage", null),
                    new Mock<PayorSubscriberRelationshipCacheType>().Object),
                payorCoverageTypeMock.Object);

            var repositoryMock = new Mock<IPayorCoverageCacheRepository>();
            repositoryMock.Setup(
                rep => rep.AnyPayorCoverageTypeInEffectiveDateRange(It.IsAny<long>(), It.IsAny<long>(), It.IsAny<PayorCoverageCacheType>(), It.IsAny<DateRange>())).Returns(
                    true);
            var ruleCollection = new PayorCoverageCacheRuleCollection(repositoryMock.Object);
            var ruleEngine = new RuleEngine<PayorCoverageCache>(ruleCollection);

            var ruleContext = new RuleEngineContext<PayorCoverageCache>(payorCoverageCache);
            ruleContext.WorkingMemory.AddContextObject(payorCoverageCache.PayorCoverageCacheType);
            ruleContext.WorkingMemory.AddContextObject(payorCoverageCache.EffectiveDateRange);

            var results = ruleEngine.ExecuteRules(ruleContext);

            Assert.IsTrue(results.HasRuleViolation);
        }
コード例 #48
0
ファイル: RuleEngineTests.cs プロジェクト: divyang4481/REM
        public void ExecuteRules_GivenPatientRuleCollection_AllRulesRun()
        {
            var patient = new Patient { Name = new Name () };

            var patientRuleCollection = new PatientRuleCollection ();

            var runRuleCount = 0;
            foreach ( var patientRule in patientRuleCollection )
            {
                var ruleBuilder = new RuleBuilder<RuleEngineContext<Patient>, Patient> ( patientRule as Rule );
                ruleBuilder.Then ( p => runRuleCount++ ).ElseThen ( p => runRuleCount++ );
            }

            var ruleEngine = new RuleEngine<Patient> ( patientRuleCollection );

            var ruleEngineContext = new RuleEngineContext<Patient> ( patient );
            ruleEngineContext.WorkingMemory.AddContextObject ( new Name () );

            ruleEngine.ExecuteRules ( ruleEngineContext );

            Assert.AreEqual ( patientRuleCollection.Count (), runRuleCount );
        }
コード例 #49
0
ファイル: RuleEngineTests.cs プロジェクト: divyang4481/REM
        public void ExecuteRules_WithDisabledRule_DisabledRuleIsNotRun()
        {
            var patient = new Patient { Name = new Name () };

            var patientRuleCollection = new PatientRuleCollection ();

            patientRuleCollection.FirstNameCannotBeNull.Disable ();

            var ruleRun = false;
            var ruleBuilder = new RuleBuilder<RuleEngineContext<Patient>, Patient> ( patientRuleCollection.FirstNameCannotBeNull as Rule );
            ruleBuilder.Then ( p => ruleRun = true ).ElseThen ( p => ruleRun = true );

            var ruleEngine = new RuleEngine<Patient> ( patientRuleCollection );

            var ruleEngineContext = new RuleEngineContext<Patient> ( patient );
            ruleEngineContext.WorkingMemory.AddContextObject ( new Name () );

            ruleEngine.ExecuteRules ( ruleEngineContext );

            Assert.IsFalse ( ruleRun );
        }
コード例 #50
0
ファイル: RuleBuilderTests.cs プロジェクト: divyang4481/REM
        public void When_WithAWhenFunction_AssignsWhenFunctionToRule()
        {
            var rule = new Rule ( "Rule1" );
            var ruleBuilder = new RuleBuilder<RuleEngineContext<Customer>, Customer> ( rule );
            ruleBuilder.When ( ( cust, ctxt ) => cust.Age < 20 );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var lessThan20 = rule.WhenClause ( context );

            Assert.IsTrue ( lessThan20 );
        }
コード例 #51
0
ファイル: RuleBuilderTests.cs プロジェクト: divyang4481/REM
        public void When_GivenAWhenPredicate_AssignsWhenPredicateToRule()
        {
            var rule = new Rule ( "Rule1" );
            var ruleBuilder = new RuleBuilder<RuleEngineContext<Customer>, Customer> ( rule );
            ruleBuilder.When ( c => c.Age < 20 );

            var customer = new Customer { Age = 10 };
            var context = new RuleEngineContext<Customer> ( customer );

            var lessThan20 = rule.WhenClause ( context );

            Assert.IsTrue ( lessThan20 );
        }