Cómo probar en el track de Fortran

Aprende a probar tus ejercicios de Fortran en Exercism


Cada ejercicio incluye los tests unitarios y una receta de compilación de CMake. Tú te encargas de la implementación. Cada fichero de tests debe enlazarse con tu implementación para producir un ejecutable de consola que ejecute los tests. Al ejecutar el ejecutable de tests, se imprimen mensajes para cada test que falla y se informa de un estado de salida distinto de cero cuando fallan los tests.

El fichero de tests tendrá el nombre <exercise>_test.f90, así que, para el ejercicio «Bob», el fichero que contiene los tests es bob_test.f90. Cada test tendrá un comentario que lo describe y, a continuación, el test propiamente dicho, que empieza por call assert_equal. Por ejemplo:

  ! Test 16: non-letters with question
  call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Para desactivar un test, basta con comentarlo con un '!'. Por ejemplo:

  ! Test 16: non-letters with question
  ! call assert_equal("Sure.", hey(":) ?"), "non-letters with question")

Trabajar cada ejercicio es un proceso que consiste en:

  • Crear la compilación inicial con CMake
  • Para cada test unitario:
    • Resolver los errores de compilación para que el test falle.
    • Implementar lo justo para que el test pase.
    • Refactorizar tu implementación para mejorar la legibilidad, reducir la duplicación, etc.
    • Descomentar el siguiente test

Crear la compilación inicial con CMake

Cada ejercicio incluirá un fichero CMakeLists.txt junto con los tests unitarios. Contiene la receta predefinida de CMake que se encarga de la compilación por ti. No deberías necesitar editar este fichero. La receta proporcionada da por hecho que tu implementación está en un fichero de código fuente con el nombre del ejercicio.

Por ejemplo, el ejercicio «Bob» espera una implementación en el fichero bob.f90.

Crea los ficheros de tu implementación inicial antes de ejecutar CMake. Si no tienes el fichero bob.f90 cuando ejecutas CMake para el ejercicio «Bob», CMake generará un error indicando que no se encuentran los ficheros. Estos ficheros pueden estar vacíos, pero deben existir.

Con esta receta, CMake puede generar un proyecto adecuado para tu entorno ejecutando cmake -G con un generador adecuado y la ubicación del directorio del ejercicio. CMake generará un script de compilación apropiado para tu sistema operativo. Para mantener esos ficheros generados separados del código fuente de tu ejercicio, es habitual crear un directorio llamado build que contenga tanto los ficheros de compilación generados como el código compilado.

Así mantendrás la carpeta de tu ejercicio ordenada y despejada.

**Nota: la primera vez que se llama a cmake, se descargará testlib automáticamente. Se necesita testlib para que funcionen los tests unitarios.

Como vas a ejecutar CMake para crear las instrucciones de compilación de cada tarea, quizá te venga bien crear un script de bash (Linux/MacOS) o un archivo por lotes (Windows) para este comando.

Una vez que CMake haya creado el entorno de compilación, puedes compilar tu código con el comando adecuado para tu entorno:

  • Linux con make: make
  • Windows con Visual Studio: selecciona Build / Build Solution en el menú.
  • Windows con MingW: mingw32-make.exe
  • Windows con nMake: nmake.exe
  • MacOS con Xcode: selecciona Build en la barra de herramientas

A continuación se muestran ejemplos de cómo ejecutar CMake en distintos entornos.

Linux\MacOS con Make

El nombre del generador para CMake es Unix Makefiles. Suponiendo que el ejercicio actual es bob y que estamos en la carpeta del ejercicio:

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make

Este ejemplo muestra cómo crear ficheros vacíos para la implementación antes de ejecutar CMake.

Basta con escribir make en el directorio build para compilar los tests. Esto debería generar errores en tiempo de compilación. Una vez corregidos los errores, ejecuta make de nuevo. Cuando hayas corregido todos los errores de compilación, ejecuta los tests:

$ ctest -V

Windows con Visual Studio 2017

El nombre del generador para CMake es Visual Studio 15. El mismo generador es compatible con todas las ediciones IDE de Visual Studio 2017: Community, Professional y Enterprise. Suponiendo que el ejercicio actual es bob y que estamos en la carpeta del ejercicio:

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "Visual Studio 15" ..

Este ejemplo muestra cómo crear ficheros vacíos para la implementación antes de ejecutar CMake.

Windows con MingW

El nombre del generador para CMake es MinGW Makefiles. Suponiendo que el ejercicio actual es bob y que estamos en la carpeta del ejercicio:

> copy nul: bob.f90
> mkdir build
> cd build
> cmake -G "MinGW Makefiles" ..

Este ejemplo muestra cómo crear ficheros vacíos para la implementación antes de ejecutar CMake.

Basta con escribir make en el directorio build para compilar los tests. Esto debería generar errores en tiempo de compilación. Una vez corregidos los errores, ejecuta make de nuevo. Cuando hayas corregido todos los errores de compilación, ejecuta los tests:

MacOS con Xcode

El nombre del generador para CMake es Xcode. Suponiendo que el ejercicio actual es bob y que estamos en la carpeta del ejercicio:

$ touch bob.f90
$ mkdir build
$ cd build
$ cmake -G Xcode ..

Este ejemplo muestra cómo crear ficheros vacíos para la implementación antes de ejecutar CMake.

Basta con escribir make en el directorio build para compilar los tests. Esto debería generar errores en tiempo de compilación. Una vez corregidos los errores, ejecuta make de nuevo. Cuando hayas corregido todos los errores de compilación, ejecuta los tests:

$ ctest -V

Testlib

Los tests dependen de una pequeña biblioteca llamada testlib, que se descarga de GitHub la primera vez que se configura la compilación con CMake.

Si la descarga falla, se puede hacer manualmente. Por ejemplo:

mkdir testlib
cd testlib
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/CMakeLists.txt
wget https://raw.githubusercontent.com/exercism/fortran/master/testlib/TesterMain.f90