public void Builder_should_create_a_default_InferenceEngine_instance()
        {
            // act
            var engine = new InferenceEngine.Builder().Build();

            // assert
            Assert.IsType <InferenceEngine>(engine);
        }
        public void Builder_WithRuleBase_method_should_set_the_rulebase_property()
        {
            // arrange
            var ruleBase = new RuleBase.Builder().Build();

            // act
            var engine = new InferenceEngine.Builder()
                         .WithRuleBase(ruleBase)
                         .Build();

            // assert
            Assert.Equal(ruleBase, engine.GetRuleBase());
        }
        public void Builder_WithWorkingMemory_method_should_set_the_workingmemory_property()
        {
            // arrange
            var workingMemory = new WorkingMemory.Builder().Build();

            // act
            var engine = new InferenceEngine.Builder()
                         .WithWorkingMemory(workingMemory)
                         .Build();

            // assert
            Assert.Equal(workingMemory, engine.GetWorkingMemory());
        }
        public void Match_method_should_return_an_empty_list_if_no_rules_match()
        {
            // arrange
            var workingMemory = SeedWorkingMemory();
            var ruleBase      = SeedRuleBase(false);
            var engine        = new InferenceEngine.Builder()
                                .WithWorkingMemory(workingMemory)
                                .WithRuleBase(ruleBase)
                                .Build();

            // act
            var rules = engine.Match();

            // assert
            Assert.Equal(0, rules.Count);
        }
        public void Match_method_should_return_a_list_of_matching_rules()
        {
            // arrange
            var workingMemory = SeedWorkingMemory();
            var ruleBase      = SeedRuleBase();
            var engine        = new InferenceEngine.Builder()
                                .WithWorkingMemory(workingMemory)
                                .WithRuleBase(ruleBase)
                                .Build();

            // act
            var rules = engine.Match();

            // assert
            Assert.Contains(ruleBase.Rules[0], rules);
        }
        public void Resolve_method_should_return_a_list_of_all_passed_rule()
        {
            // arrange
            var workingMemory = SeedWorkingMemory();
            var ruleBase      = SeedRuleBase();
            var engine        = new InferenceEngine.Builder()
                                .WithWorkingMemory(workingMemory)
                                .WithRuleBase(ruleBase)
                                .Build();
            var rules      = engine.Match();
            var matchCount = rules.Count;

            // act
            var resolvedRules = engine.Resolve(rules);
            var resolvedCount = resolvedRules.Count;

            // assert
            Assert.Equal(matchCount, resolvedCount);
        }
        public void Execute_method_should_trigger_rule_actions_against_the_working_memory()
        {
            // arrange
            var workingMemory = SeedWorkingMemory();
            var ruleBase      = SeedRuleBase();
            var engine        = new InferenceEngine.Builder()
                                .WithWorkingMemory(workingMemory)
                                .WithRuleBase(ruleBase)
                                .Build();
            var rules         = engine.Match();
            var resolvedRules = engine.Resolve(rules);

            // act
            engine.Execute(resolvedRules);
            var newFacts         = workingMemory.Facts;
            var potentialCSharp  = newFacts.FirstOrDefault(x => x.Assertion == "Potential C# experience");
            var potentialAngular = newFacts.FirstOrDefault(x => x.Assertion == "Potential Angular experience");

            // assert
            Assert.IsType <Fact>(potentialCSharp);
            Assert.IsType <Fact>(potentialAngular);
        }