--- title: "A whole package" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{A whole package} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r knitr-setup, include=FALSE} init_wd <- getwd() knitr::opts_chunk$set(echo = TRUE, comment = "#>") knitr::opts_knit$set(root.dir = tempdir(check = TRUE)) pacman::p_load(testthat, exampletestr, stringr) ``` This vignette will teach you how to create a unit test shell for all of the examples in an entire package's documentation. ## Setup 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. ```{r setup, results='hide'} usethis::create_package("tempkg", open = FALSE) fs::file_copy( system.file("extdata", c("detect.R", "match.R"), package = "exampletestr"), "tempkg/R/" ) ``` Now let's move into the `tempkg` directory: ```{r fake-dir-change, eval=FALSE} setwd("tempkg/") ``` ```{r further-knitr-setup, include=FALSE} knitr::opts_knit$set(root.dir = paste0(tempdir(), "/", "tempkg")) ``` and set the active project: ```{r proj-set} usethis::proj_set(".") ``` # Main event The `detect.R` file looks like this (well, I've abbreviated it slightly): ```{r Look at match.R file, eval=FALSE} #' 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 a unit tests _shell_ file for each `.R` file in the package using `make_tests_shells_pkg()`: ```{r make_tests_shells_pkg, eval=FALSE} make_tests_shells_pkg() ``` This outputs `test-detect.R` and `test-match.R` files in the `tests/testthat` folder. As an example of what to do next, the `test-detect.R` file has contents ```{r test-utils.R contents, eval=FALSE} 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 ```{r fill in test shell, eval=FALSE} 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-match.R` must similarly be completed. # Cleanup ```{r setdown0} knitr::opts_knit$set(root.dir = tempdir(check = TRUE)) ``` ```{r setdown} if (fs::dir_exists("tempkg")) fs::dir_delete("tempkg") knitr::opts_knit$set(root.dir = init_wd) ```