use super::assertions::render_assertion;
use crate::e2e::codegen::not_error_presence::may_assert_presence;
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::{Assertion, Fixture};
use std::collections::{HashMap, HashSet};
fn empty_resolver() -> FieldResolver {
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
)
}
fn not_error_assertion() -> Assertion {
Assertion {
assertion_type: "not_error".to_string(),
..Default::default()
}
}
fn is_empty_assertion() -> Assertion {
Assertion {
assertion_type: "is_empty".to_string(),
..Default::default()
}
}
fn fixture_with(assertions: Vec<Assertion>) -> Fixture {
Fixture {
assertions,
..Default::default()
}
}
fn render(assertion: &Assertion, not_error_may_assert_presence: bool) -> String {
let resolver = empty_resolver();
let mut out = String::new();
render_assertion(
&mut out,
assertion,
"result",
&resolver,
"SampleModule",
&HashSet::new(),
&HashMap::new(),
false,
false,
false,
not_error_may_assert_presence,
);
out
}
#[test]
fn not_error_paired_with_is_empty_does_not_assert_presence() {
let fixture = fixture_with(vec![not_error_assertion(), is_empty_assertion()]);
let may_assert = may_assert_presence(&fixture, false);
let out = render(¬_error_assertion(), may_assert);
assert_eq!(
out, "",
"not_error must render nothing when a sibling assertion exists; got: {out}"
);
}
#[test]
fn not_error_as_sole_assertion_on_non_option_result_still_asserts_presence() {
let fixture = fixture_with(vec![not_error_assertion()]);
let may_assert = may_assert_presence(&fixture, false);
let out = render(¬_error_assertion(), may_assert);
assert_eq!(out, " refute is_nil(result)\n");
}
#[test]
fn not_error_as_sole_assertion_on_option_result_does_not_assert_presence() {
let fixture = fixture_with(vec![not_error_assertion()]);
let may_assert = may_assert_presence(&fixture, true);
let out = render(¬_error_assertion(), may_assert);
assert_eq!(
out, "",
"not_error on a bare Option<T> result must not assert non-nil even as the sole \
assertion; got: {out}"
);
}
#[test]
fn not_error_then_is_empty_in_sequence_emits_only_is_empty() {
let fixture = fixture_with(vec![not_error_assertion(), is_empty_assertion()]);
let may_assert = may_assert_presence(&fixture, false);
let mut out = String::new();
let resolver = empty_resolver();
for assertion in [¬_error_assertion(), &is_empty_assertion()] {
render_assertion(
&mut out,
assertion,
"result",
&resolver,
"SampleModule",
&HashSet::new(),
&HashMap::new(),
false,
false,
false,
may_assert,
);
}
assert!(
!out.contains("refute is_nil(result)"),
"not_error must not assert presence alongside is_empty; got: {out}"
);
assert!(
out.contains("assert is_nil(result)"),
"is_empty must still render its own nil check; got: {out}"
);
}