From 4c17cb73a26de704b2040ecd5d6e75633e27fe92 Mon Sep 17 00:00:00 2001 From: Michael Sullivan Date: Mon, 25 Jul 2011 16:57:27 -0700 Subject: [PATCH] Add a bunch of tests for blocks. --- src/test/compile-fail/block-coerce-no.rs | 20 ++++++++++++++++++++ src/test/compile-fail/block-copy.rs | 9 +++++++++ src/test/compile-fail/block-uninit.rs | 8 ++++++++ src/test/run-pass/block-fn-coerce.rs | 9 +++++++++ src/test/run-pass/block-iter-1.rs | 22 ++++++++++++++++++++++ src/test/run-pass/block-iter-2.rs | 22 ++++++++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 src/test/compile-fail/block-coerce-no.rs create mode 100644 src/test/compile-fail/block-copy.rs create mode 100644 src/test/compile-fail/block-uninit.rs create mode 100644 src/test/run-pass/block-fn-coerce.rs create mode 100644 src/test/run-pass/block-iter-1.rs create mode 100644 src/test/run-pass/block-iter-2.rs diff --git a/src/test/compile-fail/block-coerce-no.rs b/src/test/compile-fail/block-coerce-no.rs new file mode 100644 index 000000000000..18331262263f --- /dev/null +++ b/src/test/compile-fail/block-coerce-no.rs @@ -0,0 +1,20 @@ +// error-pattern: mismatched types +// xfail-stage0 + +// Make sure that fn-to-block coercion isn't incorrectly lifted over +// other tycons. + +fn coerce(&block() b) -> fn() { + fn lol(&fn(&block()) -> fn() f, &block() g) -> fn() { + ret f(g); + } + fn fn_id (&fn() f) -> fn() { ret f } + ret lol(fn_id, b); +} + + +fn main() { + auto i = 8; + auto f = coerce(block() { log_err i; } ); + f(); +} diff --git a/src/test/compile-fail/block-copy.rs b/src/test/compile-fail/block-copy.rs new file mode 100644 index 000000000000..d8df0a92db84 --- /dev/null +++ b/src/test/compile-fail/block-copy.rs @@ -0,0 +1,9 @@ +// error-pattern: non-copyable +// xfail-stage0 + +fn lol(&block() f) -> block() { ret f; } +fn main() { + auto i = 8; + auto f = lol(block() { log_err i; } ); + f(); +} diff --git a/src/test/compile-fail/block-uninit.rs b/src/test/compile-fail/block-uninit.rs new file mode 100644 index 000000000000..ff86906962f9 --- /dev/null +++ b/src/test/compile-fail/block-uninit.rs @@ -0,0 +1,8 @@ +// error-pattern: Unsatisfied precondition constraint +// xfail-stage0 + +fn force(&block() f) { f(); } +fn main() { + let int x; + force(block() { log_err x; }); +} diff --git a/src/test/run-pass/block-fn-coerce.rs b/src/test/run-pass/block-fn-coerce.rs new file mode 100644 index 000000000000..f728fbbb71fd --- /dev/null +++ b/src/test/run-pass/block-fn-coerce.rs @@ -0,0 +1,9 @@ +// xfail-stage0 + +fn force(&block() -> int f) -> int { ret f(); } +fn main() { + auto f = fn() -> int { ret 7 }; + assert(force(f) == 7); + auto g = bind force(f); + assert(g() == 7); +} diff --git a/src/test/run-pass/block-iter-1.rs b/src/test/run-pass/block-iter-1.rs new file mode 100644 index 000000000000..6d887b2f927a --- /dev/null +++ b/src/test/run-pass/block-iter-1.rs @@ -0,0 +1,22 @@ +// xfail-stage0 + +fn iter_vec[T](&vec[T] v, &block (&T) f) { + for (T x in v) { + f(x); + } +} + +fn main() { + auto v = [1,2,3,4,5,6,7]; + auto odds = 0; + iter_vec(v, + block (&int i) { + log_err i; + if (i % 2 == 1) { + odds += 1; + } + log_err odds; + }); + log_err odds; + assert(odds == 4); +} diff --git a/src/test/run-pass/block-iter-2.rs b/src/test/run-pass/block-iter-2.rs new file mode 100644 index 000000000000..1bc1997d8365 --- /dev/null +++ b/src/test/run-pass/block-iter-2.rs @@ -0,0 +1,22 @@ +// xfail-stage0 + +fn iter_vec[T](&vec[T] v, &block (&T) f) { + for (T x in v) { + f(x); + } +} + +fn main() { + auto v = [1,2,3,4,5]; + auto sum = 0; + iter_vec(v, block (&int i) + { + iter_vec(v, block (&int j) + { + log_err i*j; + sum += i*j; + }); + }); + log_err sum; + assert(sum == 225); +}