use super::render_assertion;
use crate::e2e::codegen::assertion_type_skip::AssertionTypeSkip;
use crate::e2e::codegen::field_skip::FieldSkip;
use crate::e2e::codegen::{SkipVerdict, fail_on_unavailable_field_markers, take_skip_records};
use crate::e2e::field_access::FieldResolver;
use crate::e2e::fixture::Assertion;
use std::collections::{HashMap, HashSet};
fn render(assertion: &Assertion, is_streaming: bool) -> String {
let resolver = FieldResolver::new(
&HashMap::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
&HashSet::new(),
);
let mut out = String::new();
render_assertion(
&mut out,
assertion,
"result",
&resolver,
false,
false,
false,
false,
&HashMap::new(),
is_streaming,
false,
);
out
}
fn assertion_on(assertion_type: &str, field: &str, value: Option<serde_json::Value>) -> Assertion {
Assertion {
assertion_type: assertion_type.to_string(),
field: Some(field.to_string()),
value,
..Assertion::default()
}
}
fn field_verdicts(body: &str) -> Vec<SkipVerdict> {
let _ = take_skip_records();
fail_on_unavailable_field_markers(body, "swift", "swift_smoke", &[]);
take_skip_records().into_iter().map(|record| record.verdict).collect()
}
#[test]
fn the_harness_renders_a_real_assertion_for_an_ordinary_field() {
let out = render(
&assertion_on("equals", "title", Some(serde_json::json!("hello"))),
false,
);
assert!(out.contains("XCTAssert"), "got: {out}");
assert!(
field_verdicts(&out).is_empty(),
"a live assertion records no skip: {out}"
);
}
#[test]
fn a_json_bridged_count_is_a_limitation_never_an_unacknowledged_gap() {
let out = render(
&assertion_on("count_equals", "headings.length", Some(serde_json::json!(3))),
false,
);
assert_eq!(
FieldSkip::extract_classified(out.trim_end()),
Some(("headings.length", FieldSkip::CountOnJsonBridgedLeafInSwift)),
"got: {out}"
);
assert_eq!(
field_verdicts(&out),
vec![SkipVerdict::Limitation],
"a resolvable field refused for an ABI reason must never be an unacknowledged gap: {out}"
);
}
#[test]
fn a_streaming_field_with_no_accessor_emits_a_counted_marker() {
let out = render(&assertion_on("is_true", "stream.has_page_event", None), true);
assert!(!out.is_empty(), "the assertion must not vanish");
assert_eq!(
FieldSkip::extract_classified(out.trim_end()),
Some(("stream.has_page_event", FieldSkip::StreamingAssertionOnUnsupportedField)),
"got: {out}"
);
assert_eq!(
field_verdicts(&out),
vec![SkipVerdict::AwaitingGeneratorSupport],
"alef's own generator debt is counted, never fatal: {out}"
);
}
#[test]
fn an_unrenderable_streaming_assertion_type_emits_a_registered_marker() {
let out = render(&assertion_on("matches_regex", "chunks", None), true);
assert_eq!(
AssertionTypeSkip::extract_classified(out.trim_end()),
Some(("matches_regex", AssertionTypeSkip::StreamingAssertionTypeNotSupported)),
"got: {out}"
);
}
#[test]
fn an_unrenderable_streaming_value_emits_a_registered_marker() {
let out = render(
&assertion_on("count_min", "chunks", Some(serde_json::json!("three"))),
true,
);
assert_eq!(
AssertionTypeSkip::extract_classified(out.trim_end()),
Some(("count_min", AssertionTypeSkip::StreamingAssertionValueNotRenderable)),
"got: {out}"
);
}