use crate::e2e::fixture::Assertion;
use std::fmt::Write as FmtWrite;
use super::AssertionRenderContext;
use super::target::ResolvedAssertionTarget;
pub(super) fn render_not_empty(
out_ref: &mut String,
context: &AssertionRenderContext<'_>,
assertion: &Assertion,
target: &ResolvedAssertionTarget,
) {
let field_resolver = context.field_resolver;
let numeric_scalar_fields = context.numeric_scalar_fields;
let field_expr = target.field_expr.clone();
let field_is_pointer = target.field_is_pointer;
let field_is_nullable = target.field_is_nullable;
let field_is_slice = target.field_is_slice;
let resolved_field = assertion.field.as_deref().unwrap_or("");
let field_is_array = {
let rn = field_resolver.resolve(resolved_field);
field_resolver.is_array(rn)
};
let is_numeric_scalar = !field_is_pointer && !field_is_array && numeric_scalar_fields.contains(resolved_field);
if field_is_pointer && !field_is_array {
let _ = writeln!(out_ref, "\tif {field_expr} == nil {{");
} else if field_is_nullable && field_is_slice {
let _ = writeln!(out_ref, "\tif {field_expr} == nil || len({field_expr}) == 0 {{");
} else if field_is_pointer {
let _ = writeln!(out_ref, "\tif {field_expr} == nil || len(*{field_expr}) == 0 {{");
} else if field_is_nullable {
let _ = writeln!(out_ref, "\tif {field_expr} == nil || len({field_expr}) == 0 {{");
} else if is_numeric_scalar {
return;
} else {
let _ = writeln!(out_ref, "\tif len({field_expr}) == 0 {{");
}
let _ = writeln!(out_ref, "\t\tt.Errorf(\"expected non-empty value\")");
let _ = writeln!(out_ref, "\t}}");
}
pub(super) fn render_is_empty(
out_ref: &mut String,
context: &AssertionRenderContext<'_>,
assertion: &Assertion,
target: &ResolvedAssertionTarget,
) {
let field_resolver = context.field_resolver;
let result_is_simple = context.result_is_simple;
let result_is_array = context.result_is_array;
let field_expr = target.field_expr.clone();
let field_is_pointer = target.field_is_pointer;
let field_is_nullable = target.field_is_nullable;
let field_is_slice = target.field_is_slice;
let field_is_array = {
let rf = assertion.field.as_deref().unwrap_or("");
let rn = field_resolver.resolve(rf);
field_resolver.is_array(rn)
};
let simple_scalar_result =
result_is_simple && !result_is_array && assertion.field.as_ref().is_none_or(|f| f.is_empty());
if simple_scalar_result || field_is_pointer && !field_is_array {
let _ = writeln!(out_ref, "\tif {field_expr} != nil {{");
} else if field_is_nullable && field_is_slice {
let _ = writeln!(out_ref, "\tif {field_expr} != nil && len({field_expr}) != 0 {{");
} else if field_is_pointer {
let _ = writeln!(out_ref, "\tif {field_expr} != nil && len(*{field_expr}) != 0 {{");
} else if field_is_nullable {
let _ = writeln!(out_ref, "\tif {field_expr} != nil && len({field_expr}) != 0 {{");
} else {
let _ = writeln!(out_ref, "\tif len({field_expr}) != 0 {{");
}
let _ = writeln!(out_ref, "\t\tt.Errorf(\"expected empty value, got %v\", {field_expr})");
let _ = writeln!(out_ref, "\t}}");
}
pub(super) fn render_is_true(out_ref: &mut String, target: &ResolvedAssertionTarget) {
let field_expr = &target.field_expr;
let deref_field_expr = &target.deref_field_expr;
let is_optional = target.is_optional;
let field_is_pointer = target.field_is_pointer;
if is_optional {
let _ = writeln!(out_ref, "\tassert.NotNil(t, {field_expr}, \"expected true (non-nil)\")");
} else if field_is_pointer {
let _ = writeln!(out_ref, "\tassert.True(t, {deref_field_expr}, \"expected true\")");
} else {
let _ = writeln!(out_ref, "\tassert.True(t, {field_expr}, \"expected true\")");
}
}
pub(super) fn render_is_false(out_ref: &mut String, target: &ResolvedAssertionTarget) {
let field_expr = &target.field_expr;
let deref_field_expr = &target.deref_field_expr;
let is_optional = target.is_optional;
let field_is_pointer = target.field_is_pointer;
if is_optional {
let _ = writeln!(out_ref, "\tassert.Nil(t, {field_expr}, \"expected false (nil)\")");
} else if field_is_pointer {
let _ = writeln!(out_ref, "\tassert.False(t, {deref_field_expr}, \"expected false\")");
} else {
let _ = writeln!(out_ref, "\tassert.False(t, {field_expr}, \"expected false\")");
}
}