test_that("circular ranges need two parameters", {
map <- readRDS("map.rds")
expect_error(
population("pop", time = 1, N = 1, map = map, center = 1),
"Missing radius argument when defining a circular population range"
)
expect_error(
population("pop", time = 1, N = 1, map = map, radius = 1),
"Missing center argument when defining a circular population range"
)
})
test_that("polygon boundary can be specified in two ways", {
map <- readRDS("map.rds")
coords <- list(c(-18, 20), c(40, 20), c(30, 33), c(20, 32), c(10, 35), c(-8, 35))
africa <- region("Africa", map, polygon = coords)
afr1 <- population("AFR", time = 1, N = 1, map = map, polygon = africa)
afr2 <- population("AFR", time = 1, N = 1, map = map, polygon = coords)
expect_true(all(afr1 == afr2))
})
test_that("polygon ranges need at least three corners", {
map <- readRDS("map.rds")
coords <- list(c(-18, 20), c(40, 20))
expect_error(
region("Africa", map, polygon = coords),
"Polygon range needs to have at least three corners"
)
})
test_that("polygon ranges need at least three corners", {
map <- readRDS("map.rds")
coords <- list(c(-18, 20), c(40, 20), c(50, 50))
expect_error(
population("AFR", time = 1, N = 1, map = map, center = 1, radius = 1, polygon = coords),
"Either a circular range (center and radius) or the corners of
a polygon need to be specified, but not both", fixed = TRUE
)
})
# set operations
test_that("union of a region with itself gives the same region", {
map <- world(xrange = c(-15, 60), yrange = c(-20, 65), landscape = "blank")
coords <- list(c(-18, 20), c(40, 20), c(30, 33), c(20, 32), c(10, 35), c(-8, 35))
africa <- region("Africa", map, polygon = coords)
expect_true(all(africa == join(africa, africa, name = "Africa")))
})
test_that("intersection of a region with itself gives the same region", {
map <- world(xrange = c(-15, 60), yrange = c(-20, 65), landscape = "blank")
coords <- list(c(-18, 20), c(40, 20), c(30, 33), c(20, 32), c(10, 35), c(-8, 35))
africa <- region("Africa", map, polygon = coords)
expect_true(all(africa == overlap(africa, africa, name = "Africa")))
})
test_that("subtraction of a region from itself gives an empty region", {
map <- world(xrange = c(-15, 60), yrange = c(-20, 65), landscape = "blank")
coords <- list(c(-18, 20), c(40, 20), c(30, 33), c(20, 32), c(10, 35), c(-8, 35))
africa <- region("Africa", map, polygon = coords)
expect_true(nrow(subtract(africa, africa)) == 0)
})
test_that("subtraction of a non-overlapping region does not change the result", {
map <- world(xrange = c(-15, 60), yrange = c(-20, 65), landscape = "blank")
r1 <- region("r1", map, center = c(0, 0), radius = 5)
r2 <- region("r2", map, center = c(10, 10), radius = 5)
expect_true(all(subtract(r1, r2, name = "r1") == r1))
})
test_that("nonoverlapping join gives empty intersection", {
map <- world(xrange = c(-15, 60), yrange = c(-20, 65), landscape = "blank")
r1 <- region("r1", map, center = c(0, 0), radius = 5)
r2 <- region("r2", map, center = c(10, 10), radius = 5)
expect_true(nrow(overlap(r1, r2, "")) == 0)
})
test_that("custom landscapes can be specified", {
r1 <- region(center = c(0, 0), radius = 10)
r2 <- region(center = c(10, 10), radius = 10)
r3 <- region(center = c(-10, -10), radius = 10)
comb <- r1 %>% join(r2) %>% join(r3)
map <- world(xrange = c(-20, 20), yrange = c(-20, 20), landscape = comb)
# is the geometry component of the builtin map equal to the are of
# the original regions?
expect_equal(sf::st_area(map$landscape), sf::st_area(comb), tolerance = 0.0001)
})
test_that("boundaries are either circles or polygons", {
expect_error(region(), "Either a circular range or a polygon range must be specified")
})
# distances between nonoverlapping ranges ---------------------------------
map <- world(xrange = c(0, 100), yrange = c(0, 100), landscape = "blank")
x1 <- 0; x2 <- 100; radius <- 10
p1 <- population("p1", map = map, time = 1, center = c(x1, 50), radius = radius, N = 1)
p2 <- population("p2", map = map, time = 1, center = c(x2, 50), radius = radius, N = 1)
test_that("distance calculation method must be provided", {
expect_error(distance(p1, p2, measure = "blah"),
"Unknown distance measure method")
expect_silent(distance(p1, p2, measure = "center", 0))
})
test_that("time must be given when calculating population distances", {
expect_error(distance(p1, p2, measure = "border"),
"Time of the nearest spatial snapshot must be be given")
})
test_that("distance between borders of geographic regions is correctly calculated", {
expect_true(distance(p1, p2, measure = "border", time = 0) == (x2 - x1) - 2*radius)
})
test_that("distance between centers of geographic regions is correctly calculated", {
expect_true(all.equal(distance(p1, p2, measure = "center", time = 0), 100))
})
# distances between overlapping ranges ------------------------------------
radius <- 60
p1 <- population("p1", map = map, time = 1, center = c(0, 50), radius = radius, N = 1)
p2 <- population("p2", map = map, time = 1, center = c(100, 50), radius = radius, N = 1)
test_that("distance between population borders is zero", {
expect_true(distance(p1, p2, measure = "border", time = 0) == 0)
})
test_that("distance between population centers is still the same", {
expect_true(all.equal(distance(p1, p2, measure = "center", time = 0), 100))
})
# distances can be calculated even for generic regions --------------------
r1 <- region(map = map, center = c(0, 50), radius = 60)
r2 <- region(map = map, center = c(100, 50), radius = 60)
test_that("distance between borders of regions is zero", {
expect_true(distance(r1, r2, measure = "border") == 0)
})
test_that("distance between centers of regions is the same", {
expect_true(all.equal(distance(r1, r2, measure = "center"), 100))
})
test_that("it is possible to calculate distances betwewen populations and regions", {
expect_true(all.equal(distance(p1, r2, measure = "border", time = 0), 0))
expect_true(all.equal(distance(r1, p2, measure = "border", time = 0), 0))
expect_true(all.equal(distance(p1, r2, measure = "center", time = 0), 100))
expect_true(all.equal(distance(r1, p2, measure = "center", time = 0), 100))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.