1 using NUnit.Framework;
6 namespace MonoTests.System
9 public class ContinuationsTest {
11 private Continuation _contA = new Continuation();
13 private int total = 0;
16 public void TestContinuationsLoop() {
19 int ret = _contA.Store(0);
20 for(int i = ret; i < 10; i++) {
26 _contA.Restore(ret + 1);
29 Assert.AreEqual(total,330);
32 private int yields = 0;
35 public void Yielding() {
36 Continuation baseCont = new Continuation();
37 Continuation taskCont = new Continuation();
42 // Store the base continuation to start the task
43 if (baseCont.Store(0) == 0) {
48 // Do stuff for the task.
51 // This task is counting to 100.
56 // Yield every 10 loops
57 else if (count % 10 == 0) {
59 // To yield, store the task continuation then restore
60 // the base continuation.
61 if (taskCont.Store(0) == 0) {
67 // When restored, 'Store' will return what was passed to Restore, in this case 1 so fall here.
69 // Count the yields, then go back to the task.
74 Assert.AreEqual(9, yields);
78 public class MicroThread {
81 if (MyThread.Store(0) == 0) {
82 MainThread.Restore(1);
86 public void Resume() {
87 if (MainThread.Store(0) == 0) {
92 public void DoWork(Action action) {
93 if (MainThread.Store(0) == 0) {
96 MainThread.Restore(1);
100 public bool Done = false;
101 public Continuation MainThread = new Continuation();
102 public Continuation MyThread = new Continuation();
105 public class MicroBJob {
106 private int _Count = 0;
108 get { return _Count; }
109 set { _Count = value;}
112 public MicroThread MicroThread;
114 while (Count < 100) {
116 if (Count % 10 == 0) {
124 public void MicroThreadTest() {
125 MicroThread microA = new MicroThread();
126 MicroThread microB = new MicroThread();
128 microA.MainThread.Mark();
129 microA.MyThread.Mark();
130 microB.MainThread.Mark();
131 microB.MyThread.Mark();
133 Assert.AreEqual(false,microA.Done);
134 Assert.AreEqual(false,microB.Done);
136 microA.DoWork( () => {
138 while (count < 100) {
140 if (count % 10 == 0) {
146 MicroBJob jobB = new MicroBJob();
147 jobB.MicroThread = microB;
149 microB.DoWork(jobB.Work);
151 Assert.AreEqual(false,microA.Done);
152 Assert.AreEqual(false,microB.Done);
155 while (yields < 20) {
156 if (!microA.Done) microA.Resume();
157 if (!microB.Done) microB.Resume();
158 if (microA.Done && microB.Done) break;
162 Assert.AreEqual(true,microA.Done);
163 Assert.AreEqual(true,microB.Done);
164 Assert.AreEqual(100,jobB.Count);
165 Assert.AreEqual(9,yields);
174 // indent-tabs-mode: t