rasterio/tests/test_windows_mixins.py
2018-05-17 15:52:21 -06:00

96 lines
3.8 KiB
Python

from hypothesis import given
from hypothesis.strategies import composite, floats, integers
from rasterio import windows
from rasterio.coords import BoundingBox
class FakeDataset(windows.WindowMethodsMixin):
"""A test double to support testing of the mixin class"""
def __init__(self, **kwargs):
self.transform = kwargs.get('transform')
self.height = kwargs.get('height')
self.width = kwargs.get('width')
@property
def bounds(self):
a, b, c, d, e, f, _, _, _ = self.transform
return BoundingBox(c, f + e * self.height, c + a * self.width, f)
def __repr__(self):
return "<FakeDataset: transform={}, height={}, width={}>".format(self.transform, self.height, self.width)
@composite
def dataset_utm(draw):
"""Generate a fake UTM dataset with an origin, a resolution, and a finite size"""
x = draw(floats(min_value=-1e6, max_value=1e+6, allow_nan=False, allow_infinity=False))
y = draw(floats(min_value=-1e6, max_value=1e+6, allow_nan=False, allow_infinity=False))
res = draw(floats(min_value=0.1, max_value=30, allow_nan=False, allow_infinity=False))
h = draw(integers(min_value=1, max_value=1000))
w = draw(integers(min_value=1, max_value=1000))
return FakeDataset(
transform=windows.Affine.identity() * windows.Affine.translation(x, y) * windows.Affine.scale(res, -res),
height=h, width=w)
@composite
def dataset_utm_north_down(draw):
"""Generate a fake UTM dataset with an origin, a resolution, and a finite size"""
x = draw(floats(min_value=-1e6, max_value=1e+6, allow_nan=False, allow_infinity=False))
y = draw(floats(min_value=-1e6, max_value=1e+6, allow_nan=False, allow_infinity=False))
res = draw(floats(min_value=0.1, max_value=30, allow_nan=False, allow_infinity=False))
h = draw(integers(min_value=1, max_value=1000))
w = draw(integers(min_value=1, max_value=1000))
return FakeDataset(
transform=windows.Affine.identity() * windows.Affine.translation(x, y) * windows.Affine.scale(res),
height=h, width=w)
def assert_windows_almost_equal(a, b):
assert round(a.col_off, 7) == round(b.col_off, 7)
assert round(a.row_off, 7) == round(b.row_off, 7)
assert round(a.width, 7) == round(b.width, 7)
assert round(a.height, 7) == round(b.height, 7)
@given(dataset=dataset_utm())
def test_window_rt(dataset):
"""Get correct window for full dataset extent"""
left, top = dataset.transform * (0, 0)
right, bottom = dataset.transform * (dataset.width, dataset.height)
assert_windows_almost_equal(
dataset.window(left, bottom, right, top),
windows.Window(0, 0, dataset.width, dataset.height))
@given(dataset=dataset_utm_north_down())
def test_window_rt_north_down(dataset):
"""Get correct window for full dataset extent"""
left, top = dataset.transform * (0, 0)
right, bottom = dataset.transform * (dataset.width, dataset.height)
assert_windows_almost_equal(
dataset.window(left, bottom, right, top),
windows.Window(0, 0, dataset.width, dataset.height))
@given(dataset=dataset_utm())
def test_window_transform_rt(dataset):
assert dataset.window_transform(windows.Window(0, 0, dataset.width, dataset.height)) == dataset.transform
@given(dataset=dataset_utm_north_down())
def test_window_transform_rt_north_down(dataset):
assert dataset.window_transform(windows.Window(0, 0, dataset.width, dataset.height)) == dataset.transform
@given(dataset=dataset_utm())
def test_window_bounds_rt(dataset):
assert dataset.window_bounds(windows.Window(0, 0, dataset.width, dataset.height)) == dataset.bounds
@given(dataset=dataset_utm_north_down())
def test_window_bounds_rt_north_down(dataset):
assert dataset.window_bounds(windows.Window(0, 0, dataset.width, dataset.height)) == dataset.bounds