Skip to content

Commit c7fedf4

Browse files
Add skip_unless_r() (#2094)
Fixes #2022
1 parent bda252b commit c7fedf4

File tree

7 files changed

+62
-0
lines changed

7 files changed

+62
-0
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ export(skip_on_covr)
189189
export(skip_on_cran)
190190
export(skip_on_os)
191191
export(skip_on_travis)
192+
export(skip_unless_r)
192193
export(snapshot_accept)
193194
export(snapshot_review)
194195
export(source_dir)

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* `expect_s4_class()` now supports unquoting (@stibu81, #2064).
55
* `it()` now finds the correct evaluation environment in more cases (@averissimo, #2085).
66
* Fixed an issue preventing compilation from succeeding due to deprecation / removal of `std::uncaught_exception()` (@kevinushey, #2047).
7+
* New `skip_unless_r()` to skip running tests on unsuitable versions of R, e.g. `skip_unless_r(">= 4.1.0")` to skip tests that require, say, `...names` (@MichaelChirico, #2022)
78

89
# testthat 3.2.3
910

R/expect-self-test.R

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ expect_no_failure <- function(expr) {
9494
expect_snapshot_skip <- function(x, cran = FALSE) {
9595
expect_snapshot_error(x, class = "skip", cran = cran)
9696
}
97+
expect_skip <- function(code) {
98+
expect_condition(code, class = "skip")
99+
}
97100
expect_no_skip <- function(code) {
98101
expect_no_condition(code, class = "skip")
99102
}

R/skip.R

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,30 @@ package_version <- function(x) {
126126
utils::packageVersion(x)
127127
}
128128

129+
#' @export
130+
#' @param spec A version specification like '>= 4.1.0' denoting that this test
131+
#' should only be run on R versions 4.1.0 and later.
132+
#' @rdname skip
133+
skip_unless_r <- function(spec) {
134+
parts <- unlist(strsplit(spec, " ", fixed = TRUE))
135+
if (length(parts) != 2L) {
136+
cli::cli_abort("{.arg spec} should be a comparison like '>=' and an R version separated by a space.")
137+
}
138+
comparator <- match.fun(parts[1L])
139+
required_version <- numeric_version(parts[2L])
140+
141+
current_version <- getRversion()
142+
skip_if_not(
143+
comparator(current_version, required_version),
144+
sprintf(
145+
"Current R version (%s) does not satisfy requirement (%s %s)",
146+
current_version, parts[1L], required_version
147+
)
148+
)
149+
}
150+
# for mocking
151+
getRversion <- NULL
152+
129153
#' @export
130154
#' @rdname skip
131155
skip_if_offline <- function(host = "captive.apple.com") {

man/skip.Rd

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/_snaps/skip.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,11 @@
8888

8989
Reason: On Windows i386
9090

91+
# skip_unless_r gives the expected output
92+
93+
Reason: Current R version (4.5.0) does not satisfy requirement (>= 999.999.999)
94+
95+
---
96+
97+
Reason: Current R version (4.5.0) does not satisfy requirement (== 0.0.0)
98+

tests/testthat/test-skip.R

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,22 @@ test_that("can refine os with arch", {
135135
expect_no_skip(skip_on_os("windows", "x86_64"))
136136
expect_no_skip(skip_on_os("linux", "i386"))
137137
})
138+
139+
test_that("skip_unless_r works as expected", {
140+
expect_no_skip(skip_unless_r(">= 0.0.0"))
141+
expect_no_skip(skip_unless_r(paste("==", getRversion())))
142+
expect_no_skip(skip_unless_r("<= 999.999.999"))
143+
144+
expect_skip(skip_unless_r(">= 999.999.999"))
145+
expect_skip(skip_unless_r("== 0.0.0"))
146+
expect_skip(skip_unless_r("<= 0.0.0"))
147+
148+
expect_error(skip_unless_r("idfjdij"), "should be a comparison like '>='", fixed = TRUE)
149+
})
150+
151+
test_that("skip_unless_r gives the expected output", {
152+
local_mocked_bindings(getRversion = \() numeric_version("4.5.0"))
153+
154+
expect_snapshot_skip(skip_unless_r(">= 999.999.999"))
155+
expect_snapshot_skip(skip_unless_r("== 0.0.0"))
156+
})

0 commit comments

Comments
 (0)