whiley_test_file 0.6.2

An API for manipulating test files for the Whiley Programming Language.
Documentation
original.name="While_Valid_2"
======
>>> main.whiley
property sorted(int[] items) -> (bool r):
    return all { i in 0..|items|, j in 0..|items| | (i < j) ==> (items[i] < items[j]) }

// The classic binary search which runs in O(log n) time by halving
// the search space on each iteration until either the item is found, or
// the search space is emtpy.  Its fair to say that this is quite a test
// for the verifier!!
function binarySearch(int[] items, int item) -> (bool result)
// The input list must be in sorted order
requires sorted(items)
// If return true, then matching item must exist in items
ensures result ==> some { i in 0..|items| | items[i] == item }
// If return false, then no matching item exists in items
ensures !result ==> all { i in 0..|items| | items[i] != item }:
    //
    int lo = 0
    int hi = |items|

    while lo < hi
        where 0 <= lo && hi <= |items| && lo <= hi
        // everything before lo is below item
        where all { i in 0 .. lo | items[i] < item }
        // everything after hi is above item
        where all { i in hi .. |items| | items[i] > item }:
        //
        // Note, the following is safe in Whiley because we have
        // unbounded integers.  If that wasn't the case, then this could
        // potentially overflow leading to a very subtle bug (like that
        // eventually found in the Java Standard Library).
        //
        int mid = (lo + hi) / 2

        if items[mid] < item:
            lo = mid + 1
        else if items[mid] > item:
            hi = mid
        else:
            return true
    //
    return false

public export method test():
    int[] xs = []
    int[] ys = [0,4,7,10]
    int[] zs = [-4, -3, -1, 1, 5, 10, 101, 222]
    // Santiy check
    assert sorted(xs)
    assert sorted(ys)
    assert sorted(zs)
    // xs
    assert !binarySearch(xs,-10)
    assert !binarySearch(xs,-5)
    assert !binarySearch(xs,-1)
    assert !binarySearch(xs,0)
    assert !binarySearch(xs,1)
    assert !binarySearch(xs,5)
    assert !binarySearch(xs,10)
    // ys
    assert !binarySearch(ys,-10)
    assert !binarySearch(ys,-5)
    assert !binarySearch(ys,-1)
    assert  binarySearch(ys,0)
    assert !binarySearch(ys,1)
    assert !binarySearch(ys,5)
    assert  binarySearch(ys,10)
    // zs
    assert !binarySearch(zs,-10)
    assert !binarySearch(zs,-5)
    assert  binarySearch(zs,-1)
    assert ! binarySearch(zs,0)
    assert  binarySearch(zs,1)
    assert  binarySearch(zs,5)
    assert  binarySearch(zs,10)
---