Skip to main content

sim_lib_lang_genconf/
lib.rs

1#![forbid(unsafe_code)]
2#![deny(missing_docs)]
3//! Generative conformance support over the shared expression graph.
4//!
5//! This crate owns deterministic `Expr`-space enumeration for language
6//! conformance. The matrix runner and language rows stay in their existing
7//! crates; this crate supplies the generated inputs they consume.
8
9pub mod anchor;
10pub mod coverage;
11pub mod property;
12pub mod publish;
13pub mod registry;
14pub mod seed;
15pub mod space;
16
17pub use anchor::{
18    CoverageVerdict, LandmarkCorpus, common_lisp_lite_landmark_corpus, r7rs_small_landmark_corpus,
19};
20pub use coverage::{GeneratedCoverageReport, run_generated_row};
21pub use property::{check_round_trip, generated_expr_cases};
22pub use publish::{
23    coverage_card_fields, generated_coverage_profile_symbol, publish_coverage_claims,
24};
25pub use registry::{GenerativeRow, generative_registry, run_all_generated};
26pub use seed::r7rs_seed_corpus;
27pub use space::ExprSpace;
28
29#[cfg(test)]
30mod landmark_tests {
31    use sim_kernel::Expr;
32    use sim_lib_lang_scheme::r7rs_small_expr_cases;
33
34    use super::ExprSpace;
35
36    /// The generator must reproduce every curated Scheme expression landmark
37    /// before generated coverage is trusted.
38    #[test]
39    fn generator_reproduces_curated_scheme_landmarks() {
40        let space = ExprSpace::r7rs_core_space(3);
41        let generated = space.enumerate(256);
42        let landmarks = curated_landmark_exprs();
43
44        assert!(!r7rs_small_expr_cases().is_empty());
45        assert!(
46            !landmarks.is_empty(),
47            "Scheme row must expose at least one concrete Expr landmark",
48        );
49        for landmark in landmarks {
50            assert!(
51                generated
52                    .iter()
53                    .any(|generated| generated.canonical_eq(&landmark)),
54                "generator failed to reproduce curated landmark: {landmark:?}",
55            );
56        }
57    }
58
59    fn curated_landmark_exprs() -> Vec<Expr> {
60        r7rs_small_expr_cases()
61            .into_iter()
62            .filter_map(|case| {
63                case.expected_display
64                    .as_deref()
65                    .and_then(expr_from_expected_display)
66            })
67            .collect()
68    }
69
70    fn expr_from_expected_display(display: &str) -> Option<Expr> {
71        match display {
72            "Expr::Bool(true)" => Some(Expr::Bool(true)),
73            "Expr::Bool(false)" => Some(Expr::Bool(false)),
74            _ => None,
75        }
76    }
77}