Skip to main content

sim_lib_lang_python/
matrix_row.rs

1use crate::python_core_profile;
2use sim_kernel::Symbol;
3use sim_lib_standard_core::{
4    LanguageRow, LanguageRowBuilder, SourceConformanceCase, SourceConformanceCaseKind,
5    SourceExpectation,
6};
7
8/// Build the Python core conformance row from source-level cases.
9pub fn python_core_matrix_row() -> LanguageRow {
10    LanguageRowBuilder::new(Symbol::new("python"), python_core_profile())
11        .with_cases(python_core_source_cases())
12        .build()
13}
14
15/// Checked source cases entering through `codec/python`.
16pub fn python_core_source_cases() -> Vec<SourceConformanceCase> {
17    [
18        ("scalar-flow", "answer = 0\nfor n in range(7):\n    if n % 2:\n        answer = answer + n\nanswer\n", "9"),
19        ("closure", "def counter(start: int):\n    value = start\n    def step(delta: int = 1):\n        nonlocal value\n        value = value + delta\n        return value\n    return step\nf = counter(40)\nf() + f()\n", "83"),
20        ("containers", "values = [1, 2, 3]\nindex = {'answer': values[0] + values[1] + values[2]}\nindex['answer']\n", "6"),
21        ("objects-c3-descriptors-super", "class Root:\n    answer = 40\nclass Add(Root):\n    @property\n    def value(self): return super().answer + 2\nAdd().value\n", "42"),
22        ("exception-context-cleanup", "try:\n    raise ValueError('root')\nexcept ValueError as cause:\n    try:\n        raise RuntimeError('outer') from cause\n    finally:\n        answer = 42\nanswer\n", "42"),
23        ("generator-send-close", "def values():\n    item = yield 1\n    try:\n        yield item\n    finally:\n        cleanup = 42\ng = values()\nnext(g)\ng.send(42)\ng.close()\ncleanup\n", "42"),
24        ("structural-match-sequence-guard", "match [40, 2]:\n    case [left, right] if right == 2:\n        answer = left + right\nanswer\n", "42"),
25        ("source-module", "from supplied import answer\nanswer\n", "42"),
26        ("authorized-dynamic-eval", "eval('40 + 2')\n", "42"),
27        ("authorized-dynamic-exec", "exec('answer = 42')\nanswer\n", "42"),
28    ].into_iter().map(|(name, source, expected)| SourceConformanceCase {
29        symbol: Symbol::qualified("test/python-core", name),
30        organ: Symbol::qualified("codec", "python"),
31        source_name: format!("{name}.py"), source: source.to_owned(),
32        kind: SourceConformanceCaseKind::Observed,
33        expectation: SourceExpectation::LowersTo(expected.to_owned()), affects_badge: None,
34    }).collect()
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    #[test]
41    fn row_is_source_backed() {
42        let row = python_core_matrix_row();
43        assert_eq!(row.language, Symbol::new("python"));
44        assert_eq!(row.cases.len(), 10);
45        assert!(
46            row.cases
47                .iter()
48                .all(|case| case.organ == Symbol::qualified("codec", "python"))
49        );
50    }
51}