Trabalho de Paradigmas de Linguagens de Programação (ULBRA) - Grupo 5: Simulador de Frota de Veículos em Smalltalk/Pharo, com testes SUnit e CI
# Grupo 5 · Smalltalk · Simulador de Frota de Veículos Integrantes: Lucas Gabriel, Yuri Soares, Ricardo Francisco, Caio Dias, Kaio ## Arquivos e pastas ``` ULBRA-SmallTalk/ ├── Abrir-Pharo-Grupo5.bat abre o Pharo pronto para a apresentação ├── FrotaVeiculos.st arquivo de entrega (GERADO pelo build: não edite à mão) ├── Smalltalk_Grupo5.pptx slides (20), com notas do apresentador ├── README.md este guia ├── src/ código-fonte no formato Tonel (um arquivo por classe) │ ├── BaselineOfGrupo5FrotaVeiculos/ diz ao Metacello quais pacotes carregar e em que ordem │ ├── Grupo5-FrotaVeiculos/ Veiculo, Carro, Caminhao e SimuladorFrota │ └── Grupo5-FrotaVeiculos-Tests/ testes SUnit (VeiculoTest, CarroTest, CaminhaoTest, SimuladorFrotaTest) ├── scripts/ │ ├── testar.bat roda os testes numa cópia da imagem │ ├── build.bat testa, gera o FrotaVeiculos.st e atualiza a imagem │ ├── carregar.st / testar.st / build.st as etapas do pipeline, em Smalltalk │ └── cabecalho-FrotaVeiculos.txt comentário de cabeçalho do .st gerado ├── .github/workflows/ci.yml CI: roda os testes no GitHub a cada push ├── .smalltalk.ston configuração do smalltalkCI (usada pelo CI) └── Pharo/ Pharo 13.1 portátil com o código carregado (fora do Git) ``` | Arquivo | O que é | |---|---| | `Smalltalk_Grupo5.pptx` | Slides (20), com notas do apresentador em cada um | | `FrotaVeiculos.st` | Código do programa (entregar no ambiente AULA) | ## Como executar (testado no Pharo 13.1) **Jeito rápido:** dois cliques em `Abrir-Pharo-Grupo5.bat`. O Pharo abre com o código carregado, o Playground à esquerda (comandos já digitados) e o Transcript à direita. Deixe o cursor em `SimuladorFrota executar` e aperte **Ctrl+D**. **Em outro computador (Pharo Launcher):** 1. Instale o **Pharo Launcher** (https://pharo.org/download), crie uma imagem **Pharo 13** e clique em *Launch*. 2. Abra **Browse → Playground** e **Browse → Transcript**. 3. No Playground, digite a linha abaixo (com o caminho real do arquivo), selecione e aperte **Ctrl+D**: ```smalltalk 'C:\Users\SEU_USUARIO\Documents\Grupo5-Smalltalk\FrotaVeiculos.st' asFileReference fileIn ``` 4. Rode a simulação (**Ctrl+D**). A saída aparece no Transcript: ```smalltalk SimuladorFrota executar ``` Teste extra ao vivo (cascata, valores escolhidos na hora): ```smalltalk (Carro modelo: 'Gol') abastecer: 30; acelerar: 60; exibirEstado ``` ## Fluxo de trabalho (para alterar o código) O código-fonte oficial fica em `src/`. O `FrotaVeiculos.st` é gerado a partir dele. 1. Edite as classes em `src/` (ou no System Browser do Pharo e depois exporte para `src/`). 2. Rode `scripts\testar.bat`: carrega `src/` numa cópia da imagem e roda os testes SUnit. 3. Com o Pharo **fechado**, rode `scripts\build.bat`, que executa o pipeline completo: carregar → testar → gerar `FrotaVeiculos.st` → atualizar `Pharo\image\Grupo5.image`. - O build roda numa cópia temporária. Se algum teste falhar, nada é alterado. - A versão anterior da imagem fica em `Pharo\image\anterior\`, para voltar atrás se precisar. Para carregar o projeto numa imagem Pharo qualquer (é o que o CI faz): ```smalltalk Metacello new baseline: 'Grupo5FrotaVeiculos'; repository: 'tonel://C:/caminho/ULBRA-SmallTalk/src'; load. ``` ## Testes 23 testes SUnit em `Grupo5-FrotaVeiculos-Tests`. Cada pilar tem testes próprios: - **Encapsulamento**: valores inválidos são recusados (`abastecer: -10`, tanque cheio, carga de 35 t, distância negativa) e não existe `combustivel:` para alterar o estado de fora. - **Herança**: `Carro` e `Caminhao` são subclasses de `Veiculo` e usam o `abastecer:` herdado. - **Polimorfismo**: a mesma mensagem `acelerar: 120` gasta 10 L no carro e 60 L no caminhão carregado. - **Roteiro**: `SimuladorFrota executar` termina no mesmo estado mostrado no slide da demonstração. No Pharo, os testes também rodam pelo **Test Runner** (menu Browse), no pacote `Grupo5-FrotaVeiculos-Tests`. ## Integração contínua Com o projeto num repositório GitHub, o workflow `.github/workflows/ci.yml` usa o [smalltalkCI](https://github.com/hpi-swt/smalltalkCI) para baixar um Pharo 13 limpo, carregar a Baseline e rodar os testes a cada push e pull request. ## Estrutura do código - `Veiculo`: superclasse **abstrata** (`Veiculo isAbstract` → `true`) com `modelo`, `combustivel`, `quilometragem` e `capacidadeTanque`. Define `abastecer:` e `exibirEstado`. O `acelerar:` é **abstrato** (`subclassResponsibility`). O `printOn:` faz o *Print it* e o Inspector mostrarem o estado do veículo. - `Carro`: subclasse. `initialize` define tanque de 50 L. `acelerar:` gasta 1 L a cada 12 km. - `Caminhao`: subclasse com o atributo `carga`. `initialize` define tanque de 300 L. `acelerar:` gasta 1 L a cada 4 km (vazio) ou a cada 2 km (carregado). O limite de carga fica em um só lugar: `Caminhao cargaMaxima` (20 t). - `SimuladorFrota executar`: roteiro da demonstração. Cada etapa é um método (`passo1InstanciarObjetos` … `passo7EstadoFinal`), e o `executar` devolve o simulador com a frota no estado final. Pilares: - **Encapsulamento**: atributos privados. Só existem métodos de leitura, e toda alteração passa por métodos que validam (`abastecer:`, `carregar:` e `acelerar:`). - **Herança**: `Carro` e `Caminhao` herdam atributos e métodos de `Veiculo` e usam `super initialize`. - **Polimorfismo**: a mesma mensagem `acelerar:` tem uma implementação em cada subclasse. ## Sugestão de divisão (20 min, todos apresentam) | Integrante | Slides | Conteúdo | |---|---|---| | Lucas Gabriel | 1–4 | Abertura, roteiro, histórico | | Yuri Soares | 5–8 | Paradigma, características e critérios | | Ricardo Francisco | 9–11 | Sintaxe e semântica | | Kaio | 12–14 | Abstração, amarração, compilação/interpretação | | Caio Dias | 15–20 | Programa, 3 pilares, demonstração ao vivo e conclusão | Dica: leiam as **notas do apresentador** de cada slide e expliquem com as próprias palavras. Quem só lê o slide faz o grupo perder 0,3 ponto.