# Copyright 2019 Province of British Columbia
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.
suppressPackageStartupMessages(library(sf, quietly = TRUE))
the_geom <- st_sf(st_sfc(st_point(c(1, 1))))
test_that("bcdc_cql_string fails when an invalid arguments are given", {
expect_error(bcdc_cql_string(the_geom, "FOO"))
expect_error(bcdc_cql_string(quakes, "DWITHIN"))
})
test_that("bcdc_cql_string fails when used on an uncollected (promise) object", {
expect_error(
bcdc_cql_string(structure(list(), class = "bcdc_promise")),
"you need to use collect"
)
})
test_that("CQL function works", {
expect_s3_class(CQL("SELECT * FROM foo;"), c("CQL", "SQL"))
})
test_that("All cql geom predicate functions work", {
single_arg_functions <- c(
"EQUALS",
"DISJOINT",
"INTERSECTS",
"TOUCHES",
"CROSSES",
"WITHIN",
"CONTAINS",
"OVERLAPS"
)
for (f in single_arg_functions) {
expect_equal(
do.call(f, list(the_geom)),
CQL(paste0(f, "({geom_name}, POINT (1 1))"))
)
}
expect_equal(
DWITHIN(the_geom, 1), #default units meters
CQL("DWITHIN({geom_name}, POINT (1 1), 1, meters)")
)
expect_equal(
DWITHIN(the_geom, 1, "meters"),
CQL("DWITHIN({geom_name}, POINT (1 1), 1, meters)")
)
expect_equal(
BEYOND(the_geom, 1, "feet"),
CQL("BEYOND({geom_name}, POINT (1 1), 1, feet)")
)
expect_equal(
RELATE(the_geom, "*********"),
CQL("RELATE({geom_name}, POINT (1 1), *********)")
)
expect_equal(
BBOX(c(1, 2, 1, 2)),
CQL("BBOX({geom_name}, 1, 2, 1, 2)")
)
expect_equal(
BBOX(c(1, 2, 1, 2), crs = 'EPSG:4326'),
CQL("BBOX({geom_name}, 1, 2, 1, 2, 'EPSG:4326')")
)
expect_equal(
BBOX(c(1, 2, 1, 2), crs = 4326),
CQL("BBOX({geom_name}, 1, 2, 1, 2, 'EPSG:4326')")
)
})
test_that("CQL functions fail correctly", {
expect_error(EQUALS(quakes), "x is not a valid sf object")
expect_error(BEYOND(the_geom, "five"), "'distance' must be numeric")
expect_error(DWITHIN(the_geom, 5, "fathoms"), "'arg' should be one of")
expect_error(DWITHIN(the_geom, "10", "meters"), "must be numeric")
expect_error(RELATE(the_geom, "********"), "pattern") # 8 characters
expect_error(RELATE(the_geom, "********5"), "pattern") # invalid character
expect_error(RELATE(the_geom, rep("TTTTTTTTT", 2)), "pattern") # > length 1
expect_error(BBOX(c(1, 2, 3)), "numeric vector")
expect_error(BBOX(c("1", "2", "3", "4")), "numeric vector")
expect_error(
BBOX(c(1, 2, 3, 4), crs = c("EPSG:4326", "EPSG:3005")),
"must be a character string"
)
})
test_that("unsupported aggregation functions fail correctly", {
expect_error(
filter(
structure(list(cols_df = list(col_name = "x")), class = "bcdc_promise"),
mean(x) > 5
),
"not supported by this database"
)
})
test_that("passing an non-existent object to a geom predicate", {
skip_if_net_down()
skip_on_cran()
expect_error(
bcdc_query_geodata("6a2fea1b-0cc4-4fc2-8017-eaf755d516da") %>%
filter(INTERSECTS(districts)),
'not found'
)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.