예제 #1
0
        public void CleanupDoneInlineWithoutArbiter()
        {
            Port<int> pa = new Port<int> ();
            Port<string> pb = new Port<string> ();

            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { pa, pb };
            int count = 1;
            Handler<ICollection[]> handler = (cols) => { };
            var mig = new MultipleItemGather (types, ports, count, handler);
            var dq = new SerialDispatchQueue ();
            dq.exec = false;
            mig.TaskQueue = dq;

            mig.Execute ();

            var rec = ports [0].GetReceivers () [0];
            var rec2 = ports [0].GetReceivers () [1];
            ITask task = null;
            Assert.IsTrue (rec.Evaluate (new PortElement<int> (10), ref task), "#1");
            Assert.IsNotNull (task, "#2");
            Assert.AreEqual (ReceiverTaskState.CleanedUp, mig.State, "#3");
            Assert.AreEqual (ReceiverTaskState.Persistent, rec.State, "#4");
            Assert.AreEqual (ReceiverTaskState.Persistent, rec2.State, "#5");
            Assert.AreEqual (0, dq.count, "#6");
        }
예제 #2
0
파일: ArbiterTest.cs 프로젝트: kumpera/Ccr
        public void Activate()
        {
            int exec = 0;
            var task = new Task (() =>{ ++exec; });
            DispatcherQueue dq = new SerialDispatchQueue ();

            Assert.IsNull (task.TaskQueue, "#1");
            Arbiter.Activate (dq, task);
            Assert.AreEqual (1, exec, "#4");
            Arbiter.Activate (dq, task, task, task);
            Assert.AreEqual (4, exec, "#5");
        }
예제 #3
0
파일: ArbiterTest.cs 프로젝트: kumpera/Ccr
        public void ActivateBadArgs()
        {
            var task = new Task (() =>{ });
            DispatcherQueue dq = new SerialDispatchQueue ();
            try {
                Arbiter.Activate (null, task);
                Assert.Fail ("#1");
            } catch (ArgumentNullException) {}

            try {
                Arbiter.Activate (dq, null);
                Assert.Fail ("#2");
            } catch (ArgumentNullException) {}
        }
예제 #4
0
        public void CleanupTask()
        {
            IPortReceive pa = new Port <int> ();
            IPortReceive pb = new Port <string> ();
            ITask task = new Task<int, string> ((i, s) => { });
            var mr = new MultipleItemReceiver (task, pa, pb);
            var dq = new SerialDispatchQueue ();
            mr.TaskQueue = dq;

            mr.Execute ();
            ((Port<int>)pa).Post (10);
            Assert.AreEqual (0, pa.ItemCount, "#1");
            mr.Cleanup (task);

            Assert.AreEqual (1, pa.ItemCount, "#2");
            Assert.AreEqual (0, pb.ItemCount, "#3");
        }
예제 #5
0
        public void Execute2()
        {
            int cnt = 0;
            IPortReceive pa = new Port <int> ();
            IPortReceive pb = new Port <string> ();
            ITask task = new Task<int, string> ( (i, s) => { cnt += i + s.Length; });
            var mr = new MultipleItemReceiver (task, pa, pb);
            var dq = new SerialDispatchQueue ();
            mr.TaskQueue = dq;

            mr.Execute ();

            var a = (Port<int>)pa;
            var b = (Port<string>)pb;

            a.Post (10);
            Assert.AreEqual (0, pa.ItemCount, "#1");
            Assert.AreEqual (0, cnt, "#2");

            b.Post ("hello");
            Assert.AreEqual (15, cnt, "#3");

            //it's a one time thing
            Assert.AreEqual (0, pa.GetReceivers ().Length, "#4");
            Assert.AreEqual (0, pb.GetReceivers ().Length, "#5");

            a.Post (1);
            Assert.AreEqual (15, cnt, "#6");
            b.Post ("x");
            Assert.AreEqual (15, cnt, "#7");
        }
예제 #6
0
        public void ExecutePersistent()
        {
            int cnt = 0;
            IPortReceive pa = new Port <int> ();
            IPortReceive pb = new Port <string> ();
            var mr = new MultipleItemReceiver (Arbiter.FromHandler (() => { ++cnt; }), pa, pb);
            var dq = new SerialDispatchQueue ();
            mr.TaskQueue = dq;
            mr.State = ReceiverTaskState.Persistent;

            Assert.AreEqual (0, pa.GetReceivers ().Length, "#1");
            Assert.AreEqual (0, pb.GetReceivers ().Length, "#2");

            mr.Execute ();

            Assert.AreEqual (1, pa.GetReceivers ().Length, "#3");
            Assert.AreEqual (1, pb.GetReceivers ().Length, "#4");

            Assert.AreEqual (ReceiverTaskState.Onetime, pa.GetReceivers ()[0].State, "#5");
        }
예제 #7
0
파일: ArbiterTest.cs 프로젝트: kumpera/Ccr
        public void ReceiveFromPortSetUnderSharedMode()
        {
            var ps = new PortSet (typeof (int), typeof(string));
            var dq = new SerialDispatchQueue ();
            ps.Mode = PortSetMode.SharedPort;

            try {
                Arbiter.ReceiveFromPortSet (true, ps, (int a)=> { });
                Assert.Fail ("#1");
            } catch (InvalidOperationException) {}
        }
예제 #8
0
파일: ArbiterTest.cs 프로젝트: kumpera/Ccr
        public void ReceiveFromPortSet()
        {
            var ps = new PortSet (typeof (int), typeof(string));
            var dq = new SerialDispatchQueue ();
            int cnt = 1;
            var task = Arbiter.ReceiveFromPortSet (true, ps, (int a)=> { cnt += a; });
            task.TaskQueue = dq;
            task.Execute ();
            Assert.AreEqual (1, ((IPortReceive)ps [typeof (int)]).GetReceivers().Length, "#1");

            ps [typeof (int)].PostUnknownType (10);
            Assert.AreEqual (11, cnt, "#2");
        }
예제 #9
0
파일: ChoiceTest.cs 프로젝트: kumpera/Ccr
        public void ExecutePart2()
        {
            int count = 3;
            var pa = new Port<int> ();
            var pb = new Port<string> ();

            var ra = Arbiter.Receive (false, pa, (i) => count += i);
            var rb = new NakedReceiver (pb, new Task<string>((s) => count += s.Length));
            var dq = new SerialDispatchQueue ();

            var c = new Choice (ra, rb);
            c.TaskQueue = dq;

            IPortReceive pra = pa;
            IPortReceive prb = pb;

            c.Execute ();
            pa.Post (10);

            Assert.AreEqual (ArbiterTaskState.Done, c.ArbiterState, "#1");
            Assert.AreEqual (0, c.PortElementCount, "#2");
            Assert.AreEqual (0, pra.GetReceivers ().Length, "#3");
            Assert.AreEqual (0, prb.GetReceivers ().Length, "#4");
            Assert.AreEqual (c, ra.Arbiter, "#5");
            Assert.AreEqual (c, rb.Arbiter, "#6");
            Assert.IsNull (ra.ArbiterContext, "#7");
            Assert.IsNull (rb.ArbiterContext, "#8");
            Assert.IsNull (ra.ArbiterCleanupHandler, "#9");
            Assert.IsNull (rb.ArbiterCleanupHandler, "#10");
            Assert.AreEqual (0, rb.execute, "#11");
            Assert.AreEqual (1, rb.set_arbiter, "#12");
            Assert.AreEqual (1, rb.cleanup, "#13");
            Assert.AreEqual (0, rb.cleanup_task, "#14");
            Assert.AreEqual (ReceiverTaskState.CleanedUp, ra.State, "#15");
            Assert.AreEqual (ReceiverTaskState.CleanedUp, rb.State, "#16");

            Assert.AreEqual (13, count, "#17");
        }
예제 #10
0
파일: ChoiceTest.cs 프로젝트: kumpera/Ccr
        public void EvalateOnLooserReturnsNullTask()
        {
            int winner = 0;
            var pa = new Port<int> ();
            var pb = new Port<string> ();

            var ra = Arbiter.Receive (false, pa, (i) => { winner = 1; });
            var rb = Arbiter.Receive (false, pb, (s) => { winner = 2; });
            var dq = new SerialDispatchQueue ();

            var c = new Choice (ra, rb);
            c.TaskQueue = dq;

            IPortReceive pra = pa;
            IPortReceive prb = pb;

            c.Execute ();

            pa.Post (10);

            ITask tk = null;
            Assert.IsFalse (rb.Evaluate (new PortElement<string> (""), ref tk), "#1");
            Assert.IsNull (tk, "#2");
        }
예제 #11
0
        public void CleanupTask()
        {
            Port<int> pa = new Port<int> ();
            Port<string> pb = new Port<string> ();

            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { pa, pb };
            int count = 2;
            Handler<ICollection[]> handler = (cols) => { };
            var mig = new MultipleItemGather (types, ports, count, handler);
            var dq = new SerialDispatchQueue ();
            mig.TaskQueue = dq;

            mig.Execute ();

            ITask task = null;
            var rec = ports [0].GetReceivers () [0];
            Assert.IsTrue (rec.Evaluate (new PortElement<int> (10), ref task), "#1");
            Assert.IsNull (task, "#2");
            Assert.IsTrue (rec.Evaluate (new PortElement<int> (20), ref task), "#3");
            Assert.IsNotNull (task, "#4");

            mig.Cleanup (task);

            Assert.AreEqual (2, pa.ItemCount, "#4");
            Assert.AreEqual (0, pb.ItemCount, "#5");

            Assert.AreEqual (10, pa.Test (), "#6");
            Assert.AreEqual (20, pa.Test (), "#7");
        }
예제 #12
0
        public void WhatResultDataHas2()
        {
            Port<int> pa = new Port<int> ();
            Port<string> pb = new Port<string> ();
            ICollection[] res = null;

            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { pa, pb };
            int count = 2;
            Handler<ICollection[]> handler = (cols) => res = cols;;
            var mig = new MultipleItemGather (types, ports, count, handler);
            var dq = new SerialDispatchQueue ();
            mig.TaskQueue = dq;

            mig.Execute ();

            pa.Post (10); //result is post order independent
            pb.Post ("hw");

            Assert.IsTrue (res [0] is List<object>, "#1");
            Assert.IsTrue (res [1] is List<object>, "#2");
            var la = res [0] as List<object>;
            var lb = res [1] as List<object>;

            Assert.AreEqual (10, la [0], "#3");
            Assert.AreEqual ("hw", lb [0], "#4");
        }
예제 #13
0
        public void Execute3()
        {
            int cnt = 0;
            IPortReceive pa = new Port <int> ();
            IPortReceive pb = new Port <string> ();
            ITask task = new Task<int, string> ( (i, s) => { cnt += i + s.Length; });
            var mr = new MultipleItemReceiver (task, pa, pb);
            var dq = new SerialDispatchQueue ();
            mr.TaskQueue = dq;

            mr.Execute ();

            var a = (Port<int>)pa;
            var b = (Port<string>)pb;

            b.Post ("hello");
            Assert.AreEqual (0, cnt, "#1");
            a.Post (10);

            Assert.AreEqual (15, cnt, "#2");
        }
예제 #14
0
        public void PostToPortsAfterExecute6()
        {
            Port<int> pa = new Port<int> ();
            Port<string> pb = new Port<string> ();
            int resA = 0;
            int resB = 0;

            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { pa, pb };
            int count = 2;
            Handler<ICollection[]> handler = (cols) => { resA += cols[0].Count ; resB += cols[1].Count; };
            var mig = new MultipleItemGather (types, ports, count, handler);
            var dq = new SerialDispatchQueue ();
            mig.TaskQueue = dq;

            mig.Execute ();

            pb.Post ("hw");
            pa.Post (10);

            Assert.AreEqual (1, resA, "#1");
            Assert.AreEqual (1, resB, "#2");
            Assert.AreEqual (1, dq.count, "#3");
            Assert.AreEqual (ReceiverTaskState.CleanedUp, mig.State, "#4");
        }
예제 #15
0
        public void ExecuteWithArbiter2()
        {
            Port<int> pa = new Port<int> ();
            Port<string> pb = new Port<string> ();

            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { pa, pb };
            int count = 1;
            Handler<ICollection[]> handler = (cols) => { };
            var mig = new MultipleItemGather (types, ports, count, handler);

            var arbiter = new NakedArbiter (false);
            var dq = new SerialDispatchQueue ();
            arbiter.TaskQueue = dq;
            mig.Arbiter = arbiter;

            var rec = ports [0].GetReceivers () [0];
            ITask task = null;
            Assert.IsFalse (rec.Evaluate (new PortElement<int> (10), ref task), "#1");
            Assert.AreEqual (1, arbiter.calls, "#2");
            Assert.IsNotNull (task, "#3");
            Assert.AreEqual (ReceiverTaskState.Onetime, mig.State, "#4");
            Assert.AreEqual (ReceiverTaskState.Persistent, rec.State, "#5");
        }
예제 #16
0
        public void ExecuteWithArbiter1()
        {
            Port<int> pa = new Port<int> ();
            Port<string> pb = new Port<string> ();
            bool handler_called = false;

            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { pa, pb };
            int count = 2;
            Handler<ICollection[]> handler = (cols) => { handler_called = true; };
            var mig = new MultipleItemGather (types, ports, count, handler);

            var arbiter = new NakedArbiter (false);
            var dq = new SerialDispatchQueue ();
            arbiter.TaskQueue = dq;
            mig.Arbiter = arbiter;

            Assert.AreEqual (1, ports [0].GetReceivers ().Length, "#1");
            Assert.AreEqual (1, ports [1].GetReceivers ().Length, "#2");

            pa.Post (10);

            Assert.AreEqual (1, ports [0].GetReceivers ().Length, "#4");
            Assert.AreEqual (1, ports [1].GetReceivers ().Length, "#3");

            Assert.AreEqual (0, dq.count, "#4");
            Assert.AreEqual (0, arbiter.calls, "#5");
            Assert.AreEqual (ReceiverTaskState.Onetime, mig.State, "#6");
            Assert.IsFalse (handler_called, "#13");
            pa.Post (10);

            Assert.AreEqual (1, ports [0].GetReceivers ().Length, "#7");
            Assert.AreEqual (1, ports [1].GetReceivers ().Length, "#8");

            Assert.AreEqual (1, dq.count, "#9");
            Assert.AreEqual (1, arbiter.calls, "#10");
            Assert.AreEqual (ReceiverTaskState.Onetime, mig.State, "#11");
            Assert.IsTrue (handler_called, "#14");
        }
예제 #17
0
        public void Execute2()
        {
            Type[] types = new Type[] { typeof (int), typeof (string) };
            IPortReceive[] ports = new IPortReceive[] { new Port<int>(), new Port<string> () };
            int count = 2;
            Handler<ICollection[]> handler = (cols) => {};
            var mig = new MultipleItemGather (types, ports, count, handler);
            var dq = new SerialDispatchQueue ();
            mig.TaskQueue = dq;

            Assert.AreEqual (0, ports [0].GetReceivers ().Length, "#1");
            Assert.AreEqual (0, ports [1].GetReceivers ().Length, "#2");

            mig.Execute ();

            Assert.AreEqual (2, ports [0].GetReceivers ().Length, "#3");
            Assert.AreEqual (2, ports [1].GetReceivers ().Length, "#4");

            Assert.AreEqual (ReceiverTaskState.Persistent, ports [0].GetReceivers ()[0].State, "#5");
            Assert.AreEqual (ReceiverTaskState.Persistent, ports [0].GetReceivers ()[1].State, "#6");
            Assert.AreEqual (ReceiverTaskState.Persistent, ports [1].GetReceivers ()[0].State, "#7");
            Assert.AreEqual (ReceiverTaskState.Persistent, ports [1].GetReceivers ()[1].State, "#8");

            Assert.AreEqual (0, dq.count, "#9");
        }
예제 #18
0
        public void PostToPortSetUserTaskItem()
        {
            IPortReceive pa = new Port <int> ();
            IPortReceive pb = new Port <string> ();
            ITask task = new Task<int, string> ((i, s) => { });
            var mr = new MultipleItemReceiver (task, pa, pb);
            var dq = new SerialDispatchQueue ();
            mr.TaskQueue = dq;

            mr.Execute ();
            ((Port<int>)pa).Post (10);

            Assert.AreEqual (10, task [0].Item, "#1");
        }