sim_lib_lang_python/
matrix_row.rs1use crate::python_core_profile;
2use sim_kernel::Symbol;
3use sim_lib_standard_core::{
4 LanguageRow, LanguageRowBuilder, SourceConformanceCase, SourceConformanceCaseKind,
5 SourceExpectation,
6};
7
8pub 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
15pub 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}