I've implemented the following prop. test:
use ExUnit.Case, async: true
use Quixir
ptest [half_width: positive_int(), median: int(min: ^half_width)], trace: true, repeat_for: 500 do
ptest half_width: positive_int(), median: int(min: ^half_width) do
result = Pullapi.Numbers.median_range(median, half_width)
f..l = result
assert l - f == 2 * half_width
end
end
with the function:
@doc """
Returns a range specified by a median and half-width.
## Examples
iex> Pullapi.Numbers.median_range(10, 4)
6..14
"""
@spec median_range(integer, integer) :: Range.t()
def median_range(median, half_width) when half_width > 0 and median >= half_width do
min = median - half_width
max = median + half_width
min..max
end
Have I identified the key invariant and properties that should be tested here? I believe I've implicitly tested that the enumerable is an ordered range by pattern matching the returned data structure.