public void CompilingAnInvalidRuleSetThrowsAnException()
 {
     var rs = new RuleSet();
     Assert.Throws(typeof(Exception), delegate
     {
         IRuleEngine engine = WFRuleEngine.Compile(rs);
     });
 }
 public void CompilingAValidRuleSetReturnsARuleEngine()
 {
     var rs = new RuleSet { Name = "Whatever" };
     Assert.DoesNotThrow(delegate
     {
         IRuleEngine engine = WFRuleEngine.Compile(rs);
         engine.Invoke(_workingMemory);
     });
 }
        public void RuleSetIsValidIfRulesAreValid()
        {
            var rule = new Rule { Name = "First Rule", TopCondition = new LogicCondition { Operator = "all" } };
            var action1 = new AssignAction { LeftHandSide = "Person.Salutation", Value = "Mr." };
            var action2 = new AssignAction { LeftHandSide = "Person.Greeting", Value = "Hello" };
            rule.AddAction(action1);
            rule.AddAction(action2);

            var rs = new RuleSet { Name = "Whatever" };
            rs.AddInput("Person", typeof(TestPerson));
            rs.AddRule(rule);

            Assert.IsTrue(rs.IsValid());
        }
 public static WFRuleEngine Compile(RuleSet ruleSet)
 {
     if (ruleSet.IsValid())
     {
         var activity = new DynamicActivity();
         CompileInputs(activity, ruleSet);
         var implementation = CompileRules(ruleSet);
         activity.Implementation = () => implementation;
         return new WFRuleEngine(activity);
     }
     else
     {
         throw new Exception("RuleSet cannot be compiled.");
     }
 }
        public void InvokingWithIncorrectWorkingMemoryThrowsAnException()
        {
            var rule = new Rule { Name = "First Rule", TopCondition = new LogicCondition { Operator = "all" } };
            var action1 = new AssignAction { LeftHandSide = "Person.Salutation", Value = "Mr." };
            rule.AddAction(action1);

            var rs = new RuleSet { Name = "Whatever" };
            rs.AddInput("Person", typeof(TestPerson));
            rs.AddRule(rule);

            IRuleEngine engine = WFRuleEngine.Compile(rs);

            Assert.Throws(typeof(InvalidWorkflowException), delegate
            {
                engine.Invoke(_workingMemory);
            });
        }
        public void SetUp()
        {
            _workingMemory = new Dictionary<string, object>();

            _ruleSet = new RuleSet { Name = "Test RuleSet" };
            _ruleSet.AddInput("Person", typeof(TestPerson));
        }
 private static Sequence CompileRules(RuleSet ruleSet)
 {
     var sequence = new Sequence();
     foreach (var rule in ruleSet.Rules)
     {
         var condition = CompileConditions(rule.TopCondition, ruleSet.Inputs);
         condition.Then = CompileActions(rule, ruleSet.Inputs);
         sequence.Activities.Add(condition);
     }
     return sequence;
 }
        private static void CompileInputs(DynamicActivity activity, RuleSet ruleSet)
        {
            var settings = new VisualBasicSettings();
            foreach (var input in ruleSet.Inputs)
            {
                var inProperty = new DynamicActivityProperty
                {
                    Name = input.Key,
                    Type = typeof(InArgument<>).MakeGenericType(input.Value)
                };
                activity.Properties.Add(inProperty);

                settings.ImportReferences.Add(new VisualBasicImportReference
                    {
                        Assembly = input.Value.Assembly.GetName().Name,
                        Import = input.Value.Namespace
                    });
            }
            VisualBasic.SetSettings(activity, settings);
        }
 public void RuleSetWithoutNameIsInvalid()
 {
     var rs = new RuleSet();
     Assert.IsFalse(rs.IsValid());
 }
 public void EmptyRuleSetIsValid()
 {
     var rs = new RuleSet { Name = "Whatever" };
     Assert.IsTrue(rs.IsValid());
 }
 public void CanAddRulesToRuleSet()
 {
     var rs = new RuleSet { Name = "Whatever" };
     var rule = new Rule { TopCondition = new LogicCondition { Operator = "all" } };
     Assert.DoesNotThrow(delegate { rs.AddRule(rule); });
 }
 public void CanAddInputsToRuleSet()
 {
     var rs = new RuleSet { Name = "Whatever" };
     Assert.DoesNotThrow(delegate { rs.AddInput("Person", typeof(TestPerson)); });
 }