@@ -6,6 +6,33 @@ fixture_corpus_path <- function() {
|
|||||||
if (nzchar(p)) paste0(p, "/") else ""
|
if (nzchar(p)) paste0(p, "/") else ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Path to a file in the SOURCE tree (README.md, man/*.Rd, vignettes/*.Rmd),
|
||||||
|
# or "" when it isn't there.
|
||||||
|
#
|
||||||
|
# Tests that assert on documentation content have to read the sources, and the
|
||||||
|
# sources only exist when the suite runs from a checkout. Under R CMD check the
|
||||||
|
# suite runs from the INSTALLED package, where man/ and vignettes/ are not
|
||||||
|
# shipped and `../../README.md` does not resolve -- so those tests must skip
|
||||||
|
# rather than error. CI runs testthat::test_local() from the checkout BEFORE
|
||||||
|
# rcmdcheck, so the assertions are still enforced on every push; this only
|
||||||
|
# stops them from failing a context that structurally cannot satisfy them.
|
||||||
|
source_tree_path <- function(...) {
|
||||||
|
p <- testthat::test_path("..", "..", ...)
|
||||||
|
if (file.exists(p)) p else ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Skip unless every named source file is present (see source_tree_path()).
|
||||||
|
skip_if_no_source_tree <- function(...) {
|
||||||
|
paths <- vapply(list(...), function(rel) do.call(source_tree_path, as.list(rel)),
|
||||||
|
character(1))
|
||||||
|
missing <- vapply(paths, function(p) !nzchar(p), logical(1))
|
||||||
|
testthat::skip_if(
|
||||||
|
any(missing),
|
||||||
|
"package source tree not available (running against the installed package)"
|
||||||
|
)
|
||||||
|
invisible(paths)
|
||||||
|
}
|
||||||
|
|
||||||
# Skip a test if no corpus is reachable (bundled fixture or explicit remote URL).
|
# Skip a test if no corpus is reachable (bundled fixture or explicit remote URL).
|
||||||
skip_if_no_corpus <- function() {
|
skip_if_no_corpus <- function() {
|
||||||
p <- fixture_corpus_path()
|
p <- fixture_corpus_path()
|
||||||
|
|||||||
@@ -18,16 +18,23 @@
|
|||||||
|
|
||||||
test_that("returned amounts are documented as full US dollars where readers meet the package", {
|
test_that("returned amounts are documented as full US dollars where readers meet the package", {
|
||||||
|
|
||||||
|
# README and vignettes ship only in the source tree, not in the installed
|
||||||
|
# package, so these assertions cannot run under R CMD check -- CI's earlier
|
||||||
|
# testthat::test_local() step is what enforces them. See
|
||||||
|
# skip_if_no_source_tree() in helper-fixture.R.
|
||||||
|
docs <- skip_if_no_source_tree(
|
||||||
|
"README.md",
|
||||||
|
c("vignettes", "total-spending.Rmd"),
|
||||||
|
c("vignettes", "population-denominators.Rmd")
|
||||||
|
)
|
||||||
|
|
||||||
says_units <- function(path) {
|
says_units <- function(path) {
|
||||||
txt <- paste(readLines(path, warn = FALSE), collapse = " ")
|
txt <- paste(readLines(path, warn = FALSE), collapse = " ")
|
||||||
grepl("full US dollars|full U\\.S\\. dollars", txt, ignore.case = TRUE) &&
|
grepl("full US dollars|full U\\.S\\. dollars", txt, ignore.case = TRUE) &&
|
||||||
grepl("\\$1,000s|thousands of dollars", txt, ignore.case = TRUE)
|
grepl("\\$1,000s|thousands of dollars", txt, ignore.case = TRUE)
|
||||||
}
|
}
|
||||||
|
|
||||||
expect_true(says_units(testthat::test_path("..", "..", "README.md")))
|
for (path in docs) expect_true(says_units(path))
|
||||||
expect_true(says_units(testthat::test_path("..", "..", "vignettes", "total-spending.Rmd")))
|
|
||||||
expect_true(says_units(testthat::test_path("..", "..", "vignettes",
|
|
||||||
"population-denominators.Rmd")))
|
|
||||||
|
|
||||||
# Pin the documented claim to the actual behaviour, so the two cannot drift.
|
# Pin the documented claim to the actual behaviour, so the two cannot drift.
|
||||||
# The expected raw amount is read straight from the corpus's parquet
|
# The expected raw amount is read straight from the corpus's parquet
|
||||||
|
|||||||
@@ -14,8 +14,15 @@
|
|||||||
|
|
||||||
test_that("cog_peer_compare() documents that summary_* rows are per-category quantiles", {
|
test_that("cog_peer_compare() documents that summary_* rows are per-category quantiles", {
|
||||||
|
|
||||||
rd <- paste(readLines(testthat::test_path("..", "..", "man", "cog_peer_compare.Rd"),
|
# man/ ships only in the source tree (the installed package carries a
|
||||||
warn = FALSE), collapse = " ")
|
# compiled help database instead), so the prose assertions below cannot run
|
||||||
|
# under R CMD check -- CI's earlier testthat::test_local() step enforces
|
||||||
|
# them. The numeric pin further down needs only the corpus, but it lives in
|
||||||
|
# the same test_that() as the sentence it protects, deliberately: they are
|
||||||
|
# one claim, and splitting them would let the prose drift while a separate
|
||||||
|
# test kept passing.
|
||||||
|
rd_path <- skip_if_no_source_tree(c("man", "cog_peer_compare.Rd"))
|
||||||
|
rd <- paste(readLines(rd_path, warn = FALSE), collapse = " ")
|
||||||
|
|
||||||
# The @return section must say the quantile is computed within each cell...
|
# The @return section must say the quantile is computed within each cell...
|
||||||
expect_match(rd, "within each|per-category|per category", ignore.case = TRUE)
|
expect_match(rd, "within each|per-category|per category", ignore.case = TRUE)
|
||||||
|
|||||||
Reference in New Issue
Block a user