From 1a4c5748e883bcffcfb9e2ee2866d6492dde4093 Mon Sep 17 00:00:00 2001 From: Bappoz Date: Wed, 24 Jun 2026 02:02:21 -0300 Subject: [PATCH] =?UTF-8?q?feat(examples):=20adicionar=20programa-demo=20p?= =?UTF-8?q?ara=20a=20apresenta=C3=A7=C3=A3o=20final?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adiciona src/examples/demo_presentation.c com um programa curto que combina variaveis/expressoes, funcao recursiva (factorial) e controle de fluxo (if/while), dentro do subconjunto estavel do backend atual (sem struct/ponteiro/switch, ainda nao suportados no codegen). Documenta a saida esperada (exit code 80) no cabecalho do arquivo e adiciona um smoke test (smoke_presentation_demo_runs) que compila e executa o exemplo de ponta a ponta via gcc, garantindo que ele continue funcionando com o pipeline atual. Resolve #163 --- src/examples/demo_presentation.c | 39 ++++++++++++++++++++++++++++++++ tests/exe_smoke_test.rs | 17 ++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/examples/demo_presentation.c diff --git a/src/examples/demo_presentation.c b/src/examples/demo_presentation.c new file mode 100644 index 0000000..540f172 --- /dev/null +++ b/src/examples/demo_presentation.c @@ -0,0 +1,39 @@ +/* + * Programa-demo para a apresentação final (issue #163). + * + * Mostra, em poucas linhas, os recursos centrais já estáveis do + * subconjunto de C suportado pelo compilador: + * - variaveis e expressoes aritmeticas + * - funcoes com chamada recursiva (factorial) + * - controle de fluxo: if/else e while + * + * Saida esperada: exit code 80 + * factorial(4) = 24 + * sum_even_squares(6) = 2*2 + 4*4 + 6*6 = 56 + * 24 + 56 = 80 + */ + +int factorial(int n) { + if (n <= 1) { + return 1; + } + return n * factorial(n - 1); +} + +int sum_even_squares(int n) { + int total = 0; + int i = 1; + while (i <= n) { + if (i % 2 == 0) { + total = total + i * i; + } + i = i + 1; + } + return total; +} + +int main(void) { + int fact4 = factorial(4); + int squares = sum_even_squares(6); + return fact4 + squares; +} diff --git a/tests/exe_smoke_test.rs b/tests/exe_smoke_test.rs index 63d4f45..9bbaf5d 100644 --- a/tests/exe_smoke_test.rs +++ b/tests/exe_smoke_test.rs @@ -141,3 +141,20 @@ fn smoke_function_call_runs() { #[cfg(unix)] assert_eq!(status.code(), Some(42)); } + +/// Garante que o programa-demo da apresentação final (issue #163), em +/// `src/examples/demo_presentation.c`, continua compilando e produzindo o +/// exit code documentado no cabeçalho do arquivo. +#[test] +fn smoke_presentation_demo_runs() { + require_gcc!(); + + let path = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("src/examples/demo_presentation.c"); + let source = std::fs::read_to_string(&path) + .unwrap_or_else(|e| panic!("falha ao ler '{}': {e}", path.display())); + + let status = compile_and_run("presentation_demo", &source); + + #[cfg(unix)] + assert_eq!(status.code(), Some(80)); +}