示例#1
0
        static void Main(string[] args)
        {
            IEnumerable <MyClass> Objects = ParallelEnumerable.Repeat <MyClass>(new MyClass(), 2);

            PetriController <MyClass> pn = new PetriController <MyClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Synch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Synch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Synch, 0);

            pn.Run();
        }
示例#2
0
        public void GeneralTests()
        {
            //test1
            IEnumerable <TestClass> Objects = ParallelEnumerable.Repeat <TestClass>(new TestClass(), 2);

            PetriController <TestClass> pn = new PetriController <TestClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Synch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Synch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Synch, 0);

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            //test2
            Objects = ParallelEnumerable.Repeat <TestClass>(new TestClass(), 2);

            pn = new PetriController <TestClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Asynch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Asynch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Asynch, 0);

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            //test3
            Objects = ParallelEnumerable.Repeat <TestClass>(new TestClass(), 2);

            pn = new PetriController <TestClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Asynch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Synch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Asynch, 0);
            pn.AddTransition(o => true, o => o.Number == 3 && o.Word == "ddd", o => { }, o => { o.Number = 4; o.Word = "eee"; }, ExecutionMode.Synch, 0);

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 4 && o.Word == "eee"));

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 4 && o.Word == "eee"));
        }
示例#3
0
        public void GeneralTests()
        {
            //test1
            IEnumerable<TestClass> Objects = ParallelEnumerable.Repeat<TestClass>(new TestClass(), 2);

            PetriController<TestClass> pn = new PetriController<TestClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Synch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Synch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Synch, 0);

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            //test2
            Objects = ParallelEnumerable.Repeat<TestClass>(new TestClass(), 2);

            pn = new PetriController<TestClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Asynch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Asynch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Asynch, 0);

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 3 && o.Word == "ddd"));

            //test3
            Objects = ParallelEnumerable.Repeat<TestClass>(new TestClass(), 2);

            pn = new PetriController<TestClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Asynch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Synch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Asynch, 0);
            pn.AddTransition(o => true, o => o.Number == 3 && o.Word == "ddd", o => { }, o => { o.Number = 4; o.Word = "eee"; }, ExecutionMode.Synch, 0);

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 4 && o.Word == "eee"));

            pn.Run();

            Assert.IsTrue(Objects.All(o => o.Number == 4 && o.Word == "eee"));
        }
示例#4
0
        public void WorkWhileCanTest()
        {
            //check for finit
            TestClass obj = new TestClass();

            obj.Number = 0;
            obj.Word   = "aaa";

            List <Transition <TestClass> > Transitions = new List <Transition <TestClass> >();

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 0 && obj.Word == "aaa",
                                                       o => { }, o => { obj.Number = 1; obj.Word = "bbb"; }, ExecutionMode.Synch, Transitions.Count()));

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 1 && obj.Word == "bbb",
                                                       o => { }, o => { obj.Number = 2; obj.Word = "ccc"; }, ExecutionMode.Synch, Transitions.Count()));

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 2 && obj.Word == "ccc",
                                                       o => { }, o => { obj.Number = 3; obj.Word = "ddd"; }, ExecutionMode.Synch, Transitions.Count()));

            WorkWhileDelegate del = new WorkWhileDelegate(PetriController <TestClass> .WorkWhileCan);

            var result = del.BeginInvoke(obj, Transitions, null, null);

            System.Threading.Thread.Sleep(1000);

            Assert.IsTrue(result.IsCompleted);



            //check for infinite cycle
            obj        = new TestClass();
            obj.Number = 0;
            obj.Word   = "aaa";

            Transitions = new List <Transition <TestClass> >();

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 0 && obj.Word == "aaa",
                                                       o => { }, o => { obj.Number = 1; obj.Word = "bbb"; }, ExecutionMode.Synch, Transitions.Count()));

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 1 && obj.Word == "bbb",
                                                       o => { }, o => { obj.Number = 2; obj.Word = "ccc"; }, ExecutionMode.Synch, Transitions.Count()));

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 2 && obj.Word == "ccc",
                                                       o => { }, o => { obj.Number = 0; obj.Word = "aaa"; }, ExecutionMode.Synch, Transitions.Count()));

            //del = new WorkWhileDelegate(PetriController<TestClass>.WorkWhileCan);

            System.Threading.Thread checkThread = new System.Threading.Thread(() => PetriController <TestClass> .WorkWhileCan(obj, Transitions));

            //var result1 = del.BeginInvoke(obj, Transitions, null, null);

            checkThread.Start();

            System.Threading.Thread.Sleep(1000);


            //Assert.IsFalse(result1.IsCompleted);
            Assert.IsTrue(checkThread.IsAlive);
            checkThread.Abort();



            //check for do delay
            obj        = new TestClass();
            obj.Number = 0;
            obj.Word   = "aaa";

            Transitions = new List <Transition <TestClass> >();

            int i = 0;

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 0 && obj.Word == "aaa",
                                                       o => { },
                                                       o => { obj.Number = 1; obj.Word = "bbb"; }, ExecutionMode.Synch, Transitions.Count(), 100));

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 1 && obj.Word == "bbb",
                                                       o => { },
                                                       o => { obj.Number = 2; obj.Word = "ccc"; }, ExecutionMode.Synch, Transitions.Count(), 100));

            Transitions.Add(new Transition <TestClass>(o => true, o => obj.Number == 2 && obj.Word == "ccc",
                                                       o => { },
                                                       o => { obj.Number = 0; obj.Word = "aaa"; i++; }, ExecutionMode.Synch, Transitions.Count(), 100));

            del = new WorkWhileDelegate(PetriController <TestClass> .WorkWhileCan); //won't cycling


            var result2 = del.BeginInvoke(obj, Transitions, null, null);

            System.Threading.Thread.Sleep(500);

            Assert.IsTrue(result2.IsCompleted);
            Assert.AreEqual(1, i);

            DateTime start = DateTime.Now;

            result2 = del.BeginInvoke(obj, Transitions, null, null); //will get immediately, because timer not elapsed

            del.EndInvoke(result2);

            DateTime finish = DateTime.Now;

            Assert.IsTrue(result2.IsCompleted);
            Assert.IsTrue((finish - start).TotalMilliseconds < 100);

            Assert.AreEqual(1, i); //"i" won't have changed
        }
示例#5
0
        static void Main(string[] args)
        {
            IEnumerable<MyClass> Objects = ParallelEnumerable.Repeat<MyClass>(new MyClass(), 2);

            PetriController<MyClass> pn = new PetriController<MyClass>();

            pn.SetReset(o => { o.Number = 0; o.Word = "aaa"; });

            pn.SetObjects(Objects.ToList());

            pn.AddTransition(o => true, o => o.Number == 0 && o.Word == "aaa", o => { }, o => { o.Number = 1; o.Word = "bbb"; }, ExecutionMode.Synch, 0);
            pn.AddTransition(o => true, o => o.Number == 1 && o.Word == "bbb", o => { }, o => { o.Number = 2; o.Word = "ccc"; }, ExecutionMode.Synch, 0);
            pn.AddGeneralTransition(o => true, o => o.Number == 2 && o.Word == "ccc", o => { }, o => { o.Number = 3; o.Word = "ddd"; }, ExecutionMode.Synch, 0);

            pn.Run();
        }