alef 0.81.0

Opinionated polyglot binding generator for Rust libraries
Documentation
use std::collections::{HashMap, HashSet};

use crate::core::ir::{FieldDef, TypeDef, TypeRef};
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;

use super::assertions::render_assertion;

fn envelope_types(ty: TypeRef, optional: bool) -> Vec<TypeDef> {
    vec![
        TypeDef {
            name: "Envelope".into(),
            fields: vec![FieldDef {
                name: "details".into(),
                ty,
                optional,
                ..Default::default()
            }],
            ..Default::default()
        },
        TypeDef {
            name: "Details".into(),
            ..Default::default()
        },
    ]
}

fn envelope_resolver(types: &[TypeDef], optional: bool, array: bool) -> FieldResolver {
    let optional_fields = if optional {
        HashSet::from(["details".to_string()])
    } else {
        HashSet::new()
    };
    let array_fields = if array {
        HashSet::from(["details".to_string()])
    } else {
        HashSet::new()
    };
    FieldResolver::new(
        &HashMap::new(),
        &optional_fields,
        &HashSet::new(),
        &array_fields,
        &HashSet::new(),
    )
    .with_ir_result_fields(
        FieldResolver::ir_result_field_facts(types, "java"),
        Some("Envelope".into()),
    )
}

fn render(ty: TypeRef, optional: bool, array: bool, assertion_type: &str) -> String {
    let types = envelope_types(ty, optional);
    let resolver = envelope_resolver(&types, optional, array);
    let mut output = String::new();
    render_assertion(
        &mut output,
        &Assertion {
            assertion_type: assertion_type.into(),
            field: Some("details".into()),
            ..Default::default()
        },
        "result",
        "Envelope",
        &resolver,
        false,
        false,
        false,
        false,
        None,
        &HashSet::new(),
        &HashMap::new(),
        false,
        &HashSet::new(),
        true,
    );
    output
}

#[test]
fn bare_record_uses_nullability_checks() {
    assert_eq!(
        render(TypeRef::Named("Details".into()), false, false, "not_empty"),
        "        assertNotNull(result.details(), \"expected non-empty value\");\n"
    );
    assert_eq!(
        render(TypeRef::Named("Details".into()), false, false, "is_empty"),
        "        assertNull(result.details(), \"expected empty value\");\n"
    );
}

#[test]
fn record_collection_uses_collection_methods() {
    assert_eq!(
        render(
            TypeRef::Vec(Box::new(TypeRef::Named("Details".into()))),
            false,
            true,
            "not_empty"
        ),
        "        assertFalse(result.details().isEmpty(), \"expected non-empty value\");\n"
    );
}

#[test]
fn optional_record_uses_optional_presence() {
    assert_eq!(
        render(TypeRef::Named("Details".into()), true, false, "is_empty"),
        "        assertTrue(java.util.Optional.ofNullable(result.details()).isEmpty(), \"expected empty value\");\n"
    );
}