Skip to main content

sim_lib_lang_matrix/
lib.rs

1#![forbid(unsafe_code)]
2#![deny(missing_docs)]
3//! Assembly point for the SIM language conformance matrix.
4
5use sim_lib_lang_cl::cl_lite_matrix_row;
6use sim_lib_lang_clojure::clojure_core_matrix_row;
7use sim_lib_lang_islisp::islisp_matrix_row;
8use sim_lib_lang_julia::julia_core_matrix_row;
9use sim_lib_lang_lua::lua_core_matrix_row;
10use sim_lib_lang_prolog::prolog_matrix_row;
11use sim_lib_lang_ruby::ruby_dsl_matrix_row;
12use sim_lib_lang_scheme::r7rs_small_matrix_row;
13use sim_lib_lang_typed_lazy::typed_lazy_matrix_row;
14use sim_lib_standard_core::ConformanceMatrix;
15
16/// Builds the complete runtime language conformance matrix.
17pub fn language_matrix() -> ConformanceMatrix {
18    let mut matrix = ConformanceMatrix::new();
19    matrix.register(r7rs_small_matrix_row());
20    matrix.register(cl_lite_matrix_row());
21    matrix.register(clojure_core_matrix_row());
22    matrix.register(islisp_matrix_row());
23    matrix.register(julia_core_matrix_row());
24    matrix.register(lua_core_matrix_row());
25    matrix.register(ruby_dsl_matrix_row());
26    matrix.register(typed_lazy_matrix_row());
27    matrix.register(prolog_matrix_row());
28    matrix
29}
30
31#[cfg(test)]
32mod tests {
33    use std::collections::BTreeSet;
34
35    use sim_kernel::Symbol;
36
37    use super::*;
38
39    #[test]
40    fn language_matrix_has_exactly_nine_rows() {
41        let matrix = language_matrix();
42
43        assert_eq!(matrix.language_count(), 9);
44    }
45
46    #[test]
47    fn language_matrix_has_no_duplicate_row_names() {
48        let matrix = language_matrix();
49        let names: Vec<_> = matrix
50            .iter_rows()
51            .map(|row| row.language.to_string())
52            .collect();
53        let unique: BTreeSet<_> = names.iter().cloned().collect();
54
55        assert_eq!(unique.len(), names.len());
56    }
57
58    #[test]
59    fn language_matrix_rows_are_populated() {
60        let matrix = language_matrix();
61
62        for language in [
63            "scheme",
64            "common-lisp",
65            "clojure",
66            "islisp",
67            "julia",
68            "lua",
69            "ruby",
70            "typed-lazy",
71            "prolog",
72        ] {
73            let row = matrix
74                .row(&Symbol::new(language))
75                .unwrap_or_else(|| panic!("{language} row must be registered"));
76            assert!(!row.is_empty(), "{language} row must have cases");
77        }
78    }
79}