Skip to content

Commit 1bcf870

Browse files
authored
Merge pull request #10 from BeyondMagic/testes
2 parents 4274bb2 + 94930c3 commit 1bcf870

File tree

12 files changed

+142
-1
lines changed

12 files changed

+142
-1
lines changed

docs/Guia - Projeto de um compilador.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,14 @@ Este guia apresenta etapas para a implementação prática de um compilador.
181181
5. Considerem a possibilidade de perda de um integrante depois da metade da disciplina: distribuam conhecimento e documentem o máximo possível para não perderem ritmo.
182182
6. Não se esqueçam de manter **folga no cronograma** para lidar com imprevistos (bugs complexos, prazos de outras disciplinas, feriados e eventos).
183183

184-
Esse planejamento é apenas um **exemplo** — cada equipe pode ajustá-lo conforme seu ritmo, desde que respeitem os marcos (P1, P2, entregas finais e entrevistas). O importante é manter a transparência e o comprometimento com as entregas, sempre priorizando a qualidade e a compreensão de cada parte do compilador.
184+
Esse planejamento é apenas um **exemplo** — cada equipe pode ajustá-lo conforme seu ritmo, desde que respeitem os marcos (P1, P2, entregas finais e entrevistas). O importante é manter a transparência e o comprometimento com as entregas, sempre priorizando a qualidade e a compreensão de cada parte do compilador.
185+
## Como rodar a suíte semântica
186+
187+
A suíte abrange testes de **pass** (C → Lua → execução) e **fail** (mensagens de erro semântico).
188+
Pré-requisitos: `lua` (5.4), `luac`, e o binário do compilador (`c2lua`).
189+
190+
### Passo a passo
191+
192+
1. Compile o `c2lua` (ou garanta que `./c2lua` existe):
193+
```bash
194+
make build

tests/run_semantic_tests.sh

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
5+
source "$ROOT_DIR/lib/test_utils.sh"
6+
7+
PASS_DIR="$ROOT_DIR/semantic/pass"
8+
FAIL_DIR="$ROOT_DIR/semantic/fail"
9+
TMP_DIR="${TMP_DIR:-$ROOT_DIR/../build/test-tmp}"
10+
mkdir -p "$TMP_DIR"
11+
12+
pass_count=0
13+
fail_count=0
14+
15+
echo "[Semantic] Rodando PASS (C -> Lua -> exec) ..."
16+
for cfile in "$PASS_DIR"/*.c; do
17+
[ -e "$cfile" ] || continue
18+
base="$(basename "$cfile" .c)"
19+
luafile="$PASS_DIR/$base.lua"
20+
outlua="$TMP_DIR/$base.out.lua"
21+
outlog="$TMP_DIR/$base.run.log"
22+
23+
# Compila C->Lua
24+
"$C2LUA" "$cfile" > "$outlua"
25+
26+
# Checa sintaxe Lua
27+
check_lua_syntax "$outlua"
28+
29+
# Executa Lua
30+
if ! "$LUA_BIN" "$outlua" > "$outlog" 2>&1; then
31+
echo "FAIL (exec): $base"
32+
cat "$outlog"
33+
((fail_count++)) || true
34+
continue
35+
fi
36+
37+
# Compara com Lua esperado (semântica igual)
38+
if ! diff_golden "$outlua" "$luafile"; then
39+
echo "FAIL (lua mismatch): $base"
40+
((fail_count++)) || true
41+
continue
42+
fi
43+
44+
echo "PASS: $base"
45+
((pass_count++)) || true
46+
done
47+
48+
echo
49+
echo "[Semantic] Rodando FAIL (erros devem coincidir com golden .err) ..."
50+
for cfile in "$FAIL_DIR"/*.c; do
51+
[ -e "$cfile" ] || continue
52+
base="$(basename "$cfile" .c)"
53+
errfile="$FAIL_DIR/$base.err"
54+
goterr="$TMP_DIR/$base.got.err"
55+
56+
# Espera falha: captura stderr e stdout
57+
set +e
58+
"$C2LUA" "$cfile" > /dev/null 2> "$goterr.raw"
59+
status=$?
60+
set -e
61+
62+
if [ $status -eq 0 ]; then
63+
echo "FAIL (esperava erro, compilou com sucesso): $base"
64+
((fail_count++)) || true
65+
continue
66+
fi
67+
68+
normalize_err < "$goterr.raw" > "$goterr"
69+
70+
if ! diff_golden "$goterr" "$errfile"; then
71+
echo "FAIL (mensagem diferente): $base"
72+
((fail_count++)) || true
73+
continue
74+
fi
75+
76+
echo "PASS (erro): $base"
77+
((pass_count++)) || true
78+
done
79+
80+
echo
81+
echo "Resumo: $pass_count PASS, $fail_count FAIL"
82+
exit $([ $fail_count -eq 0 ])

tests/semantic/COVERAGE.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Cobertura de Testes Semânticos
2+
3+
| Categoria/Construto | Casos | Coberto? |
4+
|-------------------------------------|-----------------------------------------|----------|
5+
| Atribuição (tipos compatíveis) | `pass/test_sum.c` ||
6+
| Atribuição (tipos incompatíveis) | `fail/invalid_type.c` ||
7+
| Escopo (símbolo não encontrado) | `fail/scope_error.c` ||
8+
| Retorno obrigatório em função | `fail/missing_return.c` ||
9+
| Chamadas a função | `pass/test_sum.c` ||
10+
| Soma/operadores aritméticos | `pass/test_sum.c` ||
11+
| Impressão/IO runtime | `pass/test_sum.c` ||
12+
| **Faltantes** | conversão implícita, short-circuit, etc ||
13+
14+
Legenda: ✅ coberto • ❌ pendente
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
int f(int a) {
2+
if (a > 0) return a;
3+
// falta return em outro ramo
4+
}
5+
6+
int main() { return 0; }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Erro [1:1]: controle: função 'f' (retorna int) pode sair sem return

tests/semantic/fail/scope_error.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
int main() {
2+
int x = 1;
3+
{ int y = 2; }
4+
y = 3; // fora do escopo
5+
return 0;
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Erro [4:3]: escopo: símbolo 'y' não encontrado

tests/semantic/fail/testes.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
int main() {
2+
int x = "hello";
3+
return 0;
4+
}

tests/semantic/fail/testes.err

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Erro [2:11]: tipo: atribuição int <- string não permitida

tests/semantic/pass/testes.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
int sum(int a, int b) { return a + b; }
2+
3+
int main() {
4+
int r = sum(1, 3);
5+
print_int(r); // assume que o runtime exporta print_int
6+
return 0;
7+
}

0 commit comments

Comments
 (0)