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(); }
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")); }
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")); }
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 }
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(); }