--- title: "Interface Layers" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Interface Layers} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- `testex` provides a multi-tiered API, allowing you to adopt it at in a way that makes the most sense for your package -- whether you're minimizing your dependency footprint or rely on a specific set of tools. Whatever your workflow, `testex` has something to offer. # Base building-blocks R examples can include test code! Even if you're not using `testex`, you can already add tests to your examples! ```latex \examples{ identity("hello, world") \testonly{ stopifnot(.Last.value == "hello, world") } } ``` Here we use `.Last.value` to grab the result of our last example and test it against an expected value. Though, as you might expect, you can't easily add _another_ test because `.Last.value` will have changed. `testex` provides a familiar interface for managing just this: ```latex \examples{ identity("hello, world") \testonly{testex::testex( is.character(.), . == "hello, world") )} } ``` Already `testex` is doing a bit of work to make our lives easier. The `.Last.value` is propagated to each of the tests and we can use the convenient shorthand `.` to refer to the value we want to test. # Use a `roxygen2` tag! If you're already using `roxygen2`, then things get even easier! `roxygen2` can make use of new tags provided by `testex`: ```r #' Hello, World! #' #' @examples #' #' hello("World") #' @test "Hello, World!" #' #' hello("darkness my old friend") #' @test grepl("darkness", .) #' #' @export hello <- function(who) { paste0("Hello, ", who, "!") } ``` After running `roxygen2::roxygenize()`, you can take a peak at the `Rd` files and see how the code has been translated to `testex` tests. # Leverage `testthat` expectations A convenience tag is also provide for those that prefer the `testthat` style of testing. `testthat` provides a wealth of expectation functions, which can be used in conjunction with `testex` to write more familiar tests. ```r #' Hello, World! #' #' @examples #' #' hello("World") #' @testthat expect_equal("Hello, World!") #' #' hello("testthat my old friend") #' @testthat expect_match("testthat") #' #' @export hello <- function(who) { paste0("Hello, ", who, "!") } ``` The `@testthat` tag will automatically insert the `.Last.value` from the previous example into the first argument of each expectation. Multiple consecutive `@testthat` expectations will all test the previous example output. # Other Test Suites? There are, of course, plenty of other flavors of testing suites. Thankfully, `testex` is quite versatile because `Rd` code is used as the foundation of everything else. If you want to see support for another framework, please open an issue!