Example #1
0
        /// <summary>
        /// Provides programmatic access to the ModelProgramViewer commandline utility 'mpv.exe'.
        /// </summary>
        /// <param name="args">command line arguments: model program(s), optional settings for the viewer</param>
        /// <remarks>The settings are displayed when 'mpv.exe /?' is executed from the command line without arguments.</remarks>
        public static void Run(ModelProgram mp)
        {
            ProgramSettings settings = new ProgramSettings();

            //ModelProgram mp = (ModelProgram)lmp;

            ModelProgramGraphViewForm form = new ModelProgramGraphViewForm("Model Program Viewer");

            //configure the settings of the viewer
            form.View.AcceptingStatesMarked   = settings.acceptingStatesMarked;
            form.View.TransitionLabels        = settings.transitionLabels;
            form.View.CombineActions          = settings.combineActions;
            form.View.Direction               = settings.direction;
            form.View.UnsafeStateColor        = Color.FromName(settings.unsafeStateColor);
            form.View.HoverColor              = Color.FromName(settings.hoverColor);
            form.View.InitialStateColor       = Color.FromName(settings.initialStateColor);
            form.View.LoopsVisible            = settings.loopsVisible;
            form.View.MaxTransitions          = settings.maxTransitions;
            form.View.NodeLabelsVisible       = settings.nodeLabelsVisible;
            form.View.SelectionColor          = Color.FromName(settings.selectionColor);
            form.View.MergeLabels             = settings.mergeLabels;
            form.View.StateShape              = settings.stateShape;
            form.View.DeadStateColor          = Color.FromName(settings.deadStateColor);
            form.View.InitialTransitions      = settings.initialTransitions;
            form.View.LivenessCheckIsOn       = settings.livenessCheckIsOn;
            form.View.ExcludeIsomorphicStates = settings.excludeIsomorphicStates;
            form.View.SafetyCheckIsOn         = settings.safetyCheckIsOn;
            form.View.DeadstatesVisible       = settings.deadStatesVisible;
            form.View.StateViewVisible        = settings.stateViewVisible;

            //show the view of the product of all the model programs
            form.View.SetModelProgram(mp);

            form.OnSaveSettings += new EventHandler(settings.SaveSettings);
            form.ShowDialog();
        }
        /// <summary>
        /// Provides programmatic access to the ModelProgramViewer commandline utility 'mpv.exe'.
        /// </summary>
        /// <param name="args">command line arguments: model program(s), optional settings for the viewer</param>
        /// <remarks>The settings are displayed when 'mpv.exe /?' is executed from the command line without arguments.</remarks>
        public static void RunWithCommandLineArguments(params string[] args)
        {
            ProgramSettings settings = new ProgramSettings();
            if (!Parser.ParseArgumentsWithUsage(args, settings))
            {
                return;
            }

            #region load the libraries
            List<Assembly> libs = new List<Assembly>();
            try
            {

                if (settings.reference != null)
                {
                    foreach (string l in settings.reference)
                    {
                        libs.Add(System.Reflection.Assembly.LoadFrom(l));
                    }
                }
            }
            catch (Exception e)
            {
                throw new ModelProgramUserException(e.Message);
            }
            #endregion

            #region create a model program for each model using the factory method and compose into product
            string mpMethodName;
            string mpClassName;
            ModelProgram mp = null;
            if (settings.model != null && settings.model.Length > 0)
            {
                if (libs.Count == 0)
                {
                    throw new ModelProgramUserException("No reference was provided to load models from.");
                }
                ReflectionHelper.SplitFullMethodName(settings.model[0], out mpClassName, out mpMethodName);
                Type mpType = ReflectionHelper.FindType(libs, mpClassName);
                MethodInfo mpMethod = ReflectionHelper.FindMethod(mpType, mpMethodName, Type.EmptyTypes, typeof(ModelProgram));
                try
                {
                    mp = (ModelProgram)mpMethod.Invoke(null, null);
                }
                catch (Exception e)
                {
                    throw new ModelProgramUserException("Invocation of '" + settings.model[0] + "' failed: " + e.ToString());
                }
                for (int i = 1; i < settings.model.Length; i++)
                {
                    ReflectionHelper.SplitFullMethodName(settings.model[i], out mpClassName, out mpMethodName);
                    mpType = ReflectionHelper.FindType(libs, mpClassName);
                    mpMethod = ReflectionHelper.FindMethod(mpType, mpMethodName, Type.EmptyTypes, typeof(ModelProgram));
                    ModelProgram mp2 = null;
                    try
                    {
                        mp2 = (ModelProgram)mpMethod.Invoke(null, null);
                    }
                    catch (Exception e)
                    {
                        throw new ModelProgramUserException("Invocation of '" + settings.model[i] + "' failed: " + e.ToString());
                    }
                    mp = new ProductModelProgram(mp, mp2);
                }
            }
            #endregion

            #region create a model program from given namespace and feature names
            if (settings.mp != null && settings.mp.Length > 0)
            {
                if (libs.Count == 0)
                {
                    throw new ModelProgramUserException("No reference was provided to load models from.");
                }
                //parse the model program name and the feature names for each entry
                foreach (string mps in settings.mp)
                {
                    //the first element is the model program, the remaining ones are
                    //feature names
                    string[] mpsSplit = mps.Split(new string[] { "[", "]", "," },
                        StringSplitOptions.RemoveEmptyEntries);
                    if (mpsSplit.Length == 0)
                    {
                        throw new ModelProgramUserException("Invalid model program specifier '" + mps + "'.");
                    }
                    string mpName = mpsSplit[0];
                    Assembly mpAssembly = ReflectionHelper.FindAssembly(libs, mpName);
                    Set<string> mpFeatures = new Set<string>(mpsSplit).Remove(mpName);
                    ModelProgram mp1 = new LibraryModelProgram(mpAssembly, mpName, mpFeatures);
                    mp = (mp == null ? mp1 : new ProductModelProgram(mp, mp1));
                }
            }

            #endregion

            #region load the test cases if any
            Sequence<Sequence<CompoundTerm>> testcases = Sequence<Sequence<CompoundTerm>>.EmptySequence;
            if (!String.IsNullOrEmpty(settings.testSuite))
            {
                try
                {
                    System.IO.StreamReader testSuiteReader =
                        new System.IO.StreamReader(settings.testSuite);
                    string testSuiteAsString = testSuiteReader.ReadToEnd();
                    testSuiteReader.Close();
                    CompoundTerm testSuite = CompoundTerm.Parse(testSuiteAsString);
                    foreach (CompoundTerm testCaseTerm in testSuite.Arguments)
                    {
                        Sequence<CompoundTerm> testCase =
                            testCaseTerm.Arguments.Convert<CompoundTerm>(delegate (Term t) { return (CompoundTerm)t; });
                        testcases = testcases.AddLast(testCase);
                    }
                }
                catch (Exception e)
                {
                    throw new ModelProgramUserException("Cannot create test suite: " + e.Message);
                }
            }
            #endregion

            #region load the fsms if any
            Dictionary<string, FSM> fsms = new Dictionary<string, FSM>();
            if (settings.fsm != null && settings.fsm.Length > 0)
            {
                try
                {
                    foreach (string fsmFile in settings.fsm)
                    {
                        System.IO.StreamReader fsmReader = new System.IO.StreamReader(fsmFile);
                        string fsmAsString = fsmReader.ReadToEnd();
                        fsmReader.Close();
                        fsms[fsmFile] = FSM.FromTerm(CompoundTerm.Parse(fsmAsString));
                    }
                }
                catch (Exception e)
                {
                    throw new ModelProgramUserException("Cannot create fsm: " + e.Message);
                }
            }
            #endregion

            if (mp == null && testcases.IsEmpty && fsms.Count == 0)
            {
                throw new ModelProgramUserException("No model, fsm, or test suite was given.");
            }

            if (!testcases.IsEmpty)
            {
                FSM fa = FsmTraversals.GenerateTestSequenceAutomaton(
                    settings.startTestAction, testcases, GetActionSymbols(testcases));
                ModelProgram famp = new FsmModelProgram(fa, settings.testSuite);
                if (mp == null)
                    mp = famp;
                else
                    mp = new ProductModelProgram(mp, famp);
            }

            if (fsms.Count > 0)
            {
                foreach (string fsmName in fsms.Keys)
                {
                    ModelProgram fsmmp = new FsmModelProgram(fsms[fsmName], fsmName);
                    if (mp == null)
                        mp = fsmmp;
                    else
                        mp = new ProductModelProgram(mp, fsmmp);
                }
            }

            ModelProgramGraphViewForm form = new ModelProgramGraphViewForm("Model Program Viewer");
            //configure the settings of the viewer
            form.View.AcceptingStatesMarked = settings.acceptingStatesMarked;
            form.View.TransitionLabels = settings.transitionLabels;
            form.View.CombineActions = settings.combineActions;
            form.View.Direction = settings.direction;
            form.View.UnsafeStateColor = Color.FromName(settings.unsafeStateColor);
            form.View.HoverColor = Color.FromName(settings.hoverColor);
            form.View.InitialStateColor = Color.FromName(settings.initialStateColor);
            form.View.LoopsVisible = settings.loopsVisible;
            form.View.MaxTransitions = settings.maxTransitions;
            form.View.NodeLabelsVisible = settings.nodeLabelsVisible;
            form.View.SelectionColor = Color.FromName(settings.selectionColor);
            form.View.MergeLabels = settings.mergeLabels;
            form.View.StateShape = settings.stateShape;
            form.View.DeadStateColor = Color.FromName(settings.deadStateColor);
            form.View.InitialTransitions = settings.initialTransitions;
            form.View.LivenessCheckIsOn = settings.livenessCheckIsOn;
            form.View.ExcludeIsomorphicStates = settings.excludeIsomorphicStates;
            form.View.SafetyCheckIsOn = settings.safetyCheckIsOn;
            form.View.DeadstatesVisible = settings.deadStatesVisible;
            form.View.StateViewVisible = settings.stateViewVisible;

            //show the view of the product of all the model programs
            form.View.SetModelProgram(mp);

            form.OnSaveSettings += new EventHandler(settings.SaveSettings);
            form.ShowDialog();
        }
Example #3
0
        /// <summary>
        /// Provides programmatic access to the ModelProgramViewer commandline utility 'mpv.exe'.
        /// </summary>
        /// <param name="args">command line arguments: model program(s), optional settings for the viewer</param>
        /// <remarks>The settings are displayed when 'mpv.exe /?' is executed from the command line without arguments.</remarks>
        public static void RunWithCommandLineArguments(params string[] args)
        {
            ProgramSettings settings = new ProgramSettings();

            if (!Parser.ParseArgumentsWithUsage(args, settings))
            {
                return;
            }

            #region load the libraries
            List <Assembly> libs = new List <Assembly>();
            try
            {
                if (settings.reference != null)
                {
                    foreach (string l in settings.reference)
                    {
                        libs.Add(System.Reflection.Assembly.LoadFrom(l));
                    }
                }
            }
            catch (Exception e)
            {
                throw new ModelProgramUserException(e.Message);
            }
            #endregion

            #region create a model program for each model using the factory method and compose into product
            string       mpMethodName;
            string       mpClassName;
            ModelProgram mp = null;
            if (settings.model != null && settings.model.Length > 0)
            {
                if (libs.Count == 0)
                {
                    throw new ModelProgramUserException("No reference was provided to load models from.");
                }
                ReflectionHelper.SplitFullMethodName(settings.model[0], out mpClassName, out mpMethodName);
                Type       mpType   = ReflectionHelper.FindType(libs, mpClassName);
                MethodInfo mpMethod = ReflectionHelper.FindMethod(mpType, mpMethodName, Type.EmptyTypes, typeof(ModelProgram));
                try
                {
                    mp = (ModelProgram)mpMethod.Invoke(null, null);
                }
                catch (Exception e)
                {
                    throw new ModelProgramUserException("Invocation of '" + settings.model[0] + "' failed: " + e.ToString());
                }
                for (int i = 1; i < settings.model.Length; i++)
                {
                    ReflectionHelper.SplitFullMethodName(settings.model[i], out mpClassName, out mpMethodName);
                    mpType   = ReflectionHelper.FindType(libs, mpClassName);
                    mpMethod = ReflectionHelper.FindMethod(mpType, mpMethodName, Type.EmptyTypes, typeof(ModelProgram));
                    ModelProgram mp2 = null;
                    try
                    {
                        mp2 = (ModelProgram)mpMethod.Invoke(null, null);
                    }
                    catch (Exception e)
                    {
                        throw new ModelProgramUserException("Invocation of '" + settings.model[i] + "' failed: " + e.ToString());
                    }
                    mp = new ProductModelProgram(mp, mp2);
                }
            }
            #endregion

            #region create a model program from given namespace and feature names
            if (settings.mp != null && settings.mp.Length > 0)
            {
                if (libs.Count == 0)
                {
                    throw new ModelProgramUserException("No reference was provided to load models from.");
                }
                //parse the model program name and the feature names for each entry
                foreach (string mps in settings.mp)
                {
                    //the first element is the model program, the remaining ones are
                    //feature names
                    string[] mpsSplit = mps.Split(new string[] { "[", "]", "," },
                                                  StringSplitOptions.RemoveEmptyEntries);
                    if (mpsSplit.Length == 0)
                    {
                        throw new ModelProgramUserException("Invalid model program specifier '" + mps + "'.");
                    }
                    string       mpName     = mpsSplit[0];
                    Assembly     mpAssembly = ReflectionHelper.FindAssembly(libs, mpName);
                    Set <string> mpFeatures = new Set <string>(mpsSplit).Remove(mpName);
                    ModelProgram mp1        = new LibraryModelProgram(mpAssembly, mpName, mpFeatures);
                    mp = (mp == null ? mp1 : new ProductModelProgram(mp, mp1));
                }
            }

            #endregion

            #region load the test cases if any
            Sequence <Sequence <CompoundTerm> > testcases = Sequence <Sequence <CompoundTerm> > .EmptySequence;
            if (!String.IsNullOrEmpty(settings.testSuite))
            {
                try
                {
                    System.IO.StreamReader testSuiteReader =
                        new System.IO.StreamReader(settings.testSuite);
                    string testSuiteAsString = testSuiteReader.ReadToEnd();
                    testSuiteReader.Close();
                    CompoundTerm testSuite = CompoundTerm.Parse(testSuiteAsString);
                    foreach (CompoundTerm testCaseTerm in testSuite.Arguments)
                    {
                        Sequence <CompoundTerm> testCase =
                            testCaseTerm.Arguments.Convert <CompoundTerm>(delegate(Term t) { return((CompoundTerm)t); });
                        testcases = testcases.AddLast(testCase);
                    }
                }
                catch (Exception e)
                {
                    throw new ModelProgramUserException("Cannot create test suite: " + e.Message);
                }
            }
            #endregion

            #region load the fsms if any
            Dictionary <string, FSM> fsms = new Dictionary <string, FSM>();
            if (settings.fsm != null && settings.fsm.Length > 0)
            {
                try
                {
                    foreach (string fsmFile in settings.fsm)
                    {
                        System.IO.StreamReader fsmReader = new System.IO.StreamReader(fsmFile);
                        string fsmAsString = fsmReader.ReadToEnd();
                        fsmReader.Close();
                        fsms[fsmFile] = FSM.FromTerm(CompoundTerm.Parse(fsmAsString));
                    }
                }
                catch (Exception e)
                {
                    throw new ModelProgramUserException("Cannot create fsm: " + e.Message);
                }
            }
            #endregion

            if (mp == null && testcases.IsEmpty && fsms.Count == 0)
            {
                throw new ModelProgramUserException("No model, fsm, or test suite was given.");
            }

            if (!testcases.IsEmpty)
            {
                FSM fa = FsmTraversals.GenerateTestSequenceAutomaton(
                    settings.startTestAction, testcases, GetActionSymbols(testcases));
                ModelProgram famp = new FsmModelProgram(fa, settings.testSuite);
                if (mp == null)
                {
                    mp = famp;
                }
                else
                {
                    mp = new ProductModelProgram(mp, famp);
                }
            }

            if (fsms.Count > 0)
            {
                foreach (string fsmName in fsms.Keys)
                {
                    ModelProgram fsmmp = new FsmModelProgram(fsms[fsmName], fsmName);
                    if (mp == null)
                    {
                        mp = fsmmp;
                    }
                    else
                    {
                        mp = new ProductModelProgram(mp, fsmmp);
                    }
                }
            }

            ModelProgramGraphViewForm form = new ModelProgramGraphViewForm("Model Program Viewer");
            //configure the settings of the viewer
            form.View.AcceptingStatesMarked   = settings.acceptingStatesMarked;
            form.View.TransitionLabels        = settings.transitionLabels;
            form.View.CombineActions          = settings.combineActions;
            form.View.Direction               = settings.direction;
            form.View.UnsafeStateColor        = Color.FromName(settings.unsafeStateColor);
            form.View.HoverColor              = Color.FromName(settings.hoverColor);
            form.View.InitialStateColor       = Color.FromName(settings.initialStateColor);
            form.View.LoopsVisible            = settings.loopsVisible;
            form.View.MaxTransitions          = settings.maxTransitions;
            form.View.NodeLabelsVisible       = settings.nodeLabelsVisible;
            form.View.SelectionColor          = Color.FromName(settings.selectionColor);
            form.View.MergeLabels             = settings.mergeLabels;
            form.View.StateShape              = settings.stateShape;
            form.View.DeadStateColor          = Color.FromName(settings.deadStateColor);
            form.View.InitialTransitions      = settings.initialTransitions;
            form.View.LivenessCheckIsOn       = settings.livenessCheckIsOn;
            form.View.ExcludeIsomorphicStates = settings.excludeIsomorphicStates;
            form.View.SafetyCheckIsOn         = settings.safetyCheckIsOn;
            form.View.DeadstatesVisible       = settings.deadStatesVisible;
            form.View.StateViewVisible        = settings.stateViewVisible;

            //show the view of the product of all the model programs
            form.View.SetModelProgram(mp);

            form.OnSaveSettings += new EventHandler(settings.SaveSettings);
            form.ShowDialog();
        }
        /// <summary>
        /// Provides programmatic access to the ModelProgramViewer commandline utility 'mpv.exe'.
        /// </summary>
        /// <param name="args">command line arguments: model program(s), optional settings for the viewer</param>
        /// <remarks>The settings are displayed when 'mpv.exe /?' is executed from the command line without arguments.</remarks>
        public static void Run(ModelProgram mp)
        {
            ProgramSettings settings = new ProgramSettings();

            //ModelProgram mp = (ModelProgram)lmp;

            ModelProgramGraphViewForm form = new ModelProgramGraphViewForm("Model Program Viewer");
            //configure the settings of the viewer
            form.View.AcceptingStatesMarked = settings.acceptingStatesMarked;
            form.View.TransitionLabels = settings.transitionLabels;
            form.View.CombineActions = settings.combineActions;
            form.View.Direction = settings.direction;
            form.View.UnsafeStateColor = Color.FromName(settings.unsafeStateColor);
            form.View.HoverColor = Color.FromName(settings.hoverColor);
            form.View.InitialStateColor = Color.FromName(settings.initialStateColor);
            form.View.LoopsVisible = settings.loopsVisible;
            form.View.MaxTransitions = settings.maxTransitions;
            form.View.NodeLabelsVisible = settings.nodeLabelsVisible;
            form.View.SelectionColor = Color.FromName(settings.selectionColor);
            form.View.MergeLabels = settings.mergeLabels;
            form.View.StateShape = settings.stateShape;
            form.View.DeadStateColor = Color.FromName(settings.deadStateColor);
            form.View.InitialTransitions = settings.initialTransitions;
            form.View.LivenessCheckIsOn = settings.livenessCheckIsOn;
            form.View.ExcludeIsomorphicStates = settings.excludeIsomorphicStates;
            form.View.SafetyCheckIsOn = settings.safetyCheckIsOn;
            form.View.DeadstatesVisible = settings.deadStatesVisible;
            form.View.StateViewVisible = settings.stateViewVisible;

            //show the view of the product of all the model programs
            form.View.SetModelProgram(mp);

            form.OnSaveSettings += new EventHandler(settings.SaveSettings);
            form.ShowDialog();
        }