Este projeto é um motor offline para simular o ambiente de exames da 42 (ExamShell / Moulinette). Ele automatiza a entrega de enunciados, a compilação rigorosa (-Wall -Wextra -Werror) e a validação lógica e de memória, rodando localmente no seu terminal.
Para que o motor de avaliação funcione corretamente em ambientes Linux/UNIX:
gcc(GNU Compiler Collection)bash(Para os scripts orquestradores)- Utilitários padrão do sistema:
find,diff,timeout,cat
Para o motor funcionar, o seu ambiente local deve espelhar a estrutura abaixo. Os arquivos .sh são o motor (públicos), enquanto as pastas armazenam os dados (privados/locais).
examshell/
├── examshell.sh # Orquestrador da interface gráfica do terminal
├── grader.sh # Autograder, compilador e validador de memória
├── setup_perms.sh # Configurador de permissões de execução (inodes)
├── README.md # Esta documentação
├── .gitignore # Ignora as pastas de dados abaixo para evitar vazamentos
│
├── subject/ # (Você deve criar) Contém os textos dos enunciados
│ └── Level00/
│ └── bluff/
│ └── subject.txt
│
├── tests/ # (Você deve criar) Contém os gabaritos e injetores
│ └── bluff/
│ ├── expected.txt
│ └── run_test.sh (ou main.c)
│
├── rendu/ # (Gerada automaticamente) Sua mesa de trabalho
│ └── bluff/
│ └── bluff.c
│
└── traces/ # (Gerada automaticamente) Logs gerados em caso de falha lógica
└── bluff.trace
- Clone o repositório em sua máquina.
- Acesse a raiz do projeto pelo terminal.
- Crie as pastas de dados que o
.gitignoreoculta (mkdir subject tests). - Ative as permissões de execução: O sistema operacional precisa de permissão para rodar os binários. Execute uma única vez:
bash setup_perms.sh
- Inicie o motor:
./examshell.sh
- O script limpará a tela, sorteará um desafio do nível atual e travará o terminal exibindo o enunciado.
- Abra uma nova aba no terminal. Navegue até o diretório indicado (ex:
./rendu/nome_do_exercicio/), crie o seu arquivo.ce resolva o problema. - Na aba do simulador, digite
grademepara disparar a compilação e os testes. - Se passar, o simulador avançará. Se falhar, você poderá tentar novamente.
Para que o orquestrador e o autograder reconheçam novos desafios, você precisa alimentar as pastas subject/ e tests/.
Crie a estrutura: subject/LevelXX/nome_do_exercicio/subject.txt. O conteúdo de subject.txt será impresso na tela do simulador.
Crie a estrutura: tests/nome_do_exercicio/. Dentro dela, você precisa de dois arquivos:
expected.txt: O arquivo contendo a saída exata (o gabarito) que o programa deve imprimir no terminal.- A Estratégia de Avaliação: O motor suporta dois tipos de exercícios:
- Estratégia A (Programa Completo): Se o exercício pede um
int main, crie um arquivo chamadorun_test.sh. Este script será acionado pelo motor para executar o seu binário gerado (Ex:./$1ou./$1 "teste"). - Estratégia B (Apenas Função): Se o exercício pede apenas uma função (ex:
void ft_putchar(char c)), crie um arquivomain.cchamando a função do aluno. O motor fará a linkagem estática automaticamente.
- Estratégia A (Programa Completo): Se o exercício pede um
Se o seu código compilar perfeitamente, mas a lógica falhar, o motor gerará um arquivo na pasta ./traces/nome_do_exercicio.trace usando o formato Unified Diff.
Ele mapeia a memória e exibe no terminal: o sinal - indica o gabarito esperado, e o + indica a divergência que o seu código imprimiu..