add tests to manage, fix test breakage I inadvertently introduced
This commit is contained in:
parent
9b489f6fff
commit
b5411f765c
1 changed files with 82 additions and 3 deletions
|
@ -3,7 +3,7 @@
|
||||||
Module for wrapping freezable data structures in managed boxes.
|
Module for wrapping freezable data structures in managed boxes.
|
||||||
Normally freezable data structures require an unaliased reference,
|
Normally freezable data structures require an unaliased reference,
|
||||||
such as `T` or `~T`, so that the compiler can track when they are
|
such as `T` or `~T`, so that the compiler can track when they are
|
||||||
being mutated. The `rw<T>` type converts these static checks into
|
being mutated. The `managed<T>` type converts these static checks into
|
||||||
dynamic checks: your program will fail if you attempt to perform
|
dynamic checks: your program will fail if you attempt to perform
|
||||||
mutation when the data structure should be immutable.
|
mutation when the data structure should be immutable.
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ export Managed;
|
||||||
enum Mode { ReadOnly, Mutable, Immutable }
|
enum Mode { ReadOnly, Mutable, Immutable }
|
||||||
|
|
||||||
struct Data<T> {
|
struct Data<T> {
|
||||||
mut value: T;
|
priv mut value: T;
|
||||||
mut mode: Mode;
|
priv mut mode: Mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
type Managed<T> = @Data<T>;
|
type Managed<T> = @Data<T>;
|
||||||
|
@ -60,3 +60,82 @@ impl<T> Data<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[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| {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue