whiley_test_file 0.6.2

An API for manipulating test files for the Whiley Programming Language.
Documentation
======
>>> main.whiley
// Test extracted from Minesweeper
type uint is (int x) where x >= 0

type Board is {
   bool[] squares,     // Array of squares making up the board
   uint width,         // Width of the game board (in squares)
   uint height         // Height of the game board (in squares)
} where width*height == |squares|

/**
 * Return maximum of two integer variables
 */
property max(int a, int b) -> (int r):
    //
    if a < b:
        return b
    else:
        return a

/**
 * Return minimum of two integer variables
 */
property min(int a, int b) -> (int r):
    //
    if a > b:
        return b
    else:
        return a

function determineRank(Board b, uint col, uint row) -> uint
requires col < b.width && row < b.height:
    uint rank = 0
    // Calculate the rank
    for r in max(0,row-1) .. min(b.height,row+2):
        for c in max(0,col-1) .. min(b.width,col+2):
            bool sq = get_square(b,(uint) c, (uint) r)
            if sq:
                rank = rank + 1
    //
    return rank

// Return the square on a given board at a given position
export function get_square(Board b, uint col, uint row) -> bool
// Ensure arguments within bounds
requires col < b.width && row < b.height:
    int rowOffset = b.width * row // calculate start of row
    assume rowOffset >= 0
    assume rowOffset <= |b.squares|-b.width
    return b.squares[rowOffset + col]

public export method test():
   Board b = {width:3, height: 3, squares: [
              false,false,true,
              false,false,false,
              true,false,true]}
   assume determineRank(b,0,0) == 0
   assume determineRank(b,0,1) == 1
   assume determineRank(b,0,2) == 1
   //
   assume determineRank(b,1,0) == 1
   assume determineRank(b,1,1) == 3
   assume determineRank(b,1,2) == 2
   //
   assume determineRank(b,2,0) == 1
   assume determineRank(b,2,1) == 2
   assume determineRank(b,2,2) == 1
---