Compiling and Testing Your Code
Each student’s repository contains a global dune-project
file and
one dune
file in every directory that contains source code. These
are configuration files to ease compiling your code and unit-testing
it. It is based on the Dune tool helping you
to build executables, libraries, run tests, and much more with
OCaml
. We’ll be describing the main command-lines you can use
within a unix system where OCaml
and Dune
have been properly
installed. For steps to make a Windows or a linux distribution
configuration of needed dependencies through opam
please visit the
Frequently Asked Questions.
You’ll have enough insight going through the quickstart page of the Dune
documentation you can find here. For any in-depth use of
Dune
you’re advised to have a look at the rest of the offical documentation.
For testing purposes you might want to have a look at the Alcotest
documentation : Alcotest.
Danger
If you do not understand what you’re doing DO NOT modify your
dune-project
or dune
files without backing it up. Such a
change might compromise your project compilation process. Know that
your code will be graded using our own versions of these files, if
you count on a modified build configuration to work out with
grading process : you are mistaken.
Table of Contents
Compiling Your Project
You’re having a dune-project
file at the root of your
repository. This is the entry point for the configuration files meant
to set the scope of your project. Every other dune
file contains
information about what source files should be compiled, how, and with
what dependencies.
Contrary to a lot of (more elaborate) projects, there is no need for a configuration step, you can directly compile your project using the command:
dune build
from within the root of your project repository. This will create a _build/
directory containing a copy of your source files and their respective
compilation products.
Danger
We advise you to never modify the source files within that _build/
directory, these files will be overwritten by the “real” ones (those in
Source/
) every time you do a build or clean command.
If at any time you need to get rid of this _build/
folder and the
compilation products (to do a fresh and complete new build for example), you can
issue the following command:
dune clean
Testing Your Project
From The Shell
Each repository comes with a number of unit tests included within the
tests
folders of each one of the project’s phases. These are
written using the Alcotest
testing library provided for
OCaml
. You are welcome to add your own tests there if you
understand what you are doing, but a lot of them are already given to
you.
You can the whole test suite you’re given by simply typing the command:
dune runtest
This shall run three test suites: one for the Builtin part of the project, one for the Scalable part and one for the Zarithing part (for which tests are empty!). You will see three lists of tests: one for each one of those parts. In these lists, each line corresponds to one function and has four columns:
the first column is the function’s tests result (
[OK]
if all the tests passed,[ERROR]
if at least one did not, and something else in other, more specific, cases)the second column is the name of the module in which the function is
the third column is the number of the function within that module
the fourth and last column is a short description of the tested function
Below this list, if some tests failed, you will see a description of the first few failed tests and the path of the file that contains the detailed results of this module’s tests.
If you only wish to run the tests of one of the three parts of that project, you can restrict the tests ran by Dune by giving it the folder you wish to test. For example, to only run the tests of the Builtin part of the project, you can issue:
dune runtest Source/builtin
If you want to further restrict what’s ran and you only want to run the tests of a single source file, you can directly run the test executable and give it the name of the module you wish to test (each source file is a module).
There are two ways of doing that: either you execute that file
directly after finding it in the _build
directory. For example if
you only wish to run the basic_arithmetics.ml tests from the
Builtin part of the project you can type (don’t forget the starting
dot):
./_build/default/Source/tests/builtin/run_tests.exe test basic_arithmetics
or you can ask dune to find and run it itself by giving it the executable’s expected location relative to the source directory:
dune exec Source/tests/builtin/run_tests.exe test basic_arithmetics
In this case you’ll see that the whole test list is still displayed, but every
test you didn’t specify is marked as [SKIP]
.
From within Emacs
You can test your functions from within the OCaml top-level available while
being in emacs
tuareg-mode
.
While being in the builtin
directory you can evaluate each one of
the expressions of the builtin.ml
file in the ocaml top-level
interpreter by using the C-c C-e
shortcut. In order to evaluate
the whole current buffer you can use the C-c C-b
shortcut. To
evaluate the builtin.ml
file without necessarily opening it you
can use the top-level
directive:
#use "builtin.ml"
All available function within the builtin.ml
file are then
available within top-level
.
The previous strategy is going to raise an error if you try evaluating
the file basic_arithmetics.ml
. You’ll get an error specifying that
the Builtin
module is not bounded. This error says the
top-level
environment cannot see any Builtin
module to open ;
the basic_arithmetics.ml
file starts by openning that module
(which corresponds to file builtin.ml
). For top-level
to
evaluate the open Builtin
instruction you need to load
builtin.ml
as a module in top-level
using the directive:
#mod_use "builtin.ml"
You can then evaluate basic_arithmetics.ml
using the directive:
#use "basic_arithmetics.ml"
In order to evaluate any given file file.ml
in top-level
you’ll generally need to load the modules it opens through open
instructions using #mod_use
directive. You’re invited to ask your
lab assistants for help if needed.