whiley_test_file 0.6.2

An API for manipulating test files for the Whiley Programming Language.
Documentation
original.name="Complex_Valid_2"
======
>>> main.whiley
type string is int[]

final PieceKind PAWN = 0
final PieceKind KNIGHT = 1
final PieceKind BISHOP = 2
final PieceKind ROOK = 3
final PieceKind QUEEN = 4
final PieceKind KING = 5
final int[] PIECE_CHARS = ['P', 'N', 'B', 'R', 'Q', 'K']

type PieceKind is (int x) where PAWN <= x && x <= KING
type Piece is {bool colour, PieceKind kind}

final Piece WHITE_PAWN = {colour: true, kind: PAWN}
final Piece WHITE_KNIGHT = {colour: true, kind: KNIGHT}
final Piece WHITE_BISHOP = {colour: true, kind: BISHOP}
final Piece WHITE_ROOK = {colour: true, kind: ROOK}
final Piece WHITE_QUEEN = {colour: true, kind: QUEEN}
final Piece WHITE_KING = {colour: true, kind: KING}
final Piece BLACK_PAWN = {colour: false, kind: PAWN}
final Piece BLACK_KNIGHT = {colour: false, kind: KNIGHT}
final Piece BLACK_BISHOP = {colour: false, kind: BISHOP}
final Piece BLACK_ROOK = {colour: false, kind: ROOK}
final Piece BLACK_QUEEN = {colour: false, kind: QUEEN}
final Piece BLACK_KING = {colour: false, kind: KING}

type RowCol is int
type Pos is {RowCol col, RowCol row}

type SingleMove is {Pos to, Pos from, Piece piece}
type SingleTake is {Pos to, Piece taken, Pos from, Piece piece}

type SimpleMove is SingleMove | SingleTake
type CastleMove is {bool isWhite, bool kingSide}
type CheckMove is {Move check}
type Move is CheckMove | CastleMove | SimpleMove

final Pos A1 = {col: 0, row: 0}
final Pos A2 = {col: 0, row: 1}
final Pos A3 = {col: 0, row: 2}
final Pos D3 = {col: 3, row: 2}
final Pos H1 = {col: 8, row: 1}

function append(int[] xs, int[] ys) -> (int[] zs)
ensures |zs| == |xs| + |ys|:
    //    
    int count = |xs| + |ys|
    int[] rs = [0; count]
    //
    int i = 0
    while i < |xs| where i >= 0 && i <= |xs| && |rs| == count:
        rs[i] = xs[i]
        i = i + 1
    //
    int j = 0
    while j < |ys| where j >= 0 && |rs| == count:
        rs[j + i] = ys[j]
        j = j + 1
    //
    return rs

function move2str(Move m) -> string:
    if m is SingleTake:
        string tmp = append(piece2str(m.piece),pos2str(m.from))
        tmp = append(tmp,"x")
        tmp = append(tmp,piece2str(m.taken))
        return append(tmp,pos2str(m.to))
    else:
        if m is SingleMove:
            string tmp = append(piece2str(m.piece),pos2str(m.from))
            tmp = append(tmp,"-")
            return append(tmp,pos2str(m.to))
        else:
            if m is CastleMove:
                if m.kingSide:
                    return "O-O"
                else:
                    return "O-O-O"
            else:
                return append(move2str(m.check),"+")

function piece2str(Piece p) -> string:
    if p.kind == PAWN:
        return ""
    else:
        return [PIECE_CHARS[p.kind]]

function pos2str(Pos p) -> string:
    return ['a' + p.col,'1' + p.row]

public export method test() :
    Move m = {to: A1, from: A2, piece: WHITE_PAWN}
    assume move2str(m) == "a2-a1"
    m = {to: A1, from: A2, piece: WHITE_KNIGHT}
    assume move2str(m) == "Na2-a1"
    m = {to: A1, taken: BLACK_KING, from: A2, piece: WHITE_QUEEN}
    assume move2str(m) == "Qa2xKa1"


---