jvm 0.4.1

Core abstractions and runtime services for embeddable JVM implementations
Documentation
use jvm::{Result as JvmResult, runtime::JavaLangString};

use test_utils::test_jvm;

#[tokio::test]
async fn test_is_instance() -> JvmResult<()> {
    let jvm = test_jvm().await?;

    let string = JavaLangString::from_rust_string(&jvm, "test").await?;

    assert!(jvm.is_instance(&*string, "java/lang/String"));
    assert!(jvm.is_instance(&*string, "java/lang/Object"));
    assert!(!jvm.is_instance(&*string, "java/lang/Integer"));

    Ok(())
}

#[tokio::test]
async fn test_is_instance_interface() -> JvmResult<()> {
    let jvm = test_jvm().await?;

    let buffer = jvm.instantiate_array("B", 0).await?;
    let bais = jvm.new_class("java/io/ByteArrayInputStream", "([B)V", (buffer,)).await?;
    let dis = jvm.new_class("java/io/DataInputStream", "(Ljava/io/InputStream;)V", (bais,)).await?;

    assert!(jvm.is_instance(&*dis, "java/io/DataInput"));
    assert!(jvm.is_instance(&*dis, "java/io/FilterInputStream"));
    assert!(jvm.is_instance(&*dis, "java/lang/Object"));
    assert!(!jvm.is_instance(&*dis, "java/io/DataOutput"));

    Ok(())
}

#[tokio::test]
async fn test_is_instance_array_covariance() -> JvmResult<()> {
    let jvm = test_jvm().await?;

    let string_array = jvm.instantiate_array("Ljava/lang/String;", 1).await?;
    assert!(jvm.is_instance(&*string_array, "[Ljava/lang/Object;"));
    assert!(jvm.is_instance(&*string_array, "java/lang/Object"));
    assert!(jvm.is_instance(&*string_array, "java/lang/Cloneable"));
    assert!(jvm.is_instance(&*string_array, "java/io/Serializable"));
    assert!(jvm.is_instance(&*string_array, "[Ljava/lang/String;"));
    assert!(!jvm.is_instance(&*string_array, "[Ljava/lang/Integer;"));

    let int_array = jvm.instantiate_array("I", 1).await?;
    assert!(jvm.is_instance(&*int_array, "java/lang/Object"));
    assert!(!jvm.is_instance(&*int_array, "[Ljava/lang/Object;"));
    assert!(!jvm.is_instance(&*int_array, "[J"));

    let nested = jvm.instantiate_array("[Ljava/lang/String;", 1).await?;
    assert!(jvm.is_instance(&*nested, "[Ljava/lang/Object;"));
    assert!(jvm.is_instance(&*nested, "[[Ljava/lang/Object;"));
    assert!(jvm.is_instance(&*nested, "[[Ljava/lang/String;"));

    let object_array = jvm.instantiate_array("Ljava/lang/Object;", 1).await?;
    assert!(!jvm.is_instance(&*object_array, "[Ljava/lang/String;"));

    Ok(())
}