Add ContinuationsTest for Mono.Tasklets
authorKelly Washington <kelly@lindenlab.com>
Thu, 7 Jul 2016 22:22:03 +0000 (22:22 +0000)
committerKelly Washington <kelly@lindenlab.com>
Thu, 7 Jul 2016 22:39:03 +0000 (22:39 +0000)
mcs/class/Mono.Tasklets/Makefile
mcs/class/Mono.Tasklets/Mono.Tasklets_test.dll.sources [new file with mode: 0644]
mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs [new file with mode: 0644]

index 8883dbaf8343d4c196eb782c96fa149ca149e50c..19a6cc1ceedadb434d7cdd26a96c0d514a12ce48 100644 (file)
@@ -3,7 +3,9 @@ SUBDIRS =
 include ../../build/rules.make
 
 LIBRARY = Mono.Tasklets.dll
-NO_TEST = yes
+
+LIB_MCS_FLAGS =
+TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)
 
 include ../../build/library.make
 
diff --git a/mcs/class/Mono.Tasklets/Mono.Tasklets_test.dll.sources b/mcs/class/Mono.Tasklets/Mono.Tasklets_test.dll.sources
new file mode 100644 (file)
index 0000000..f994ee3
--- /dev/null
@@ -0,0 +1 @@
+Mono.Tasklets/ContinuationsTest.cs
diff --git a/mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs b/mcs/class/Mono.Tasklets/Test/Mono.Tasklets/ContinuationsTest.cs
new file mode 100644 (file)
index 0000000..5f75664
--- /dev/null
@@ -0,0 +1,83 @@
+using NUnit.Framework;
+
+using System;
+using Mono.Tasklets;
+
+namespace MonoTests.System
+{
+    [TestFixture]
+       public class ContinuationsTest {
+
+               private Continuation _contA = new Continuation();
+
+               private int total = 0;
+
+               [Test]
+               public void TestContinuationsLoop() {
+                       _contA.Mark();
+                       int value = 0;
+                       int ret = _contA.Store(0);
+                       for(int i = ret; i < 10; i++) {
+                               value += i;
+                       }
+
+                       if(value > 0) {
+                               total += value;
+                               _contA.Restore(ret + 1);
+                       }
+
+                       Assert.AreEqual(total,330);
+               }
+
+               [Test]
+               public void Yielding() {
+                       Continuation baseCont = new Continuation();
+                       Continuation taskCont = new Continuation();
+                       int yields = 0;
+                       baseCont.Mark();
+                       taskCont.Mark();
+                       
+                       // Store the base continuation to start the task
+                       if (baseCont.Store(0) == 0) {
+                               bool done = false;
+                               int count = 0;
+
+                               while (!done) {
+                                       // Do stuff for the task.
+                                       ++count;
+                                       
+                                       // This task is counting to 100.
+                                       if (count == 100) {
+                                               done = true;
+                                       }
+
+                                       // Yield every 10 loops
+                                       else if (count % 10 == 0) {
+
+                                               // To yield, store the task continuation then restore
+                                               // the base continuation.
+                                               if (taskCont.Store(0) == 0) {
+                                                       baseCont.Restore(1);
+                                               }
+                                       }
+                               }
+                       }
+                       // When restored, 'Store' will return what was passed to Restore, in this case 1 so fall here.
+                       else {
+                               // Count the yields, then go back to the task.
+                               ++yields;
+                               taskCont.Restore(1);
+                       }
+
+                       Assert.AreEqual(yields,9);
+               }
+                       
+               
+       }
+}
+// vim: noexpandtab
+// Local Variables:
+// tab-width: 4
+// c-basic-offset: 4
+// indent-tabs-mode: t
+// End: