jvmti 0.5.0

JVM TI Rust binding
Documentation
extern crate jvmti;

mod collections;
mod constant;
mod stream;

#[cfg(test)]
mod tests {

    mod class_reader {

        use jvmti::bytecode::classfile::*;
        use jvmti::bytecode::constant::*;
        use jvmti::bytecode::ClassReader;

        fn simple_class() -> &'static [u8] {
            include_bytes!("../../Simple.class")
        }

        fn test_class() -> &'static [u8] {
            include_bytes!("../../Test.class")
        }

        #[test]
        fn read_bytes_reads_simple_class_version_number_correctly() {
            let result = ClassReader::read_array(simple_class());

            assert!(result.is_ok(), format!("Error: {}", result.err().unwrap()));
            let class = result.ok().unwrap();

            assert_eq!(52, class.version.major_version);
            assert_eq!(0, class.version.minor_version);
        }

        #[test]
        fn read_bytes_reads_simple_constant_pool_correctly() {
            let result = ClassReader::read_array(simple_class());

            assert!(result.is_ok(), format!("Error: {}", result.err().unwrap()));
            let class = result.ok().unwrap();

            assert!(class.constant_pool.get(&class.this_class).is_some());

            let this_class: &Constant = class.constant_pool.get(&class.this_class).unwrap();

            match this_class {
                &Constant::Class(idx) => {
                    assert!(class.constant_pool.get(&ConstantPoolIndex::of(idx)).is_some(), format!("Referenced constant missing: {}", idx));
                },
                _ => assert!(false, format!("{:?}", this_class))
            }

        }

        #[test]
        fn read_bytes_reads_simple_access_flags_correctly() {
            let result = ClassReader::read_array(simple_class());

            assert!(result.is_ok(), format!("Error: {}", result.err().unwrap()));
            let class = result.ok().unwrap();

            assert!(class.access_flags.has_flag(ClassAccessFlags::PUBLIC as u16));
            assert!(class.access_flags.has_flag(ClassAccessFlags::SUPER as u16));
            assert!(!class.access_flags.has_flag(ClassAccessFlags::INTERFACE as u16));
            assert!(!class.access_flags.has_flag(ClassAccessFlags::ENUM as u16));
        }

        #[test]
        fn read_bytes_reads_interfaces_correctly() {
            let result = ClassReader::read_array(simple_class());

            assert!(result.is_ok(), format!("Error: {}", result.err().unwrap()));
            let class = result.ok().unwrap();

            assert_eq!(0, class.interfaces.len());
        }

        #[test]
        fn read_bytes_reads_test_class_correctly() {
            let reader = ClassReader::read_array(test_class());

            assert!(reader.is_ok());
        }

    }
}