Beispiel #1
0
        public void Fire_MatchingFactsInsertAndFireThenUpdateAndFire_FiresTwice()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = fact1.TestProperty
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            //Act
            Session.Fire();
            Session.Update(fact1);
            Session.Fire();

            //Assert
            AssertFiredTwice();
        }
        public void Fire_OneMatchingFactOfEachKindNullFact_FiresOnce()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1", ShouldProduceNull3 = true
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = "Valid Value 1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            Assert.Null(GetFiredFact <CalculatedFact3>());
            Assert.NotNull(GetFiredFact <CalculatedFact4>());
        }
        public void Fire_TwoMatchingFactsInsertedTwoRetracted_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType1 {
                TestProperty = "Valid Value 2"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);
            Session.Retract(fact1);
            Session.Retract(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
Beispiel #4
0
        public void Fire_TwoMatchingFactsInsertedOneRetracted_FiresOnceWithOneFactInCollection()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType1 {
                TestProperty = "Valid Value 2"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);
            Session.Retract(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            Assert.AreEqual(1, GetFiredFact <IEnumerable <FactType1> >().Count());
        }
        public void Fire_MatchingMainFactAndOnePartOfOrGroupAndGroupFactRetracted_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = fact1.TestProperty
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            Session.Retract(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
        public void Fire_TwoMatchingFactsTwoFactsToAggregate_FiresTwiceWithTwoFactsInEachCollection()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType1 {
                TestProperty = "Valid Value 2"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredTwice();
            Assert.AreEqual(2, GetFiredFact <IEnumerable <FactType1> >(0).Count());
            Assert.AreEqual(2, GetFiredFact <IEnumerable <FactType1> >(1).Count());
        }
Beispiel #7
0
        public void Fire_TwoMatchingFacts_FiresTwice()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType1 {
                TestProperty = "Valid Value 2"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredTwice();
            Assert.AreEqual(fact1.TestProperty, GetFiredFact <FactType1Projection>(0).Value);
            Assert.AreEqual(fact2.TestProperty, GetFiredFact <FactType1Projection>(1).Value);
        }
        public void Fire_OneMatchingFactOfEachKindSecondFactRetracted_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = "Valid Value 1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            Session.Retract(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
Beispiel #9
0
        public void Fire_OneMatchingFactInsertedThenUpdatedNoFactsOfSecondKind_UpdatePropagatesFiresOnce()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };

            Session.Insert(fact1);

            fact1.TestProperty = "Valid Value 2";
            Session.Update(fact1);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            var calculatedFact = GetFiredFact <CalculatedFact>();

            Assert.Equal("Valid Value 2", calculatedFact.Value);
        }
        public void Fire_FailedAssertThenAssertForDifferentJoin_FiresForSuccessfulJoin()
        {
            //Arrange
            Session.Events.LhsExpressionFailedEvent += (sender, args) => args.IsHandled = true;

            var fact11 = new FactType1 {
                TestProperty = "Valid Value 1"
            };

            Session.Insert(fact11);

            var fact12 = new FactType1 {
                TestProperty = "Valid Value 2"
            };

            Session.Insert(fact12);

            GetRuleInstance <TestRule>().Grouping = ThrowGrouping;

            var fact21 = new FactType2 {
                GroupProperty = "Group1", JoinProperty = "Valid Value 1"
            };

            Session.Insert(fact21);

            GetRuleInstance <TestRule>().Grouping = x => x.GroupProperty;

            var fact22 = new FactType2 {
                GroupProperty = "Group2", JoinProperty = "Valid Value 2"
            };

            Session.Insert(fact22);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            Assert.Equal("Valid Value 2", GetFiredFact <FactType1>().TestProperty);
        }
Beispiel #11
0
        public void Fire_OneInvalidFactAndSecondMatchingFactFirstUpdatedToValid_FiresOnce()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Invalid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = "Valid Value 1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact1.TestProperty = "Valid Value 1";
            Session.Update(fact1);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
        }
Beispiel #12
0
        public void Fire_TwoMatchingFactsSecondUpdatedToInvalid_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = fact1.TestProperty
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact2.TestProperty = "Invalid Value 2";
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
        public void Fire_OneMatchingFactOfEachKindSecondFactUpdatedToInvalidateBindingCondition_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = "Valid Value 1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact2.Counter = 1;
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
        public void Fire_OneFactInsertedThenUpdatedToAnotherGroup_FiresOnceWithOneFactInSecondGroup()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value Group1"
            };

            Session.Insert(fact1);

            fact1.TestProperty = "Valid Value Group2";
            Session.Update(fact1);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            var firedGroup = GetFiredFact <IGrouping <string, FactType1> >();

            Assert.AreEqual(1, firedGroup.Count());
            Assert.AreEqual("Valid Value Group2", firedGroup.Key);
        }
Beispiel #15
0
        public void Fire_ConditionsMatchInterceptorDoesNotInvoke_DoesNotExecuteAction()
        {
            //Arrange
            Session.ActionInterceptor = new ActionInterceptor(invoke: false);

            var fact1 = new FactType1();
            var fact2 = new FactType2();

            Session.Insert(fact1);
            Session.Insert(fact2);

            bool actionExecuted = false;

            GetRuleInstance <TestRule>().Action = () => { actionExecuted = true; };

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            Assert.False(actionExecuted);
        }
Beispiel #16
0
        public void Fire_OneMatchingFact_LinkedFactHasSource()
        {
            //Arrange
            IFact matchedFact2 = null;
            IFact matchedFact3 = null;

            Session.Events.FactInsertedEvent += (sender, args) =>
            {
                if (args.Fact.Type == typeof(FactType2))
                {
                    matchedFact2 = args.Fact;
                }
                if (args.Fact.Type == typeof(FactType3))
                {
                    matchedFact3 = args.Fact;
                }
            };

            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1", ChainProperty = "Valid Value 1"
            };

            Session.Insert(fact1);

            //Act
            Session.Fire();

            //Assert
            Assert.NotNull(matchedFact2);
            Assert.NotNull(matchedFact3);
            Assert.NotNull(matchedFact2.Source);
            Assert.Equal(FactSourceType.Linked, matchedFact2.Source.SourceType);
            Assert.Single(matchedFact2.Source.Facts, x => x.Value == fact1);

            var linkedSource = (ILinkedFactSource)matchedFact2.Source;

            Assert.NotNull(linkedSource.Rule);
            Assert.Contains(nameof(ForwardChainingFirstRule), linkedSource.Rule.Name);
        }
        public void Fire_OneMatchingFactOfEachKindFirstFactUpdatedInvalidJoin_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1", JoinProperty = "Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = "Value 1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact1.JoinProperty = "Value 2";
            Session.Update(fact1);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
        public void Fire_MatchingFactsInsertAndFireThenUpdateKeyDidNotChangeAndFire_FiresOnce()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1", Allow = true
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", Allow = true
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            //Act
            Session.Fire();

            Session.Update(fact2);
            Session.Fire();

            //Assert
            AssertFiredOnce();
        }
Beispiel #19
0
        public void Fire_YieldThrowsThenUpdatedToValid_YieldsOnUpdate()
        {
            //Arrange
            var fact1 = new FactType1 {
                ChainProperty = "Value", ShouldThrow = true
            };

            Session.Insert(fact1);

            Assert.Throws <RuleRhsExpressionEvaluationException>(() => Session.Fire());

            fact1.ShouldThrow = false;

            //Act
            Session.Update(fact1);
            Session.Fire();

            //Assert
            var linkedFacts = Session.Query <FactType2>();

            Assert.Equal(1, linkedFacts.Count());
        }
        public void Fire_TwoFactsWithNullBothRetracted_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = null
            };
            var fact2 = new FactType1 {
                TestProperty = null
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            Session.Retract(fact1);
            Session.Retract(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
Beispiel #21
0
        public void Fire_RuleFires_RaisesRuleFiredEvent()
        {
            //Arrange
            var factory = CreateTarget();
            var session = factory.CreateSession();

            var fact = new FactType1 {
                TestProperty = "Valid Value"
            };

            session.Insert(fact);

            object          factorySender = null;
            AgendaEventArgs factoryArgs   = null;
            object          sessionSender = null;
            AgendaEventArgs sessionArgs   = null;

            factory.Events.RuleFiredEvent += (sender, args) =>
            {
                factorySender = sender;
                factoryArgs   = args;
            };
            session.Events.RuleFiredEvent += (sender, args) =>
            {
                sessionSender = sender;
                sessionArgs   = args;
            };

            //Act
            session.Fire();

            //Assert
            Assert.AreSame(session, factorySender);
            Assert.AreSame(session, sessionSender);
            Assert.AreSame(fact, factoryArgs.Facts.Single().Value);
            Assert.AreSame(fact, sessionArgs.Facts.Single().Value);
            Assert.That(factoryArgs.Rule.Name.Contains("OneFactRule"));
            Assert.That(sessionArgs.Rule.Name.Contains("OneFactRule"));
        }
Beispiel #22
0
        public void Fire_OneMatchingFactSecondInvalidThenUpdatedToValidJoin_FiresOnce()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = null
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact2.JoinProperty = fact1.TestProperty;
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
        }
Beispiel #23
0
            public override void Define()
            {
                FactType1 fact1 = null;
                FactType2 fact2 = null;
                IEnumerable <FactType4> group = null;

                When()
                .Match <FactType1>(() => fact1, f => f.TestProperty.StartsWith("Valid"))
                .Match <FactType2>(() => fact2, f => f.TestProperty.StartsWith("Valid"), f => f.JoinProperty == fact1.TestProperty)
                .Not <FactType3>(f => f.TestProperty.StartsWith("Invalid"))
                .Exists <FactType3>(f => f.TestProperty.StartsWith("Valid"))
                .Query(() => group, q => q
                       .Match <FactType4>()
                       .Where(f => f.TestProperty.StartsWith("Valid"))
                       .GroupBy(f => f.TestProperty)
                       .SelectMany(x => x)
                       .Collect()
                       .Where(c => c.Any()));

                Then()
                .Do(ctx => ctx.NoOp());
            }
Beispiel #24
0
            public override void Define()
            {
                FactType1 fact   = null;
                string    value  = null;
                int       length = 0;

                When()
                .Match <FactType1>(() => fact,
                                   f => f.TestProperty.StartsWith("Valid"))
                .Query(() => value, q => q
                       .Match <FactType2>(
                           f => f.JoinProperty == fact.TestProperty)
                       .Select(x => x.SelectProperty))
                .Let(() => length, () => value.Length)
                .Having(() => length > 5);

                Filter()
                .Where(() => length > 10);

                Then()
                .Do(ctx => NoOp(fact, value));
            }
Beispiel #25
0
        public void Fire_MatchingNotPatternFactAssertedThenUpdatedToInvalid_FiresOnce()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2", JoinProperty = fact1.TestProperty
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact2.TestProperty = "Invalid Value 2";
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
        }
        public void Fire_OneFactWithValueAnotherWithNullThenNullUpdated_FiresTwiceWithOneFactInEachGroup()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Value"
            };
            var fact2 = new FactType1 {
                TestProperty = null
            };

            Session.Insert(fact1);
            Session.Insert(fact2);
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredTwice();
            Assert.AreEqual(1, GetFiredFact <IGrouping <string, FactType1> >(0).Count());
            Assert.AreEqual(1, GetFiredFact <IGrouping <string, FactType1> >(1).Count());
        }
Beispiel #27
0
        public void Fire_FactOneValidFactTwoAssertedAndUpdatedToInvalid_DoesNotFire()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value 1"
            };
            var fact2 = new FactType2 {
                TestProperty = "Valid Value 2"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            fact2.TestProperty = "Invalid Value 2";
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertDidNotFire();
        }
Beispiel #28
0
            public override void Define()
            {
                FactType1 fact1 = null;
                IEnumerable <FactType2> collection2 = null;
                IEnumerable <FactType3> collection3 = null;
                IEnumerable <FactType4> collection4 = null;

                When()
                .Match <FactType1>(() => fact1, f => f.TestProperty.StartsWith("Valid"))
                .Query(() => collection2, q => q
                       .Match <FactType2>(f => f.TestProperty.StartsWith("Valid"))
                       .Collect())
                .Query(() => collection3, q => q
                       .Match <FactType3>(f => f.TestProperty.StartsWith("Valid"))
                       .Collect())
                .Query(() => collection4, q => q
                       .Match <FactType4>(f => f.TestProperty.StartsWith("Valid"))
                       .Collect()
                       .Where(x => IsMatch(fact1, collection2, collection3, x)));
                Then()
                .Do(ctx => ctx.NoOp());
            }
        public void Fire_MatchingFactsOfBothKindsFirstRetracted_FiresWithDefaultKey()
        {
            //Arrange
            var fact1 = new FactType1 {
                Value = "1"
            };
            var fact2 = new FactType2 {
                GroupKey = "Group1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);

            Session.Retract(fact1);

            //Act
            Session.Fire();

            //Assert
            AssertFiredOnce();
            Assert.Equal("Group1|0", GetFiredFact <IGrouping <string, FactType2> >().Key);
        }
Beispiel #30
0
        public void Fire_TwoFactsForOneGroupInsertedThenOneUpdated_FiresTwiceWithFactsFromGroupOne()
        {
            //Arrange
            var fact1 = new FactType1 {
                TestProperty = "Valid Value Group1"
            };
            var fact2 = new FactType1 {
                TestProperty = "Valid Value Group1"
            };

            Session.Insert(fact1);
            Session.Insert(fact2);
            Session.Update(fact2);

            //Act
            Session.Fire();

            //Assert
            AssertFiredTwice();
            Assert.AreEqual(fact1, GetFiredFact <FactType1>(0));
            Assert.AreEqual(fact2, GetFiredFact <FactType1>(1));
        }
Beispiel #31
0
 public FactType1Projection(FactType1 fact)
 {
     Value = fact.TestProperty;
 }