test_that("can link function calls", {
local_options(
"downlit.package" = "test",
"downlit.topic_index" = c(foo = "bar")
)
expect_equal(href_expr_(foo()), "bar.html")
# even if namespaced
expect_equal(href_expr_(test::foo()), "bar.html")
# but functions with arguments are ignored
expect_equal(href_expr_(foo(1, 2, 3)), NA_character_)
# as are function factories are ignored
expect_equal(href_expr_(foo()(1, 2, 3)), NA_character_)
expect_equal(href_expr_(test::foo()(1, 2, 3)), NA_character_)
})
test_that("base function calls linked", {
expect_equal(href_expr_(median()), href_topic_remote("median", "stats"))
})
test_that("respects options that define current location", {
local_options(
"downlit.topic_index" = c(bar = "bar"),
"downlit.topic_path" = "myref/"
)
# when not in an Rd file, link with topic_path
local_options("downlit.rdname" = "")
expect_equal(href_expr_(bar()), "myref/bar.html")
# don't link to self
local_options("downlit.rdname" = "bar")
expect_equal(href_expr_(bar()), NA_character_)
})
test_that("can link remote objects", {
expect_equal(href_expr_(MASS::abbey), href_topic_remote("abbey", "MASS"))
expect_equal(href_expr_(MASS::addterm()), href_topic_remote("addterm", "MASS"))
expect_equal(href_expr_(MASS::addterm.default()), href_topic_remote("addterm", "MASS"))
expect_equal(href_expr_(base::`::`), href_topic_remote("::", "base"))
# Doesn't exist
expect_equal(href_expr_(MASS::blah), NA_character_)
})
test_that("can link to topics in registered packages", {
local_options("downlit.attached" = "MASS")
expect_equal(href_expr_(addterm()), href_topic_remote("addterm", "MASS"))
expect_equal(href_expr_(?abbey), href_topic_remote("abbey", "MASS"))
# but has to be a function
expect_equal(href_expr_(abbey()), NA_character_)
})
test_that("can link to package names in registered packages", {
expect_equal(
autolink_curly("{downlit}"),
"downlit"
)
expect_equal(autolink_curly("{package}"), NA_character_)
# No curly = no link
expect_equal(autolink_curly(""), NA_character_)
})
test_that("can link to functions in base packages", {
expect_equal(href_expr_(abbreviate()), href_topic_remote("abbreviate", "base"))
expect_equal(href_expr_(median()), href_topic_remote("median", "stats"))
})
test_that("links to home of re-exported functions", {
expect_equal(href_expr_(testthat::`%>%`), href_topic_remote("%>%", "magrittr"))
})
test_that("fails gracely if can't find re-exported function", {
local_options(
"downlit.package" = "downlit",
"downlit.topic_index" = c(foo = "reexports")
)
expect_equal(href_expr_(foo()), NA_character_)
})
test_that("can link to remote pkgdown sites", {
# use autolink() to avoid R CMD check NOTE
expect_equal(autolink_url("pkgdown::add_slug"), href_topic_remote("pkgdown", "add_slug"))
expect_equal(autolink_url("pkgdown::add_slug(1)"), href_topic_remote("pkgdown", "add_slug"))
})
test_that("or local sites, if registered", {
local_options("downlit.local_packages" = c("MASS" = "MASS"))
expect_equal(href_expr_(MASS::abbey), "MASS/reference/abbey.html")
})
test_that("bare bare symbols are not linked", {
expect_equal(autolink_url("%in%"), NA_character_)
expect_equal(autolink_url("foo"), NA_character_)
})
test_that("returns NA for bad inputs", {
expect_equal(autolink_url(""), NA_character_)
expect_equal(autolink_url("a; b"), NA_character_)
expect_equal(autolink_url("1"), NA_character_)
expect_equal(autolink_url("ls *t??ne.pb"), NA_character_)
})
# help --------------------------------------------------------------------
test_that("can link ? calls", {
local_options(
"downlit.package" = "test",
"downlit.topic_index" = c(foo = "foo", "foo-package" = "foo-package")
)
expect_equal(href_expr_(?foo), "foo.html")
expect_equal(href_expr_(?"foo"), "foo.html")
expect_equal(href_expr_(?test::foo), "foo.html")
expect_equal(href_expr_(package?foo), "foo-package.html")
})
test_that("can link help calls", {
local_options(
"downlit.package" = "test",
"downlit.topic_index" = c(foo = "foo", "foo-package" = "foo-package")
)
expect_equal(href_expr_(help("foo")), "foo.html")
expect_equal(href_expr_(help("foo", "test")), "foo.html")
expect_equal(href_expr_(help(package = "MASS")), "https://rdrr.io/pkg/MASS/man")
expect_equal(href_expr_(help()), "https://rdrr.io/r/utils/help.html")
expect_equal(href_expr_(help(a$b)), NA_character_)
})
# library and friends -----------------------------------------------------
test_that("library() linked to package reference", {
skip_on_cran() # in case URLs change
skip_on_os("solaris")
expect_equal(href_expr_(library(rlang)), "https://rlang.r-lib.org")
expect_equal(href_expr_(library(MASS)), "http://www.stats.ox.ac.uk/pub/MASS4/")
})
test_that("except when not possible", {
topic_library <- href_topic("library", "base")
expect_equal(href_expr_(library()), topic_library)
expect_equal(href_expr_(library(doesntexist)), topic_library)
expect_equal(href_expr_(library(package = )), topic_library)
expect_equal(href_expr_(library("x", "y", "z")), topic_library)
})
test_that("requireNamespace doesn't use NSE", {
require_topic <- href_topic("requireNamespace", "base")
expect_equal(href_expr_(requireNamespace(rlang)), require_topic)
expect_equal(href_expr_(requireNamespace("rlang")), "https://rlang.r-lib.org")
})
# vignette ----------------------------------------------------------------
test_that("can link to local articles", {
local_options(
"downlit.package" = "test",
"downlit.article_index" = c(x = "y.html"),
"downlit.article_path" = "my_path/",
)
expect_equal(href_expr_(vignette("x")), "my_path/y.html")
expect_equal(href_expr_(vignette("x", package = "test")), "my_path/y.html")
expect_equal(href_expr_(vignette("y")), NA_character_)
})
test_that("can link to bioconductor vignettes", {
skip_if_not_installed("MassSpecWavelet")
skip_on_cran()
# Varies between .html and .pdf based on R version
expect_equal(
tools::file_path_sans_ext(href_expr_(vignette("MassSpecWavelet", "MassSpecWavelet"))),
"https://bioconductor.org/packages/release/bioc/vignettes/MassSpecWavelet/inst/doc/MassSpecWavelet"
)
})
test_that("can link to remote articles", {
skip_on_cran()
expect_equal(
href_expr_(vignette("sha1", "digest")),
"https://cran.rstudio.com/web/packages/digest/vignettes/sha1.html"
)
expect_equal(href_expr_(vignette("blah1", "digest")), NA_character_)
expect_equal(
href_expr_(vignette(package = "digest", "sha1")),
"https://cran.rstudio.com/web/packages/digest/vignettes/sha1.html"
)
expect_equal(
href_expr_(vignette("custom-expectation", "testthat")),
"https://testthat.r-lib.org/articles/custom-expectation.html"
)
})
test_that("or local sites, if registered", {
local_options("downlit.local_packages" = c("digest" = "digest"))
expect_equal(href_expr_(vignette("sha1", "digest")), "digest/articles/sha1.html")
})
test_that("looks in attached packages", {
local_options("downlit.attached" = c("grid", "digest"))
expect_equal(
href_expr_(vignette("sha1")),
"https://cran.rstudio.com/web/packages/digest/vignettes/sha1.html"
)
expect_equal(
href_expr_(vignette("moveline")),
"https://cran.rstudio.com/web/packages/grid/vignettes/moveline.pdf"
)
})
test_that("fail gracefully with non-working calls", {
expect_equal(href_expr_(vignette()), "https://rdrr.io/r/utils/vignette.html")
expect_equal(href_expr_(vignette(package = package)), NA_character_)
expect_equal(href_expr_(vignette(1, 2)), NA_character_)
expect_equal(href_expr_(vignette(, )), NA_character_)
})
test_that("spurious functions are not linked (#889)", {
expect_equal(href_expr_(Authors@R), NA_character_)
expect_equal(href_expr_(content-home.html), NA_character_)
expect_equal(href_expr_(toc: depth), NA_character_)
})
test_that("autolink generates HTML if linkable", {
expect_equal(
autolink("stats::median()"),
"stats::median()"
)
expect_equal(autolink("1 +"), NA_character_)
})
test_that("href_package can handle non-existing packages", {
expect_equal(href_package("NotAPackage"), NA_character_)
})
# find_reexport_source ----------------------------------------------------
test_that("can find functions", {
expect_equal(find_reexport_source(is.null), "base")
expect_equal(find_reexport_source(mean), "base")
})
test_that("can find other objects", {
expect_equal(find_reexport_source(na_cpl, "downlit", "na_cpl"), "rlang")
expect_equal(find_reexport_source(na_cpl, "downlit", "MISSING"), NA_character_)
})