예제 #1
0
        public void Visio2003ImplicationProperties_2_1()
        {
            int totalTest = 0;

            using (Visio2003Adapter va = new Visio2003Adapter(ruleFilesFolder + "test-2_1.vdx", FileAccess.Read)) {
                foreach (Implication i in va.Implications)
                {
                    if (i.Label == "imp1")
                    {
                        Assert.AreEqual(70, i.Priority, "imp1: Priority");
                        Assert.AreEqual("imp2", i.Mutex, "imp1: Mutex");
                        Assert.AreEqual("imp3", i.Precondition, "imp1: Precondition");
                        Assert.AreEqual(ImplicationAction.Assert, i.Action, "imp1: Asserting");
                        totalTest++;
                    }
                    else if (i.Label == "imp2")
                    {
                        Assert.AreEqual(20, i.Priority, "imp2: Priority");
                        Assert.AreEqual("imp1", i.Mutex, "imp2: Mutex");
                        Assert.AreEqual("imp3", i.Precondition, "imp2: Precondition");
                        Assert.AreEqual(ImplicationAction.Assert, i.Action, "imp2: Asserting");
                        totalTest++;
                    }
                }
            }

            Assert.AreEqual(2, totalTest, "totalTest");
        }
예제 #2
0
        public void Visio2003PageNames()
        {
            IList <string> pageNames = Visio2003Adapter.GetPageNames(ruleFilesFolder + "discount.vdx");

            Assert.AreEqual(5, pageNames.Count, "Page count");

            string expectedResult = "|Customer Data|Customer Rules|Discount Rules|Product Data|Queries|";

            foreach (string pageName in pageNames)
            {
                Assert.IsTrue(expectedResult.Contains("|" + pageName + "|"), pageName + " found");
            }
        }
예제 #3
0
 public void Visio2003ImplicationProperties_2_3()
 {
     using (Visio2003Adapter va = new Visio2003Adapter(ruleFilesFolder + "test-2_3.vdx", FileAccess.Read)) {
         CommonVisio2003ImplicationProperties(1, 5, va, false);
         foreach (Implication i in va.Implications)
         {
             if (i.Label == "imp1")
             {
                 Assert.IsTrue(i.Deduction.HasFormula, "imp1: HasFormula");
                 break;
             }
         }
     }
 }
예제 #4
0
        public void Visio2003ImplicationProperties_2_3()
        {
            int totalTest = 0;

            using (Visio2003Adapter va = new Visio2003Adapter(ruleFilesFolder + "test-2_3.vdx", FileAccess.Read)) {
                foreach (Implication i in va.Implications)
                {
                    if (i.Label == "imp1")
                    {
                        Assert.AreEqual(70, i.Priority, "imp1: Priority");
                        Assert.AreEqual("imp2", i.Mutex, "imp1: Mutex");
                        Assert.AreEqual("imp3", i.Precondition, "imp1: Precondition");
                        Assert.AreEqual(ImplicationAction.Assert, i.Action, "imp1: Asserting");
                        Assert.IsTrue(i.Deduction.HasFormula, "imp1: HasFormula");
                    }
                    else if (i.Label == "imp2")
                    {
                        Assert.AreEqual(20, i.Priority, "imp2: Priority");
                        Assert.AreEqual("imp1", i.Mutex, "imp2: Mutex");
                        Assert.AreEqual("imp3", i.Precondition, "imp2: Precondition");
                        Assert.AreEqual(ImplicationAction.Retract, i.Action, "imp2: Retract");
                    }
                    else if (i.Label == "imp3")
                    {
                        Assert.AreEqual(50, i.Priority, "imp3: Priority");
                        Assert.AreEqual(String.Empty, i.Mutex, "imp3: Mutex");
                        Assert.AreEqual(String.Empty, i.Precondition, "imp3: Precondition");
                        Assert.AreEqual(ImplicationAction.Assert, i.Action, "imp3: Assert");
                    }
                    else if (i.Label == "imp4")
                    {
                        Assert.AreEqual(50, i.Priority, "imp4: Priority");
                        Assert.AreEqual(String.Empty, i.Mutex, "imp4: Mutex");
                        Assert.AreEqual(String.Empty, i.Precondition, "imp4: Precondition");
                        Assert.AreEqual(ImplicationAction.Count, i.Action, "imp4: Count");
                    }
                    else if (i.Label == "imp5")
                    {
                        Assert.AreEqual(50, i.Priority, "imp5: Priority");
                        Assert.AreEqual(String.Empty, i.Mutex, "imp5: Mutex");
                        Assert.AreEqual(String.Empty, i.Precondition, "imp5: Precondition");
                        Assert.AreEqual(ImplicationAction.Modify, i.Action, "imp4: Modify");
                    }
                    totalTest++;
                }
            }

            Assert.AreEqual(5, totalTest, "totalTest");
        }
예제 #5
0
        public void Visio2003PageNames()
        {
            string[] pageNames = Visio2003Adapter.GetPageNames(ruleFilesFolder + "discount.vdx");
            Assert.AreEqual(5, pageNames.Length, "Page count");

            Array.Sort(pageNames);
            string expectedResult = "|Customer Data|Customer Rules|Discount Rules|Product Data|Queries|";
            string actualResult   = "|";

            foreach (string pageName in pageNames)
            {
                actualResult += (pageName + "|");
            }
            Assert.AreEqual(expectedResult, actualResult, "Page names");
        }
예제 #6
0
        private void RunVisio2003ImplicationProperties_3_0(bool strict)
        {
            using (Visio2003Adapter va = new Visio2003Adapter(ruleFilesFolder + "test-3_0" + (strict?"-strict":"") + ".vdx",
                                                              FileAccess.Read,
                                                              strict)) {
                CommonVisio2003ImplicationProperties(1, 5, va, false);

                foreach (Implication i in va.Implications)
                {
                    if (i.Label == "imp1")
                    {
                        Assert.IsTrue(i.Deduction.HasFormula, "imp1: HasFormula");
                        Atom atom = (Atom)i.AtomGroup.Members[0];
                        Assert.IsTrue(atom.HasSlot, "Has Slot");

                        Assert.IsInstanceOfType(typeof(byte[]), atom.GetPredicateValue(1), "Typed predicate support");

                        Assert.IsInstanceOfType(typeof(Function), atom.Members[2], "Basic slot type predicate support");
                        Assert.AreEqual("Size", atom.SlotNames[2], "Basic slot name predicate support");

                        Assert.IsInstanceOfType(typeof(int), atom.GetPredicateValue(3), "Typed slot type predicate support");
                        Assert.AreEqual("Year", atom.SlotNames[3], "Typed slot name predicate support");
                        Assert.AreEqual(2006, atom.GetPredicate("Year").Value, "Typed slot value support");
                        break;
                    }
                }

                Assert.AreEqual(1, va.IntegrityQueries.Count, "Integrity Queries Count");
                Assert.AreEqual("iq1", va.IntegrityQueries[0].Label, "Integrity Query Label");

                Assert.AreEqual(2, va.Equivalents.Count, "Equivalents count");
                foreach (Equivalent equivalent in va.Equivalents)
                {
                    Assert.AreEqual("eq1", equivalent.Label, "Equivalent label");
                }

                List <string> expected = new List <string>(new string[] { "own{?person,?stuff} == possess{?person,?stuff}", "own{?person,?stuff} == belong{?stuff,?person}" });
                foreach (Equivalent equivalent in va.Equivalents)
                {
                    Assert.IsTrue(expected.Contains(equivalent.ToString()), equivalent.ToString() + " found.");
                    expected.Remove(equivalent.ToString());
                }
            }
        }
예제 #7
0
        private void CommonVisio2003ImplicationProperties(int expectedQueryCount, int expectedImplicationCount, Visio2003Adapter va, bool onlyAssert)
        {
            Assert.AreEqual(expectedQueryCount, va.Queries.Count, "expectedQueryCount");

            foreach (Query q in va.Queries)
            {
                if (q.Label == "q1")
                {
                    Assert.AreEqual(1, q.AtomGroup.AllAtoms.Count, "Count of query atoms");
                }
            }

            Assert.AreEqual(expectedImplicationCount, va.Implications.Count, "expectedImplicationCount");

            foreach (Implication i in va.Implications)
            {
                if (i.Label == "imp1")
                {
                    Assert.AreEqual(70, i.Priority, "imp1: Priority");
                    Assert.AreEqual("imp2", i.Mutex, "imp1: Mutex");
                    Assert.AreEqual("imp3", i.Precondition, "imp1: Precondition");
                    Assert.AreEqual(ImplicationAction.Assert, i.Action, "imp1: Assert");
                }
                else if (i.Label == "imp2")
                {
                    Assert.AreEqual(20, i.Priority, "imp2: Priority");
                    Assert.AreEqual("imp1", i.Mutex, "imp2: Mutex");
                    Assert.AreEqual("imp3", i.Precondition, "imp2: Precondition");
                    Assert.AreEqual(onlyAssert?ImplicationAction.Assert:ImplicationAction.Retract, i.Action, "imp2: Retract");
                }
                else if (i.Label == "imp3")
                {
                    Assert.AreEqual(50, i.Priority, "imp3: Priority");
                    Assert.AreEqual(String.Empty, i.Mutex, "imp3: Mutex");
                    Assert.AreEqual(String.Empty, i.Precondition, "imp3: Precondition");
                    Assert.AreEqual(ImplicationAction.Assert, i.Action, "imp3: Assert");
                }
                else if (i.Label == "imp4")
                {
                    Assert.AreEqual(50, i.Priority, "imp4: Priority");
                    Assert.AreEqual(String.Empty, i.Mutex, "imp4: Mutex");
                    Assert.AreEqual(String.Empty, i.Precondition, "imp4: Precondition");
                    Assert.AreEqual(onlyAssert?ImplicationAction.Assert:ImplicationAction.Count, i.Action, "imp4: Count");
                }
                else if (i.Label == "imp5")
                {
                    Assert.AreEqual(50, i.Priority, "imp5: Priority");
                    Assert.AreEqual(String.Empty, i.Mutex, "imp5: Mutex");
                    Assert.AreEqual(String.Empty, i.Precondition, "imp5: Precondition");
                    Assert.AreEqual(onlyAssert?ImplicationAction.Assert:ImplicationAction.Modify, i.Action, "imp4: Modify");
                }
            }
        }
예제 #8
0
 public void Visio2003ImplicationProperties_2_2()
 {
     using (Visio2003Adapter va = new Visio2003Adapter(ruleFilesFolder + "test-2_2.vdx", FileAccess.Read)) {
         CommonVisio2003ImplicationProperties(0, 4, va, false);
     }
 }
예제 #9
0
        public void LoadRuleBase(MainForm mf, string uri, bool onlyFacts)
        {
            IBinder binder = null;

            // give priority to custom compiled binders
            if (File.Exists(uri + ".ccb"))
            {
                up.lastBinderClassName = mf.PromptForString("C# Custom Binder - " + uri + ".ccb",
                                                            "Enter the fully qualified name of the binder class:",
                                                            up.lastBinderClassName);
                binder = CSharpBinderFactory.LoadFromFile(up.lastBinderClassName, uri + ".ccb");
            }
            else if (File.Exists(uri + ".vcb"))
            {
                up.lastBinderClassName = mf.PromptForString("VB.NET Custom Binder - " + uri + ".vcb",
                                                            "Enter the fully qualified name of the binder class:",
                                                            up.lastBinderClassName);
                binder = VisualBasicBinderFactory.LoadFromFile(up.lastBinderClassName, uri + ".vcb");
            }
            else if (File.Exists(uri + ".xbre"))
            {
                bool isBeforeAfter = mf.AskYesNoQuestion("Flow Engine Binder - " + uri + ".xbre",
                                                         uri + ".xbre\n\nIs this binder running in Before/After mode ?\n\n(No would mean that it runs in Control Process mode)");

                binder = new FlowEngineBinder(uri + ".xbre", isBeforeAfter?BindingTypes.BeforeAfter:BindingTypes.Control);
            }

            if (!onlyFacts)
            {
                ie = new IEImpl(binder);
            }

            switch (Path.GetExtension(uri).ToLower())
            {
            case ".ruleml":
                try {
                    if (onlyFacts)
                    {
                        ie.LoadFacts(new RuleML09NafDatalogAdapter(uri, FileAccess.Read));
                    }
                    else
                    {
                        ie.LoadRuleBase(new RuleML09NafDatalogAdapter(uri, FileAccess.Read));
                    }
                }
                catch (Exception firstAttemptException) {
                    try {
                        if (onlyFacts)
                        {
                            ie.LoadFacts(new RuleML086NafDatalogAdapter(uri, FileAccess.Read));
                        }
                        else
                        {
                            ie.LoadRuleBase(new RuleML086NafDatalogAdapter(uri, FileAccess.Read));
                        }
                    }
                    catch (Exception) {
                        try {
                            if (onlyFacts)
                            {
                                ie.LoadFacts(new RuleML086DatalogAdapter(uri, FileAccess.Read));
                            }
                            else
                            {
                                ie.LoadRuleBase(new RuleML086DatalogAdapter(uri, FileAccess.Read));
                            }
                        }
                        catch (Exception) {
                            try {
                                if (onlyFacts)
                                {
                                    ie.LoadFacts(new RuleML08DatalogAdapter(uri, FileAccess.Read));
                                }
                                else
                                {
                                    ie.LoadRuleBase(new RuleML08DatalogAdapter(uri, FileAccess.Read));
                                }
                            } catch (Exception) {
                                // the fall-back policy failed, hence throw the original exception
                                throw firstAttemptException;
                            }
                        }
                    }
                }
                break;

            case ".hrf":
                if (onlyFacts)
                {
                    ie.LoadFacts(new HRF086Adapter(uri, FileAccess.Read));
                }
                else
                {
                    ie.LoadRuleBase(new HRF086Adapter(uri, FileAccess.Read));
                }
                break;

            case ".vdx":
                string[] selectedPages = mf.PromptForVisioPageNameSelection(Visio2003Adapter.GetPageNames(uri));
                if (selectedPages != null)
                {
                    if (onlyFacts)
                    {
                        ie.LoadFacts(new Visio2003Adapter(uri, FileAccess.Read, selectedPages));
                    }
                    else
                    {
                        ie.LoadRuleBase(new Visio2003Adapter(uri, FileAccess.Read, (DialogResult.Yes == MessageBox.Show(mf,
                                                                                                                        "Is your Visio rule base using strict syntax?",
                                                                                                                        "Visio strictness",
                                                                                                                        MessageBoxButtons.YesNo,
                                                                                                                        MessageBoxIcon.Question,
                                                                                                                        MessageBoxDefaultButton.Button2)), selectedPages));
                    }
                }
                break;

            default:
                throw new Exception(Path.GetExtension(uri) + " is an unknown extension.");
            }
        }
예제 #10
0
            public void LoadRules()
            {
                // prepare the rule base adapter for reading the rule file
                var ruleFileFullPath = configurationFolder + Path.DirectorySeparatorChar + RuleFile;

                if (Logger.IsInferenceEngineVerbose)
                {
                    Logger.InferenceEngineSource.TraceEvent(TraceEventType.Verbose,
                                                            0,
                                                            "Loading rule file: "
                                                            + ruleFileFullPath
                                                            + " of format: "
                                                            + engineConfiguration.Rules.Format);
                }

                IRuleBaseAdapter ruleBaseAdapter = null;

                switch (engineConfiguration.Rules.Format)
                {
                case RulesFormat.HRF086:
                    ruleBaseAdapter = new HRF086Adapter(ruleFileFullPath, FileAccess.Read);
                    break;

                case RulesFormat.RuleML08Datalog:
                    ruleBaseAdapter = new RuleML08DatalogAdapter(ruleFileFullPath, FileAccess.Read);
                    break;

                case RulesFormat.RuleML086Datalog:
                    ruleBaseAdapter = new RuleML086DatalogAdapter(ruleFileFullPath, FileAccess.Read);
                    break;

                case RulesFormat.RuleML086NafDatalog:
                    ruleBaseAdapter = new RuleML086NafDatalogAdapter(ruleFileFullPath, FileAccess.Read);
                    break;

                case RulesFormat.RuleML09NafDatalog:
                    ruleBaseAdapter = new RuleML09NafDatalogAdapter(ruleFileFullPath, FileAccess.Read);
                    break;

                case RulesFormat.Visio2003:
                    ruleBaseAdapter = new Visio2003Adapter(ruleFileFullPath, FileAccess.Read);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                // estimate if a binder is present
                if (engineConfiguration.Binder != null)
                {
                    var binder = engineConfiguration.Binder as CSharpBinderConfiguration;
                    if (binder != null)
                    {
                        var cSharpBinderConfiguration = binder;
                        binderFile = cSharpBinderConfiguration.File;

                        if (Logger.IsInferenceEngineVerbose)
                        {
                            Logger.InferenceEngineSource.TraceEvent(TraceEventType.Verbose, 0, "Using CSharp binder file: " + binderFile);
                        }

                        // we load the binder code in a string and then compile it: this method is more reliable than
                        // providing a file path directly
                        using (var sr = File.OpenText(configurationFolder + Path.DirectorySeparatorChar + binderFile))
                        {
                            engine.LoadRuleBase(ruleBaseAdapter, CSharpBinderFactory.LoadFromString(cSharpBinderConfiguration.Class, sr.ReadToEnd()));
                        }
                    }
                    else if (engineConfiguration.Binder is VisualBasicBinderConfiguration)
                    {
                        var visualBasicBinderConfiguration = (VisualBasicBinderConfiguration)engineConfiguration.Binder;
                        binderFile = visualBasicBinderConfiguration.File;

                        if (Logger.IsInferenceEngineVerbose)
                        {
                            Logger.InferenceEngineSource.TraceEvent(TraceEventType.Verbose, 0, "Using Visual Basic binder file: " + binderFile);
                        }

                        // we load the binder code in a string and then compile it: this method is more reliable than
                        // providing a file path directly
                        using (StreamReader sr = File.OpenText(configurationFolder + Path.DirectorySeparatorChar + binderFile))
                        {
                            engine.LoadRuleBase(ruleBaseAdapter, VisualBasicBinderFactory.LoadFromString(visualBasicBinderConfiguration.Class, sr.ReadToEnd()));
                        }
                    }
                    else if (engineConfiguration.Binder is FlowEngineBinderConfiguration)
                    {
                        FlowEngineBinderConfiguration flowEngineBinderConfiguration = (FlowEngineBinderConfiguration)engineConfiguration.Binder;
                        binderFile = flowEngineBinderConfiguration.File;

                        if (Logger.IsInferenceEngineVerbose)
                        {
                            Logger.InferenceEngineSource.TraceEvent(TraceEventType.Verbose, 0, "Using FlowEngine binder file: " + binderFile);
                        }

                        engine.LoadRuleBase(ruleBaseAdapter, new NxBRE.InferenceEngine.IO.FlowEngineBinder(configurationFolder + Path.DirectorySeparatorChar + binderFile, flowEngineBinderConfiguration.Type));
                    }
                    else
                    {
                        throw new BREException("Unexpected type of binder object in registry configuration: " + engineConfiguration.Binder.GetType().FullName);
                    }
                }
                else
                {
                    // no binder specified
                    binderFile = null;
                    engine.LoadRuleBase(ruleBaseAdapter);
                }
            }