use std::fmt::Write as FmtWrite;
use crate::e2e::codegen::assertion_recipes::chunks_result_var;
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
pub(super) fn try_render(
out: &mut String,
assertion: &Assertion,
result_var: &str,
field: &str,
field_resolver: &FieldResolver,
) -> bool {
match field {
"chunks_have_content" => {
let result_var = &chunks_result_var(field_resolver, "r", result_var);
let pred = format!("all(sapply({result_var}$chunks %||% list(), function(c) nchar(c$content) > 0))");
render_true_false(out, assertion, field, &pred);
true
}
"chunks_have_embeddings" => {
let result_var = &chunks_result_var(field_resolver, "r", result_var);
let pred = format!(
"all(sapply({result_var}$chunks %||% list(), function(c) !is.null(c$embedding) && length(c$embedding) > 0))"
);
render_true_false(out, assertion, field, &pred);
true
}
"chunks_have_heading_context" => {
let result_var = &chunks_result_var(field_resolver, "r", result_var);
let pred = format!(
"!is.null({result_var}$chunks) && length({result_var}$chunks) > 0 && all(sapply({result_var}$chunks, function(c) !is.null(c$metadata) && !is.null(c$metadata$heading_context)))"
);
render_true_false(out, assertion, field, &pred);
true
}
"first_chunk_starts_with_heading" => {
let result_var = &chunks_result_var(field_resolver, "r", result_var);
let pred = format!(
"!is.null({result_var}$chunks) && length({result_var}$chunks) > 0 && !is.null({result_var}$chunks[[1]]$metadata) && !is.null({result_var}$chunks[[1]]$metadata$heading_context)"
);
render_true_false(out, assertion, field, &pred);
true
}
_ => false,
}
}
fn render_true_false(out: &mut String, assertion: &Assertion, field: &str, pred: &str) {
match assertion.assertion_type.as_str() {
"is_true" => {
let _ = writeln!(out, " expect_true({pred})");
}
"is_false" => {
let _ = writeln!(out, " expect_false({pred})");
}
other => {
panic!("R e2e generator: unsupported assertion type '{other}' on synthetic field '{field}'");
}
}
}