#[cfg(test)]
mod tests {
use super::*;
#[test]
fn jni_return_type_unit() {
assert_eq!(jni_return_type(&TypeRef::Unit), "()");
}
#[test]
fn jni_return_type_i64() {
assert_eq!(jni_return_type(&TypeRef::Primitive(PrimitiveType::I64)), "jlong");
}
#[test]
fn jni_return_type_string() {
assert_eq!(jni_return_type(&TypeRef::String), "jstring");
}
#[test]
fn jni_return_type_vec_u8() {
assert_eq!(
jni_return_type(&TypeRef::Vec(Box::new(TypeRef::Primitive(PrimitiveType::U8)))),
"jbyteArray"
);
}
#[test]
fn throw_jni_error_has_runtime_exception_fallback() {
use crate::core::config::NewAlefConfig;
let raw: NewAlefConfig = toml::from_str(
r#"
[workspace]
languages = ["kotlin_android", "jni"]
[[crates]]
name = "demo"
sources = ["src/lib.rs"]
[crates.kotlin_android]
package = "dev.sample_crate"
namespace = "dev.sample_crate"
"#,
)
.unwrap();
let config = raw.resolve().unwrap().remove(0);
let api = crate::core::ir::ApiSurface {
crate_name: "demo".into(),
version: "0.1.0".into(),
types: vec![],
functions: vec![],
enums: vec![],
errors: vec![],
excluded_type_paths: Default::default(),
excluded_trait_names: ::std::collections::HashSet::new(),
services: vec![],
handler_contracts: vec![],
unsupported_public_items: Vec::new(),
};
let content = emit_lib_rs(&api, &config);
assert!(
!content.contains("let _ = env.throw_new(ERROR_CLASS"),
"throw_jni_error must not discard the throw_new result: {content}"
);
assert!(
content.contains("if env.throw_new(&class_jni, &msg_jni).is_err()"),
"throw_jni_error must check throw_new result: {content}"
);
assert!(
content.contains("jni::strings::JNIString::from(ERROR_CLASS)"),
"throw_jni_error must wrap ERROR_CLASS in JNIString::from: {content}"
);
assert!(
content.contains("java/lang/RuntimeException"),
"throw_jni_error must fall back to RuntimeException: {content}"
);
}
}