Date: 2024-10-07

# A whole package

#### 2024-10-07

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.

    usethis::create_package("tempkg", open = FALSE)

    #> ✔ Creating './'.

    #> ✔ Setting active project to
    #>   "/private/var/folders/m1/sq5nmr5x2cj0t6f8wscs1wqm0000gp/T/Rtmp0gPG06/tempkg".

    #> ✔ Creating 'R/'.

    #> ✔ Writing 'DESCRIPTION'.

    #> ✔ Writing 'NAMESPACE'.

    #> ✔ Setting active project to
    #>   "/private/var/folders/m1/sq5nmr5x2cj0t6f8wscs1wqm0000gp/T/Rtmp0gPG06/tempkg".

    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(".")

# Main event

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 a unit tests shell file for each `.R` file in the package using `make_tests_shells_pkg()`:

    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

    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-match.R` must similarly be completed.

# Cleanup

    knitr::opts_knit$set(root.dir = tempdir(check = TRUE))

    if (fs::dir_exists("tempkg")) fs::dir_delete("tempkg")
    knitr::opts_knit$set(root.dir = init_wd)