diff --git a/src/test/auxiliary/xc_conditions.rs b/src/test/auxiliary/xc_conditions.rs new file mode 100644 index 0000000000000..927602de16989 --- /dev/null +++ b/src/test/auxiliary/xc_conditions.rs @@ -0,0 +1,19 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[crate_type="lib"]; + +condition! { + pub oops: int -> int; +} + +pub fn trouble() -> int { + oops::cond.raise(1) +} diff --git a/src/test/auxiliary/xc_conditions_2.rs b/src/test/auxiliary/xc_conditions_2.rs new file mode 100644 index 0000000000000..16a5bb5634341 --- /dev/null +++ b/src/test/auxiliary/xc_conditions_2.rs @@ -0,0 +1,15 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[crate_type="lib"]; + +condition! { + pub oops: int -> int; +} diff --git a/src/test/auxiliary/xc_conditions_3.rs b/src/test/auxiliary/xc_conditions_3.rs new file mode 100644 index 0000000000000..d5ce63e7e9bc0 --- /dev/null +++ b/src/test/auxiliary/xc_conditions_3.rs @@ -0,0 +1,21 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[crate_type="lib"]; + +condition! { + pub oops: int -> int; +} + +pub fn guard(k: extern fn() -> int, x: int) -> int { + do oops::cond.trap(|i| i*x).inside { + k() + } +} diff --git a/src/test/auxiliary/xc_conditions_4.rs b/src/test/auxiliary/xc_conditions_4.rs new file mode 100644 index 0000000000000..c9b5a1dc2b820 --- /dev/null +++ b/src/test/auxiliary/xc_conditions_4.rs @@ -0,0 +1,29 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[crate_type="lib"]; + +#[deriving(Eq)] +pub enum Color { + Red, Green, Blue +} + +condition! { + pub oops: (int,float,~str) -> ::Color; +} + +pub trait Thunk { + fn call(self) -> T; +} + +pub fn callback>(t:TH) -> T { + t.call() +} + diff --git a/src/test/run-pass/xc_conditions_client.rs b/src/test/run-pass/xc_conditions_client.rs new file mode 100644 index 0000000000000..ffef5369f237e --- /dev/null +++ b/src/test/run-pass/xc_conditions_client.rs @@ -0,0 +1,40 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// xfail-fast +// aux-build:xc_conditions.rs + +extern mod xc_conditions; +use xc_conditions::oops; +use xc_conditions::trouble; + +// Tests of cross-crate conditions; the condition is +// defined in lib, and we test various combinations +// of `trap` and `raise` in the client or the lib where +// the condition was defined. Also in test #4 we use +// more complex features (generics, traits) in +// combination with the condition. +// +// trap raise +// ------------ +// xc_conditions : client lib +// xc_conditions_2: client client +// xc_conditions_3: lib client +// xc_conditions_4: client client (with traits) +// +// the trap=lib, raise=lib case isn't tested since +// there's no cross-crate-ness to test in that case. + +pub fn main() { + do oops::cond.trap(|_i| 12345).inside { + let x = trouble(); + assert_eq!(x,12345); + } +} \ No newline at end of file diff --git a/src/test/run-pass/xc_conditions_client_2.rs b/src/test/run-pass/xc_conditions_client_2.rs new file mode 100644 index 0000000000000..9666c037449f1 --- /dev/null +++ b/src/test/run-pass/xc_conditions_client_2.rs @@ -0,0 +1,21 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// xfail-fast +// aux-build:xc_conditions_2.rs + +extern mod xc_conditions_2; +use xcc = xc_conditions_2; + +pub fn main() { + do xcc::oops::cond.trap(|_| 1).inside { + xcc::oops::cond.raise(1); + } +} diff --git a/src/test/run-pass/xc_conditions_client_3.rs b/src/test/run-pass/xc_conditions_client_3.rs new file mode 100644 index 0000000000000..7d16572c139ce --- /dev/null +++ b/src/test/run-pass/xc_conditions_client_3.rs @@ -0,0 +1,38 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// xfail-fast +// aux-build:xc_conditions_3.rs + +extern mod xc_conditions_3; +use xcc = xc_conditions_3; + +pub fn main() { + assert_eq!(xcc::guard(a, 1), 40); +} + +pub fn a() -> int { + assert_eq!(xcc::oops::cond.raise(7), 7); + xcc::guard(b, 2) +} + +pub fn b() -> int { + assert_eq!(xcc::oops::cond.raise(8), 16); + xcc::guard(c, 3) +} + +pub fn c() -> int { + assert_eq!(xcc::oops::cond.raise(9), 27); + xcc::guard(d, 4) +} + +pub fn d() -> int { + xcc::oops::cond.raise(10) +} diff --git a/src/test/run-pass/xc_conditions_client_4.rs b/src/test/run-pass/xc_conditions_client_4.rs new file mode 100644 index 0000000000000..9a4a868374235 --- /dev/null +++ b/src/test/run-pass/xc_conditions_client_4.rs @@ -0,0 +1,32 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// xfail-fast +// aux-build:xc_conditions_4.rs + +extern mod xc_conditions_4; +use xcc = xc_conditions_4; + +struct SThunk { + x: int +} + +impl xcc::Thunk for SThunk { + fn call(self) -> xcc::Color { + xcc::oops::cond.raise((self.x, 1.23, ~"oh no")) + } +} + +pub fn main() { + do xcc::oops::cond.trap(|_| xcc::Red).inside { + let t = SThunk { x : 10 }; + assert_eq!(xcc::callback(t), xcc::Red) + } +} \ No newline at end of file