use vaster::*;
#[test]
fn r_xy_from_cell_world_grid() {
let dim = [40, 36];
let extent = [-180.0, 180.0, -90.0, 90.0];
let (x, y) = xy_from_cell(&dim, &extent, 0);
assert!((x - (-175.5)).abs() < 1e-10);
assert!((y - 87.5).abs() < 1e-10);
}
#[test]
fn r_xy_from_cell_last() {
let dim = [40, 36];
let extent = [-180.0, 180.0, -90.0, 90.0];
let (x, y) = xy_from_cell(&dim, &extent, 1439);
assert!((x - 175.5).abs() < 1e-10);
assert!((y - (-87.5)).abs() < 1e-10);
}
#[test]
fn r_cell_from_xy_origin() {
let dim = [40, 36];
let extent = [-180.0, 180.0, -90.0, 90.0];
let cell = cell_from_xy(&dim, &extent, 0.0, 0.0);
assert_eq!(cell, Some(740));
}
#[test]
fn global_1deg_geotransform() {
let gt = extent_dim_to_gt(&[-180.0, 180.0, -90.0, 90.0], &[360, 180]);
assert!((gt[0] - (-180.0)).abs() < 1e-10);
assert!((gt[1] - 1.0).abs() < 1e-10);
assert!((gt[2] - 0.0).abs() < 1e-10);
assert!((gt[3] - 90.0).abs() < 1e-10);
assert!((gt[4] - 0.0).abs() < 1e-10);
assert!((gt[5] - (-1.0)).abs() < 1e-10);
}
#[test]
fn sentinel2_geotransform() {
let extent = [499980.0, 609780.0, -4900020.0, -4790220.0];
let dim = [10980, 10980];
let gt = extent_dim_to_gt(&extent, &dim);
assert!((gt[1] - 10.0).abs() < 1e-10); assert!((gt[5] - (-10.0)).abs() < 1e-10); assert!((gt[0] - 499980.0).abs() < 1e-10);
assert!((gt[3] - (-4790220.0)).abs() < 1e-10); }
#[test]
fn inv_geotransform_roundtrip_through_coords() {
let gt = extent_dim_to_gt(&[499980.0, 609780.0, -4900020.0, -4790220.0], &[10980, 10980]);
let inv = inv_geotransform(>).unwrap();
let x = x_from_col(>, 5434.0);
let y = y_from_row(>, 2646.0);
let col_back = inv[0] + x * inv[1] + y * inv[2];
let row_back = inv[3] + x * inv[4] + y * inv[5];
assert!((col_back - 5434.5).abs() < 1e-10);
assert!((row_back - 2646.5).abs() < 1e-10);
}
#[test]
fn r_vcrop_world_grid() {
let parent_dim = [360, 180];
let parent_extent = [-180.0, 180.0, -90.0, 90.0];
let target = [10.3, 20.7, -5.2, 8.9];
let (ext, dim) = vcrop(&target, &parent_dim, &parent_extent);
assert!((ext[0] - 10.0).abs() < 1e-10);
assert!((ext[1] - 21.0).abs() < 1e-10);
assert!((ext[2] - (-6.0)).abs() < 1e-10);
assert!((ext[3] - 9.0).abs() < 1e-10);
assert_eq!(dim, [11, 15]);
}
#[test]
fn resolution_global() {
let dim = [360, 180];
let extent = [-180.0, 180.0, -90.0, 90.0];
assert!((x_res(&dim, &extent) - 1.0).abs() < 1e-10);
assert!((y_res(&dim, &extent) - 1.0).abs() < 1e-10);
}
#[test]
fn resolution_sentinel2() {
let dim = [10980, 10980];
let extent = [499980.0, 609780.0, -4900020.0, -4790220.0];
assert!((x_res(&dim, &extent) - 10.0).abs() < 1e-10);
assert!((y_res(&dim, &extent) - 10.0).abs() < 1e-10);
}
#[test]
fn world_file_global_1deg() {
let gt = extent_dim_to_gt(&[-180.0, 180.0, -90.0, 90.0], &[360, 180]);
let wf = geotransform_to_world(>);
assert!((wf[0] - 1.0).abs() < 1e-10); assert!((wf[1] - 0.0).abs() < 1e-10); assert!((wf[2] - 0.0).abs() < 1e-10); assert!((wf[3] - (-1.0)).abs() < 1e-10); assert!((wf[4] - (-179.5)).abs() < 1e-10); assert!((wf[5] - 89.5).abs() < 1e-10);
}
#[test]
fn single_cell_grid() {
let dim = [1, 1];
let extent = [0.0, 1.0, 0.0, 1.0];
let (x, y) = xy_from_cell(&dim, &extent, 0);
assert!((x - 0.5).abs() < 1e-10);
assert!((y - 0.5).abs() < 1e-10);
assert_eq!(ncell(&dim), 1);
}
#[test]
fn cell_from_xy_on_boundary() {
let dim = [10, 10];
let extent = [0.0, 10.0, 0.0, 10.0];
assert_eq!(cell_from_xy(&dim, &extent, 1.0, 9.5), Some(1));
assert_eq!(cell_from_xy(&dim, &extent, 1.5, 9.5), Some(1));
assert_eq!(cell_from_xy(&dim, &extent, 0.0, 5.0), Some(50));
assert_eq!(cell_from_xy(&dim, &extent, 10.0, 5.0), Some(59));
assert_eq!(cell_from_xy(&dim, &extent, 5.0, 0.0), Some(95));
assert_eq!(cell_from_xy(&dim, &extent, 5.0, 10.0), Some(5));
}