From b5411f765cdac796fc6798e49521c8da89a394cc Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 21 Aug 2012 17:14:40 -0700 Subject: [PATCH] add tests to manage, fix test breakage I inadvertently introduced --- src/libcore/managed.rs | 85 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/src/libcore/managed.rs b/src/libcore/managed.rs index 06fcd87282b..47d5d7f7cdd 100644 --- a/src/libcore/managed.rs +++ b/src/libcore/managed.rs @@ -3,7 +3,7 @@ Module for wrapping freezable data structures in managed boxes. Normally freezable data structures require an unaliased reference, such as `T` or `~T`, so that the compiler can track when they are -being mutated. The `rw` type converts these static checks into +being mutated. The `managed` type converts these static checks into dynamic checks: your program will fail if you attempt to perform mutation when the data structure should be immutable. @@ -21,8 +21,8 @@ export Managed; enum Mode { ReadOnly, Mutable, Immutable } struct Data { - mut value: T; - mut mode: Mode; + priv mut value: T; + priv mut mode: Mode; } type Managed = @Data; @@ -60,3 +60,82 @@ impl Data { } } } + +#[test] +#[should_fail] +fn test_mut_in_imm() { + let m = Managed(1); + do m.borrow_imm |_p| { + do m.borrow_mut |_q| { + // should not be permitted + } + } +} + +#[test] +#[should_fail] +fn test_imm_in_mut() { + let m = Managed(1); + do m.borrow_mut |_p| { + do m.borrow_imm |_q| { + // should not be permitted + } + } +} + +#[test] +fn test_const_in_mut() { + let m = Managed(1); + do m.borrow_mut |p| { + do m.borrow_const |q| { + assert *p == *q; + *p += 1; + assert *p == *q; + } + } +} + +#[test] +fn test_mut_in_const() { + let m = Managed(1); + do m.borrow_const |p| { + do m.borrow_mut |q| { + assert *p == *q; + *q += 1; + assert *p == *q; + } + } +} + +#[test] +fn test_imm_in_const() { + let m = Managed(1); + do m.borrow_const |p| { + do m.borrow_imm |q| { + assert *p == *q; + } + } +} + +#[test] +fn test_const_in_imm() { + let m = Managed(1); + do m.borrow_imm |p| { + do m.borrow_const |q| { + assert *p == *q; + } + } +} + + +#[test] +#[should_fail] +fn test_mut_in_imm_in_const() { + let m = Managed(1); + do m.borrow_const |_p| { + do m.borrow_imm |_q| { + do m.borrow_mut |_r| { + } + } + } +}