rust-tcl 0.3.0

Tcl bindings for Rust
Documentation
extern crate tcl;
extern crate rust_tcl_sys as ll;

#[test]
fn new_object() {
    let env = tcl::init();
    env.new_object(());
}

#[test]
fn clone_object() {
    let env = tcl::init();
    let obj = env.new_object("TEST");
    unsafe {
        ll::Tcl_IncrRefCount(obj.raw());
        ll::Tcl_IncrRefCount(obj.raw());
    }
    assert_eq!(true, obj.is_shared());
    let obj2 = obj.clone();
    assert_eq!(true, obj.is_shared());
    assert_eq!(obj.get_string(), "TEST");
    assert_eq!(false, obj2.is_shared());
    assert_eq!(obj2.get_string(), "TEST");

}

#[test]
fn is_shared() {

    let env = tcl::init();
    let obj = env.new_object(());
    assert_eq!(false, obj.is_shared());
    unsafe {
        ll::Tcl_IncrRefCount(obj.raw());
    }
    assert_eq!(true, obj.is_shared());
    unsafe {
        ll::Tcl_DecrRefCount(obj.raw());
    }
}

macro_rules! object_test {
    ($kind:ident, $getter:ident, $first_value:expr, $second_value:expr) => (
        #[test]
        fn $kind() {
            let env = tcl::init();
            let mut interp = env.interpreter().unwrap();
            let mut obj = env.new_object($first_value);
            assert_eq!(obj.get::<$getter>(&mut interp).unwrap(), $first_value);
            obj.set($second_value);
            assert_eq!(obj.get::<$getter>(&mut interp).unwrap(), $second_value);
        }
    )
}

object_test!(boolean, bool, true, false);
object_test!(integer, i32, 1, 2);
object_test!(long, i64, 1i64, 2i64);
object_test!(double, f64, 1.0f64, 2.0f64);

#[test]
fn string()  {
    let env = tcl::init();
    let mut obj = env.new_object("HI");
    assert_eq!(obj.get_string(), "HI");
    obj.set("BYE");
    assert_eq!(obj.get_string(), "BYE");
}

#[test]
fn byte_array()  {
    let env = tcl::init();
    let mut obj = env.new_object(&[1,4][..]);
    assert_eq!(obj.get_byte_array(), [1,4]);
    obj.set(&[1,2][..]);
    assert_eq!(obj.get_byte_array(), [1,2]);
}