# Test driven development (TDD)

The suggested technique for bruijn development is the TDD method. When
creating functions, we suggest the following procedure:

-   Write a comment, a type signature, and the head of the function

``` bruijn
# returns the item at index in a list, starting from 0
index y [[[rec]]] ⧗ (List a) → Number → a
```

-   Write several tests including edge cases

``` bruijn
# returns the item at index in a list, starting from 0
index y [[[rec]]] ⧗ (List a) → Number → a

:test (empty !! (+0)) (empty)
:test ({}(+1) !! (+0)) ((+1))
:test (((+1) : ((+2) : {}(+3))) !! (+0)) ((+1))
:test (((+1) : ((+2) : {}(+3))) !! (+2)) ((+3))
:test (((+1) : ((+2) : {}(+3))) !! (-1)) (empty)
:test (((+1) : ((+2) : {}(+3))) !! (+3)) (empty)
```

-   Finish the implementation until all tests pass (e.g. using the
    [`:watch`{.bruijn} repl command](REPL.md#watch))
-   Refactor and clean up the definition

``` bruijn
# returns the item at index in a list, starting from 0
index y [[[rec]]] ⧗ (List a) → Number → a
    rec 0 [[[case-index]]] case-end
        case-index =?4 2 (5 --4 1)
        case-end empty

:test (empty !! (+0)) (empty)
:test ({}(+1) !! (+0)) ((+1))
:test (((+1) : ((+2) : {}(+3))) !! (+0)) ((+1))
:test (((+1) : ((+2) : {}(+3))) !! (+2)) ((+3))
:test (((+1) : ((+2) : {}(+3))) !! (-1)) (empty)
:test (((+1) : ((+2) : {}(+3))) !! (+3)) (empty)
```