% Extended test program. The listing of one (correct) extended test program, as well as the generated
% target code for that program and one or more example executions showing the correct functioning of
% the generated code.

As an example of a test program, we will look at a memoizing recursive fibonacci program. This program is well-suited because it contains I/O, variables, loops, functions, arrays, function references and closures. See \cref{test-example} for the source code and the text file \verb|doc/fibonacciRecursiveExample.iloc| for the generated ILOC. The compiled form is quite long, mostly because it heavily increments and decrements reference counts and does so in-line and without optimizations.\\
The program works by repeatedly asking for a number. If the user provides a positive number, it returns the value of the Fibonacci sequence at that position. If the user provides a zero or negative number, the program terminates. See \cref{test-example-runs} for a few runs of the program.

\begin{figure}
    \caption{Source code of \emph{fibonacciRecursive.boppi}}
    \label{test-example}
    \begin{minted}{boppi}
function (int)->int memoizedFib() {
    var int[] memo;
    memo := array(int, 50);

    function int fib(int n) {
        if n < 1 || n > 46 then
            0
        else
            if n < 2 then
                1
            else
                if memo[n] > 0 then
                    memo[n]
                else
                    memo[n] := fib(n-1)+fib(n-2)
                fi
            fi
        fi
    };
    fib
};

var (int)->int myFib;
myFib := memoizedFib();

var int n;
while read(n) > 0 do
    print(myFib(n))
od;
    \end{minted}
\end{figure}


\begin{figure}
    \caption{Examples of input and output on \emph{fibonacciRecursive}.}
    \label{test-example-runs}
    \begin{subfigure}{0.2\textwidth}
        \begin{minted}{boppi}
> 1
<<< 1
> 0
        \end{minted}
    \end{subfigure}
    \hfill
    \begin{subfigure}{0.2\textwidth}
        \begin{minted}{boppi}
> -5
        \end{minted}
    \end{subfigure}
    \hfill
    \begin{subfigure}{0.2\textwidth}
        \begin{minted}{boppi}
> 3
<<< 2
> 4
<<< 3
> 5
<<< 5
> 6
<<< 8
> 0
        \end{minted}
    \end{subfigure}
    \hfill
    \begin{subfigure}{0.2\textwidth}
        \begin{minted}{boppi}
> 46
<<< 1836311903
> 47
<<< 0
> -1337
        \end{minted}
    \end{subfigure}
\end{figure}
