Testar na track de Haskell

Aprende a testar os teus exercícios de Haskell no Exercism


Correr os testes

Executa o seguinte comando no diretório do teu exercício para correr os testes:

stack test

Para correr os testes sempre que guardares um ficheiro, usa antes este comando:

stack test --file-watch

Se receberes uma mensagem de erro como esta...

No .cabal file found in directory

Provavelmente estás a usar uma versão antiga do stack e precisas de a atualizar.

Caso contrário, se receberes uma mensagem de erro como esta...

No compiler found, expected minor version match with...
Try running "stack setup" to install the correct GHC...

Basta fazer o que diz e ele vai descarregar e instalar a versão correta do compilador:

stack setup

Resolver o exercício

Uma solução para um exercício é um módulo Haskell. O nome do módulo é definido numa instrução de importação no conjunto de testes, normalmente no início:

import Test.Hspec        (Spec, describe, it, shouldBe)
import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith)

import ModuleName (someFunc)

main :: IO ()
main ...

Neste exemplo, o ficheiro de testes importa, na linha 4, um módulo chamado ModuleName, que exporta uma função chamada someFunc. Isto significa que tens de criar um ficheiro chamado ModuleName.hs que seria algo como isto:

module ModuleName (someFunc) where

someFunc :: ...
someFunc ...

Vais encontrar um ficheiro com este nome já disponível em src/, que podes usar como ponto de partida para a tua solução.

Tem apenas em conta que este stub está aí só para te ajudar a começar. Sente-te à vontade para o alterar por completo se achares que é o que deves fazer.

Usar pacotes

Se quiseres usar alguns pacotes para escrever uma solução mais elegante, começa por adicionar os pacotes às dependências da tua solução no package.yaml:

library:
  exposed-modules: ModuleName
  source-dirs: src
  dependencies:
    - foo
    - bar

Enquanto trabalhas localmente, podes usar os pacotes que quiseres. O executor de testes online, no entanto, só tem acesso a um conjunto limitado de pacotes. Os pacotes disponíveis são

  • os que vêm pré-instalados com o GHC (nomeadamente base, containers, array, time, mtl, deepseq, exceptions, bytestring), mais
  • os que estão pré-compilados para o executor de testes, listados em haskell-test-runner/pre-compiled/package.yaml.

Se submeteres uma solução que usa um pacote que não está disponível, o executor de testes vai deparar-se com a falta de acesso à internet e produzir um erro parecido com este:

Cabal file info not found for unavailable-package-1.0@..., updating
Selected mirror https://hackage.haskell.org/
Downloading root
HttpExceptionRequest Request {
  host                 = "hackage.haskell.org"
  ...
}
 (ConnectionFailure ...)

Correr o GHCi

Se quiseres experimentar a tua solução no GHCi, basta correr este comando:

stack ghci

HLint (opcional)

Recomenda-se vivamente que corras o hlint na tua solução para ver se deteta algo que te está a escapar:

hlint ModuleName.hs

Não tens de aceitar todas as sugestões dadas pelo hlint, mas normalmente ajudam-te a aprender a escrever código Haskell bonito e idiomático.