test_that("default URL spec works", {
spec <- osm_url_spec()
expect_identical(spec$block_size, c(256L, 256L))
expect_identical(spec$min_zoom, 0)
expect_identical(spec$max_zoom, 18)
})
test_that("example spec works", {
spec <- osm_url_spec_example()
expect_match(spec$server_url, "extdata/osmns/{z}_{x}_{y}.png", fixed = TRUE)
})
test_that("as_osm_url_spec() works", {
spec <- osm_url_spec()
expect_identical(as_osm_url_spec(spec), spec)
expect_identical(as_osm_url_spec(spec$server_url), spec)
spec_with_default_name <- as_osm_url_spec(spec$server_url, name = "another name")
expect_identical(
spec_with_default_name,
osm_url_spec(name = "another name")
)
spec_with_default_name <- as_osm_url_spec(spec, name = "another name")
expect_identical(
spec_with_default_name,
osm_url_spec(name = "another name")
)
})
test_that("urls can be generated from the default spec", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
expect_identical(
osm_url(tiles, osm_url_spec()),
c(
"https://tile.openstreetmap.org/6/20/22.png",
"https://tile.openstreetmap.org/6/21/22.png",
"https://tile.openstreetmap.org/6/20/23.png",
"https://tile.openstreetmap.org/6/21/23.png"
)
)
})
test_that("urls with quadkeys can be generated", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
expect_identical(
osm_url(tiles, "http://something.com/{q}"),
c(
"http://something.com/030320",
"http://something.com/030321",
"http://something.com/030322",
"http://something.com/030323"
)
)
})
test_that("urls with names can be generated", {
spec <- osm_url_spec("{name}/{z}/{x}/{y}.png", name = "the_name")
tiles <- data.frame(x = 1, y = 2, zoom = 3)
expect_identical(
osm_url(tiles, spec),
"the_name/3/1/2.png"
)
})
test_that("tiles are normalized before generating URLs", {
oversized_rect <- wk::rct(
-20038000, -20038000,
20038000, 20038000,
crs = osm_crs_native()
)
tiles <- osm_tile_covering(oversized_rect, zoom = 0)
expect_identical(
unique(as.character(osm_url(tiles, osm_url_spec()))),
c(NA, "https://tile.openstreetmap.org/0/0/0.png")
)
})
test_that("url async loader works", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
spec <- osm_url_spec_example()
spec$name <- "ex"
# default does nothing but should write to the cache
temp_cache <- tempfile()
cache_spec <- paste0(temp_cache, "/", "{name}_{z}_{x}_{y}.png")
expect_identical(
osm_url_load_async(tiles, spec, cache_spec = cache_spec),
tiles
)
expect_setequal(
list.files(temp_cache),
c("ex_6_20_22.png", "ex_6_20_23.png", "ex_6_21_22.png", "ex_6_21_23.png")
)
unlink(temp_cache, recursive = TRUE)
})
test_that("url async loader can load zero tiles", {
tiles <- data.frame(x = double(), y = double(), zoom = double())
expect_identical(osm_url_load_async(tiles, osm_url_spec_example()), tiles)
})
test_that("url async loader errors for paths that are urls", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
expect_error(
osm_url_load_async(tiles, osm_url_spec_example(), cache_spec = "http://this.is.a.url"),
"Cache results must be paths and not URLs"
)
})
test_that("url async loader runs the error callback", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
callback <- function(tiles, res) {
expect_equal(res$status_code, 500)
stop(glue::glue("<{res$url}> {res$msg}"))
}
expect_error(
osm_url_load_async(tiles, "this_is_not_a_file_anywhere", callback),
"this_is_not_a_file_anywhere"
)
})
test_that("url async loader runs the success callback", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
tiles_out <- data.frame(x = double(), y = double(), zoom = double())
callback <- function(tiles, res) {
expect_identical(res$status_code, 0L)
expect_identical(nrow(tiles), 1L)
tiles_out <<- rbind(tiles_out, tiles)
}
expect_identical(
osm_url_load_async(tiles, osm_url_spec_example(), callback = callback),
tiles
)
expect_identical(tiles_out[order(tiles_out$y, tiles_out$x), ], tiles)
})
test_that("url async loader stops for callback error", {
tiles <- data.frame(
x = c(20, 21, 20, 21),
y = c(22, 22, 23, 23),
zoom = 6
)
# After a callback error, nothing should be cached
temp_cache <- tempfile()
cache_spec <- paste0(temp_cache, "/", "{z}_{x}_{y}.png")
callback <- function(tiles, res) {
stop("In the name of Open Street Map!")
}
expect_error(
osm_url_load_async(tiles, osm_url_spec_example(), callback = callback),
"In the name of Open Street Map!"
)
expect_false(dir.exists(temp_cache))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.