use super::assertions::render_json_assertion;
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
use std::collections::{HashMap, HashSet};
fn empty_resolver() -> FieldResolver {
FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
)
}
fn equals_assertion(field: Option<&str>, value: &str) -> Assertion {
Assertion {
assertion_type: "equals".to_string(),
field: field.map(str::to_string),
value: Some(serde_json::Value::String(value.to_string())),
..Assertion::default()
}
}
fn render(assertion: &Assertion) -> String {
let mut out = String::new();
render_json_assertion(&mut out, assertion, "result", &empty_resolver(), false);
out
}
#[test]
fn json_equals_string_compares_exactly_without_trim() {
let out = render(&equals_assertion(Some("content"), "Hello World\n"));
assert_eq!(
out, " try testing.expectEqualStrings(\"Hello World\\n\", result.object.get(\"content\").?.string);\n",
"emitted assertion drifted: {out}"
);
}
#[test]
fn json_equals_still_discriminates_trailing_whitespace() {
let with_newline = render(&equals_assertion(Some("content"), "hello\n"));
let without_newline = render(&equals_assertion(Some("content"), "hello"));
assert_ne!(
with_newline, without_newline,
"trailing newline must still change the emitted assertion"
);
}
#[test]
fn discriminated_format_equals_compares_exactly_without_trim() {
let out = render(&equals_assertion(Some("metadata.format"), "PNG\n"));
assert!(
out.contains("try testing.expectEqualStrings(\"PNG\\n\", _fmt_display);"),
"equals must not trim either side; got: {out}"
);
assert!(
!out.contains("std.mem.trim"),
"equals must not trim either side; got: {out}"
);
}