Przeglądaj źródła

ncd: Add Do tests.

Ambroz Bizjak 11 lat temu
rodzic
commit
3dab8c024b
1 zmienionych plików z 186 dodań i 0 usunięć
  1. 186 0
      ncd/tests/do.ncd

+ 186 - 0
ncd/tests/do.ncd

@@ -0,0 +1,186 @@
+process main {
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        Do {
+            blk1->up();
+            blk2->rdownup();
+        } do;
+        assert(blk1);
+        assert(blk2);
+        assert(do.succeeded);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        Do {
+            blk1->rdownup();
+            _do->break();
+            blk2->up();
+        } do;
+        assert(blk1);
+        assert_false(blk2);
+        assert_false(do.succeeded);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->go();
+                blk2->up();
+            };
+        };
+        assert(blk1);
+        assert_false(blk2);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->rgo();
+            };
+        };
+        assert(blk1);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        blocker() blk3;
+        Do {
+            blk1->up();
+            blk2->rdownup();
+        } Interrupt {
+            blk3->up();
+        } do;
+        assert(blk1);
+        assert(blk2);
+        assert_false(blk3);
+        assert(do.succeeded);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->rgo();
+            } Interrupt {
+                blk2->up();
+            };
+        };
+        assert(blk1);
+        assert_false(blk2);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        blocker() blk3;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->go();
+                blk2->up();
+            } Interrupt {
+                blk3->rdownup();
+                _do->break();
+                assert(@false);
+            };
+        };
+        assert(blk1);
+        assert_false(blk2);
+        assert(blk3);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->go();
+                assert(blk2);
+            } Interrupt {
+                blk2->rdownup();
+            };
+        };
+        assert(blk1);
+        assert(blk2);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->go();
+                imperative("<none>", {}, @helper1, {}, "1000");
+                assert_false(blk2);
+            } Interrupt {
+                blk2->rdownup();
+                if(@false);
+            };
+        };
+        assert(blk1);
+        assert(blk2);
+    };
+    
+    If (@true) {
+        blocker() blk1;
+        blocker() blk2;
+        var(@true) flag;
+        backtrack_point() point;
+        If (flag) {
+            Do {
+                blk1->rdownup();
+                flag->set(@false);
+                point->go();
+                imperative("<none>", {}, @helper2, {}, "1000");
+                sleep("0", "1");
+                assert_false(blk2);
+            } Interrupt {
+                blk2->rdownup();
+                if(@false);
+            };
+        };
+        assert(blk1);
+        assert(blk2);
+    };
+    
+    exit("0");
+}
+
+template helper1 {
+    assert_false(_caller.blk2);
+}
+
+template helper2 {
+    assert(_caller.blk2);
+}