aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass/arith-0.rs5
-rw-r--r--src/test/run-pass/arith-1.rs22
-rw-r--r--src/test/run-pass/arith-2.rs5
-rw-r--r--src/test/run-pass/basic-1.rs25
-rw-r--r--src/test/run-pass/basic-2.rs26
-rw-r--r--src/test/run-pass/destructor-ordering.rs117
-rw-r--r--src/test/run-pass/int-lib.rs15
-rw-r--r--src/test/run-pass/integral-indexing.rs22
-rw-r--r--src/test/run-pass/lib-map.rs6
-rw-r--r--src/test/run-pass/str-lib.rs16
-rw-r--r--src/test/run-pass/task-comm-0.rs2
-rw-r--r--src/test/run-pass/task-comm-2.rs8
-rw-r--r--src/test/run-pass/task-comm-3.rs19
-rw-r--r--src/test/run-pass/task-comm-6.rs6
-rw-r--r--src/test/run-pass/task-comm.rs18
15 files changed, 248 insertions, 64 deletions
diff --git a/src/test/run-pass/arith-0.rs b/src/test/run-pass/arith-0.rs
new file mode 100644
index 00000000..7587b005
--- /dev/null
+++ b/src/test/run-pass/arith-0.rs
@@ -0,0 +1,5 @@
+fn main() -> () {
+ let int a = 10;
+ log a;
+ check (a * (a - 1) == 90);
+} \ No newline at end of file
diff --git a/src/test/run-pass/arith-1.rs b/src/test/run-pass/arith-1.rs
new file mode 100644
index 00000000..bac6a055
--- /dev/null
+++ b/src/test/run-pass/arith-1.rs
@@ -0,0 +1,22 @@
+fn main() -> () {
+ let int i32_a = 10;
+ check(i32_a == 10);
+ check(i32_a - 10 == 0);
+ check(i32_a / 10 == 1);
+ check(i32_a - 20 == -10);
+ check(i32_a << 10 == 10240);
+ check(i32_a << 16 == 655360);
+ check(i32_a * 16 == 160);
+ check(i32_a * i32_a * i32_a == 1000);
+ check(i32_a * i32_a * i32_a * i32_a == 10000);
+ check(((i32_a * i32_a) / i32_a) * i32_a == 100);
+ check(i32_a * (i32_a - 1) << 2 + i32_a == 368640);
+
+ let int i32_b = 0x10101010;
+ check(i32_b + 1 - 1 == i32_b);
+ check(i32_b << 1 == i32_b << 1);
+ check(i32_b >> 1 == i32_b >> 1);
+ check((i32_b & (i32_b << 1)) == 0);
+ log ((i32_b | (i32_b << 1)));
+ check((i32_b | (i32_b << 1)) == 0x30303030);
+} \ No newline at end of file
diff --git a/src/test/run-pass/arith-2.rs b/src/test/run-pass/arith-2.rs
new file mode 100644
index 00000000..33a740c8
--- /dev/null
+++ b/src/test/run-pass/arith-2.rs
@@ -0,0 +1,5 @@
+fn main() -> () {
+ let int i32_c = 0x10101010;
+ check (i32_c + i32_c * 2 / 3 * 2 + (i32_c - 7 % 3) ==
+ i32_c + (((i32_c * 2) / 3) * 2) + (i32_c - (7 % 3)));
+} \ No newline at end of file
diff --git a/src/test/run-pass/basic-1.rs b/src/test/run-pass/basic-1.rs
new file mode 100644
index 00000000..bdd7ee25
--- /dev/null
+++ b/src/test/run-pass/basic-1.rs
@@ -0,0 +1,25 @@
+// -*- rust -*-
+
+io fn a(chan[int] c) {
+ c <| 10;
+}
+
+io fn main() {
+ let port[int] p = port();
+ spawn a(chan(p));
+ spawn b(chan(p));
+ let int n = 0;
+ n <- p;
+ n <- p;
+// log "Finished.";
+}
+
+io fn b(chan[int] c) {
+// log "task b0";
+// log "task b1";
+// log "task b2";
+// log "task b3";
+// log "task b4";
+// log "task b5";
+ c <| 10;
+} \ No newline at end of file
diff --git a/src/test/run-pass/basic-2.rs b/src/test/run-pass/basic-2.rs
new file mode 100644
index 00000000..975a0d4b
--- /dev/null
+++ b/src/test/run-pass/basic-2.rs
@@ -0,0 +1,26 @@
+// -*- rust -*-
+
+io fn a(chan[int] c) {
+ log "task a0";
+ log "task a1";
+ c <| 10;
+}
+
+io fn main() {
+ let port[int] p = port();
+ spawn a(chan(p));
+ spawn b(chan(p));
+ let int n = 0;
+ n <- p;
+ n <- p;
+ log "Finished.";
+}
+
+io fn b(chan[int] c) {
+ log "task b0";
+ log "task b1";
+ log "task b2";
+ log "task b2";
+ log "task b3";
+ c <| 10;
+}
diff --git a/src/test/run-pass/destructor-ordering.rs b/src/test/run-pass/destructor-ordering.rs
index 99479c55..f7f5b8c8 100644
--- a/src/test/run-pass/destructor-ordering.rs
+++ b/src/test/run-pass/destructor-ordering.rs
@@ -1,58 +1,93 @@
-// We share an instance of this type among all the destructor-order
-// checkers. It tracks how many destructors have run so far and
-// 'fail's when one runs out of order.
-// FIXME: Make it easier to collect a failure message.
-state obj order_tracker(mutable int init) {
- fn assert_order(int expected, str fail_message) {
- if (expected != init) {
- log expected;
+// This test checks that destructors run in the right order. Because
+// stateful objects can't have destructors, we have the destructors
+// record their expected order into a channel when they execute (so
+// the object becomes 'io' rather than 'state'). Then each test case
+// asserts that the channel produces values in ascending order.
+//
+// FIXME: Write an int->str function and concatenate the whole failure
+// message into a single log statement (or, even better, a print).
+//
+// FIXME: check_order should take only 1 line in a test, not 2+a block
+// block. Since destructor-having objects can't refer to mutable state
+// (like the port), we'd need a with-like construct to do the same for
+// stateful objects within a scope.
+//
+// FIXME #21: Each test should execute in its own task, so it can fail
+// independently, writing its error message to a channel that the
+// parent task aggregates.
+
+type order_info = rec(int order, str msg);
+
+io fn check_order(port[order_info] expected_p) {
+ chan(expected_p) <| rec(order=-1, msg="");
+ let mutable int actual = 0;
+ auto expected <- expected_p; // FIXME #121: Workaround for while(true) bug.
+ auto done = -1; // FIXME: Workaround for typechecking bug.
+ while(expected.order != done) {
+ if (expected.order != actual) {
+ log expected.order;
log " != ";
- log init;
- log fail_message;
+ log actual;
+ log expected.msg;
fail;
}
- init += 1;
+ actual += 1;
+ expected <- expected_p;
}
}
-obj dorder(@order_tracker tracker, int order, str message) {
+obj dorder(chan[order_info] expected, int order, str message) {
drop {
- tracker.assert_order(order, message);
+ expected <| rec(order=order, msg=message);
}
}
-fn test_simple() {
- auto tracker = @order_tracker(0);
+io fn test_simple() {
+ let port[order_info] tracker_p = port();
+ auto tracker = chan(tracker_p);
dorder(tracker, 1, "Reverse decl order");
dorder(tracker, 0, "Reverse decl order");
+ check_order(tracker_p);
}
-fn test_block() {
- auto tracker = @order_tracker(0);
- dorder(tracker, 2, "Before block");
+io fn test_block() {
+ let port[order_info] tracker_p = port();
+ auto tracker = chan(tracker_p);
{
- dorder(tracker, 0, "Inside block");
+ dorder(tracker, 2, "Before block");
+ {
+ dorder(tracker, 0, "Inside block");
+ }
+ dorder(tracker, 1, "After block");
}
- dorder(tracker, 1, "After block");
+ check_order(tracker_p);
}
-fn test_decl_v_init() {
- auto tracker = @order_tracker(0);
- auto var1;
- auto var2;
- var2 = dorder(tracker, 0, "decl, not init");
- var1 = dorder(tracker, 1, "decl, not init");
+io fn test_decl_v_init() {
+ let port[order_info] tracker_p = port();
+ auto tracker = chan(tracker_p);
+ {
+ auto var1;
+ auto var2;
+ var2 = dorder(tracker, 0, "decl, not init");
+ var1 = dorder(tracker, 1, "decl, not init");
+ }
+ check_order(tracker_p);
}
-fn test_overwritten_obj() {
- auto tracker = @order_tracker(0);
- auto var1 = dorder(tracker, 0, "overwritten object destroyed first");
- auto var2 = dorder(tracker, 2, "destroyed at end of scope");
- var1 = dorder(tracker, 3, "overwriter deleted in rev decl order");
+io fn test_overwritten_obj() {
+ let port[order_info] tracker_p = port();
+ auto tracker = chan(tracker_p);
{
- dorder(tracker, 1, "overwritten object destroyed before end of scope");
+ auto var1 = dorder(tracker, 0, "overwritten object destroyed first");
+ auto var2 = dorder(tracker, 2, "destroyed at end of scope");
+ var1 = dorder(tracker, 3, "overwriter deleted in rev decl order");
+ {
+ dorder(tracker, 1, "overwritten object destroyed before end of scope");
+ }
}
+ check_order(tracker_p);
}
// Used to embed dorder objects into an expression. Note that the
@@ -60,17 +95,21 @@ fn test_overwritten_obj() {
fn combine_dorders(dorder d1, dorder d2) -> int {
ret 1;
}
-fn test_expression_destroyed_right_to_left() {
- auto tracker = @order_tracker(0);
- combine_dorders(dorder(tracker, 4, ""), dorder(tracker, 3, ""))
- / combine_dorders(dorder(tracker, 2, ""), dorder(tracker, 1, ""));
+io fn test_expression_destroyed_right_to_left() {
+ let port[order_info] tracker_p = port();
+ auto tracker = chan(tracker_p);
{
- dorder(tracker, 0,
- "expression objects live to end of block, not statement");
+ combine_dorders(dorder(tracker, 4, ""), dorder(tracker, 3, ""))
+ / combine_dorders(dorder(tracker, 2, ""), dorder(tracker, 1, ""));
+ {
+ dorder(tracker, 0,
+ "expression objects live to end of block, not statement");
+ }
}
+ check_order(tracker_p);
}
-fn main() {
+io fn main() {
test_simple();
test_block();
test_decl_v_init();
diff --git a/src/test/run-pass/int-lib.rs b/src/test/run-pass/int-lib.rs
new file mode 100644
index 00000000..ce39de43
--- /dev/null
+++ b/src/test/run-pass/int-lib.rs
@@ -0,0 +1,15 @@
+use std;
+
+import std._int;
+
+fn test_to_str() {
+ check (_int.to_str(0, 10u) == "0");
+ check (_int.to_str(1, 10u) == "1");
+ check (_int.to_str(-1, 10u) == "-1");
+ check (_int.to_str(255, 16u) == "ff");
+ check (_int.to_str(-71, 36u) == "-1z");
+}
+
+fn main() {
+ test_to_str();
+}
diff --git a/src/test/run-pass/integral-indexing.rs b/src/test/run-pass/integral-indexing.rs
new file mode 100644
index 00000000..fe7d147c
--- /dev/null
+++ b/src/test/run-pass/integral-indexing.rs
@@ -0,0 +1,22 @@
+// This is a testcase for issue #94.
+
+fn main() {
+
+ let vec[int] v = vec(0, 1, 2, 3, 4, 5);
+ let str s = "abcdef";
+ check (v.(3u) == 3);
+ check (v.(3u8) == 3);
+ check (v.(3i8) == 3);
+ check (v.(3u32) == 3);
+ check (v.(3i32) == 3);
+
+ log v.(3u8);
+
+ check (s.(3u) == 'd' as u8);
+ check (s.(3u8) == 'd' as u8);
+ check (s.(3i8) == 'd' as u8);
+ check (s.(3u32) == 'd' as u8);
+ check (s.(3i32) == 'd' as u8);
+
+ log s.(3u8);
+} \ No newline at end of file
diff --git a/src/test/run-pass/lib-map.rs b/src/test/run-pass/lib-map.rs
index 11101c84..058fb237 100644
--- a/src/test/run-pass/lib-map.rs
+++ b/src/test/run-pass/lib-map.rs
@@ -4,13 +4,17 @@ use std;
import std.map;
fn test_simple() {
+ log "*** starting test_simple";
+
fn eq(&uint x, &uint y) -> bool { ret x == y; }
let map.hashfn[uint] hasher = std.util.id[uint];
let map.eqfn[uint] eqer = eq;
let map.hashmap[uint, uint] hm = map.mk_hashmap[uint, uint](hasher, eqer);
+
+ log "*** finished test_simple";
}
fn main() {
test_simple();
-} \ No newline at end of file
+}
diff --git a/src/test/run-pass/str-lib.rs b/src/test/run-pass/str-lib.rs
new file mode 100644
index 00000000..585f9b8d
--- /dev/null
+++ b/src/test/run-pass/str-lib.rs
@@ -0,0 +1,16 @@
+use std;
+import std._str;
+
+fn test_bytes_len() {
+ check (_str.byte_len("") == 0u);
+ check (_str.byte_len("hello world") == 11u);
+ check (_str.byte_len("\x63") == 1u);
+ check (_str.byte_len("\xa2") == 2u);
+ check (_str.byte_len("\u03c0") == 2u);
+ check (_str.byte_len("\u2620") == 3u);
+ check (_str.byte_len("\U0001d11e") == 4u);
+}
+
+fn main() {
+ test_bytes_len();
+}
diff --git a/src/test/run-pass/task-comm-0.rs b/src/test/run-pass/task-comm-0.rs
index 5992ba5c..28294422 100644
--- a/src/test/run-pass/task-comm-0.rs
+++ b/src/test/run-pass/task-comm-0.rs
@@ -15,5 +15,5 @@ io fn test05() {
let int value <- po;
value <- po;
value <- po;
- log value;
+ check(value == 30);
}
diff --git a/src/test/run-pass/task-comm-2.rs b/src/test/run-pass/task-comm-2.rs
index 9c85da34..864d49de 100644
--- a/src/test/run-pass/task-comm-2.rs
+++ b/src/test/run-pass/task-comm-2.rs
@@ -1,8 +1,8 @@
fn main() -> () {
- log "===== THREADS =====";
+ log "===== SPAWNING and JOINING TASKS =====";
+ test00(false);
+ log "===== SPAWNING and JOINING THREAD TASKS =====";
test00(true);
- log "====== TASKS ======";
- // test00(false);
}
fn start(int task_number) {
@@ -15,7 +15,7 @@ fn start(int task_number) {
}
fn test00(bool create_threads) {
- let int number_of_tasks = 0;
+ let int number_of_tasks = 8;
let int i = 0;
let vec[task] tasks = vec();
diff --git a/src/test/run-pass/task-comm-3.rs b/src/test/run-pass/task-comm-3.rs
index 6dd620cc..9a3f9e16 100644
--- a/src/test/run-pass/task-comm-3.rs
+++ b/src/test/run-pass/task-comm-3.rs
@@ -1,6 +1,8 @@
io fn main() -> () {
- log "===== THREADS =====";
+ log "===== WITHOUT THREADS =====";
test00(false);
+ log "====== WITH THREADS ======";
+ test00(true);
}
io fn test00_start(chan[int] ch, int message, int count) {
@@ -15,8 +17,9 @@ io fn test00_start(chan[int] ch, int message, int count) {
}
io fn test00(bool is_multithreaded) {
- let int number_of_tasks = 1;
- let int number_of_messages = 0;
+ let int number_of_tasks = 16;
+ let int number_of_messages = 4;
+
log "Creating tasks";
let port[int] po = port();
@@ -27,13 +30,13 @@ io fn test00(bool is_multithreaded) {
// Create and spawn tasks...
let vec[task] tasks = vec();
while (i < number_of_tasks) {
- i = i + 1;
if (is_multithreaded) {
tasks += vec(
spawn thread test00_start(ch, i, number_of_messages));
} else {
tasks += vec(spawn test00_start(ch, i, number_of_messages));
}
+ i = i + 1;
}
// Read from spawned tasks...
@@ -53,7 +56,7 @@ io fn test00(bool is_multithreaded) {
}
log "Completed: Final number is: ";
- check (sum + 1 == number_of_messages *
- (number_of_tasks * number_of_tasks + number_of_tasks) / 2);
- log sum;
-} \ No newline at end of file
+ // check (sum == (((number_of_tasks * (number_of_tasks - 1)) / 2) *
+ // number_of_messages));
+ check (sum == 480);
+}
diff --git a/src/test/run-pass/task-comm-6.rs b/src/test/run-pass/task-comm-6.rs
index c579a98c..2774c0ba 100644
--- a/src/test/run-pass/task-comm-6.rs
+++ b/src/test/run-pass/task-comm-6.rs
@@ -31,6 +31,8 @@ io fn test00() {
r <- p; sum += r;
i += 1;
}
-
- check (sum == 4 * ((number_of_messages * (number_of_messages - 1)) / 2));
+
+ check (sum == 1998000);
+ // check (sum == 4 * ((number_of_messages *
+ // (number_of_messages - 1)) / 2));
} \ No newline at end of file
diff --git a/src/test/run-pass/task-comm.rs b/src/test/run-pass/task-comm.rs
index ef71c6e1..3c5d3216 100644
--- a/src/test/run-pass/task-comm.rs
+++ b/src/test/run-pass/task-comm.rs
@@ -1,11 +1,11 @@
-fn main() -> () {
- // test00(true);
+io fn main() -> () {
+ test00(true);
// test01();
- // test02();
- // test03();
- // test04();
- // test05();
+ test02();
+ test03();
+ test04();
+ test05();
test06();
}
@@ -22,7 +22,7 @@ io fn test00_start(chan[int] ch, int message, int count) {
io fn test00(bool is_multithreaded) {
let int number_of_tasks = 1;
- let int number_of_messages = 64;
+ let int number_of_messages = 4;
log "Creating tasks";
let port[int] po = port();
@@ -103,7 +103,7 @@ fn test04_start() {
fn test04() {
log "Spawning lots of tasks.";
- let int i = 64;
+ let int i = 4;
while (i > 0) {
i = i - 1;
spawn thread test04_start();
@@ -139,7 +139,7 @@ fn test06_start(int task_number) {
}
fn test06() {
- let int number_of_tasks = 32;
+ let int number_of_tasks = 4;
log "Creating tasks";
let int i = 0;