Skip to main content

sim_lib_lang_clojure/
matrix_row.rs

1//! Clojure conformance matrix row.
2
3use sim_kernel::Symbol;
4use sim_lib_standard_core::{
5    LanguageRow, LanguageRowBuilder, SourceConformanceCase, SourceConformanceCaseKind,
6    SourceExpectation,
7};
8
9use crate::{clojure_core_profile, clojure_edn_reader_symbol, clojure_lowering_symbol};
10
11/// Builds the Clojure core matrix row.
12pub fn clojure_core_matrix_row() -> LanguageRow {
13    LanguageRowBuilder::new(Symbol::new("clojure"), clojure_core_profile())
14        .with_cases(clojure_core_source_cases())
15        .build()
16}
17
18/// Minimal source cases for the Clojure core matrix row.
19pub fn clojure_core_source_cases() -> Vec<SourceConformanceCase> {
20    vec![
21        SourceConformanceCase {
22            symbol: Symbol::qualified("test/clojure-core", "profile-declared"),
23            organ: clojure_edn_reader_symbol(),
24            source_name: "profile.sim".to_owned(),
25            source: "profile".to_owned(),
26            kind: SourceConformanceCaseKind::DescriptorOnly,
27            expectation: SourceExpectation::LowersTo(clojure_core_profile_display()),
28            affects_badge: Some(Symbol::qualified("standard", "partial")),
29        },
30        SourceConformanceCase {
31            symbol: Symbol::qualified("test/clojure-core", "runtime-gap"),
32            organ: clojure_lowering_symbol(),
33            source_name: "runtime-gap.clj".to_owned(),
34            source: "(eval '(+ 1 2))".to_owned(),
35            kind: SourceConformanceCaseKind::DescriptorOnly,
36            expectation: SourceExpectation::ExpectedGap {
37                code: Symbol::qualified("clojure", "runtime-gap"),
38                reason: "Clojure eval forms are outside the EDN profile row".to_owned(),
39            },
40            affects_badge: None,
41        },
42    ]
43}
44
45fn clojure_core_profile_display() -> String {
46    let profile = clojure_core_profile();
47    format!(
48        "profile:{} reader:{} lowering:{}",
49        profile.symbol, profile.reader, profile.lowering
50    )
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn clojure_core_matrix_row_language_symbol_is_clojure() {
59        let row = clojure_core_matrix_row();
60
61        assert_eq!(row.language, Symbol::new("clojure"));
62        assert!(!row.is_empty());
63        assert_eq!(row.cases.len(), 2);
64        assert!(matches!(
65            row.cases[0].expectation,
66            SourceExpectation::LowersTo(_)
67        ));
68        assert!(matches!(
69            row.cases[1].expectation,
70            SourceExpectation::ExpectedGap { .. }
71        ));
72    }
73}