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(); }
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()); }
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(); }
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); }
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(); }
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); }
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); }
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(); }
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(); }
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")); }
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(); }
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()); }
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)); }
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()); }
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(); }
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); }
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)); }
public FactType1Projection(FactType1 fact) { Value = fact.TestProperty; }