This vignette will teach you how to create a unit test shell for all
of the examples in a single .R
file’s documentation.
First, let’s set up a dummy package called tempkg
with
just the detect.R
and match.R
files from the
source code of the stringr
package.
usethis::create_package("tempkg", open = FALSE)
#> ✔ Creating tempkg/.
#> ✔ Setting active project to
#> "/private/var/folders/0g/hj_q_pzx65bbjnslxz9n0src0000gn/T/RtmpI4Mfpz/tempkg".
#> ✔ Creating R/.
#> ✔ Writing DESCRIPTION.
#> ✔ Writing NAMESPACE.
#> ✔ Setting active project to "<no active project>".
fs::file_copy(
system.file("extdata", c("detect.R", "match.R"), package = "exampletestr"),
"tempkg/R/"
)
Now let’s move into the tempkg
directory:
setwd("tempkg/")
and set the active project:
usethis::proj_set(".")
#> ✔ Setting active project to
#> "/private/var/folders/0g/hj_q_pzx65bbjnslxz9n0src0000gn/T/RtmpI4Mfpz/tempkg".
The detect.R
file looks like this (well, I’ve
abbreviated it slightly):
#' Detect the presence or absence of a pattern in a string.
#'
#' Vectorised over `string` and `pattern`.
#'
#' @param string Input vector. Either a character vector, or something
#' coercible to one.
#' @param pattern Pattern to look for.
#'
#' @return A logical vector.
#'
#' @export
#' @examples
#' fruit <- c("apple", "banana", "pear", "pinapple")
#' str_detect(fruit, "a")
#' str_detect(fruit, "^a")
#' str_detect(fruit, "a$")
#' str_detect(fruit, "b")
#' str_detect(fruit, "[aeiou]")
str_detect <- function(string, pattern) {
switch(type(pattern),
empty = ,
bound = str_count(string, pattern) > 0,
fixed = stri_detect_fixed(string, pattern, opts_fixed = opts(pattern)),
coll = stri_detect_coll(string, pattern,
opts_collator = opts(pattern)
),
regex = stri_detect_regex(string, pattern, opts_regex = opts(pattern))
)
}
We can make the unit tests shell file for the
str_match()
function using
make_tests_shells_file()
:
make_tests_shells_file("detect", open = FALSE)
This outputs a test-detect.R
file in the
tests/testthat
folder with contents
test_that("`str_detect()` works", {
fruit <- c("apple", "banana", "pear", "pinapple")
expect_equal(str_detect(fruit, "a"), )
expect_equal(str_detect(fruit, "^a"), )
expect_equal(str_detect(fruit, "a$"), )
expect_equal(str_detect(fruit, "b"), )
expect_equal(str_detect(fruit, "[aeiou]"), )
expect_equal(str_detect("aecfg", letters), )
})
which can be sensibly completed as
test_that("`str_detect()` works", {
fruit <- c("apple", "banana", "pear", "pinapple")
expect_equal(str_detect(fruit, "a"), rep(TRUE, 4))
expect_equal(str_detect(fruit, "^a"), c(TRUE, rep(FALSE, 3)))
expect_equal(str_detect(fruit, "a$"), c(FALSE, TRUE, FALSE, FALSE))
expect_equal(str_detect(fruit, "b"), c(FALSE, TRUE, FALSE, FALSE))
expect_equal(str_detect(fruit, "[aeiou]"), rep(TRUE, 4))
expect_equal(
str_detect("aecfg", letters),
letters %in% c("a", "c", "e", "f", "g")
)
})
#> Test passed 🥇
if (fs::dir_exists("tempkg")) fs::dir_delete("tempkg")
knitr::opts_knit$set(root.dir = init_wd)