library(htmltools) expect_remote_font <- function(x) { input <- list( list("font-variable" = x), list("body {font-family: $font-variable}") ) tagz <- renderTags(tags$style(sass(input))) # Produces the correct CSS rules expect_snapshot(tagz$html, cran = TRUE) # Produces the right tag via attached dependency expect_snapshot(tagz$dependencies[[1]]$head, cran = TRUE) } test_that("Remote font importing basically works", { # font_link() expect_remote_font(font_link("foo", "bar")) expect_remote_font(font_link("foo", "bar")) # font_face() expect_remote_font(font_face("foo", "bar")) expect_remote_font( font_face( "foo", src = c("bar", "baz"), weight = c(400, 600), display = "auto", style = c("oblique", "30deg", "50deg"), stretch = c("75%", "125%"), unicode_range = c("U+0025-00FF", "U+4??") ) ) # font_google() expect_remote_font(font_google("Pacifico", local = FALSE)) expect_remote_font(font_google("Pacifico", local = FALSE, display = "auto")) expect_remote_font( font_google("Crimson Pro", local = FALSE, wght = "200..900") ) expect_remote_font( font_google("Crimson Pro", local = FALSE, wght = "200..900", ital = 1) ) expect_remote_font( font_google("Crimson Pro", local = FALSE, wght = c(400, 500), ital = 1) ) expect_remote_font( font_google("Crimson Pro", local = FALSE, wght = c(400, 500), ital = c(0, 1)) ) expect_remote_font( font_google("Crimson Pro", local = FALSE, wght = c(600, 400, 500), ital = c(1, 0)) ) }) test_that("font_google(local = TRUE) basically works", { skip_if_offline() scss <- list( list("my-font" = font_google("Pacifico")), list("body {font-family: $my-font}") ) tagz <- renderTags(tags$style(sass(scss))) expect_snapshot(tagz$html, cran = TRUE) src <- tagz$dependencies[[1]]$src$file expect_snapshot_file( dir(src, pattern = "\\.css$", full.names = TRUE), name = "font-css", # Don't run on CRAN since the src is a hash that might get updated cran = FALSE, compare = compare_file_text ) woff <- dir(src, pattern = "\\.woff$", full.names = TRUE) expect_true(length(woff) > 0) # https://github.com/rstudio/bslib/issues/408 scss <- list( list("my-font" = font_google("Crimson Pro")), list("body {font-family: $my-font}") ) tagz <- renderTags(tags$style(sass(scss))) expect_equal(tagz$dependencies[[1]]$name, "Crimson_Pro") }) expect_collection <- function(..., expected) { scss <- as_sass(list(font = font_collection(...))) expect_equal( scss, paste0("$font: ", expected, " !default;"), ignore_attr = TRUE ) } test_that("font_collection() basically works", { expect_collection("foo", expected = "foo") expect_collection( "foo", "bar", expected = "foo, bar" ) expect_collection( "foo", "foo bar", expected = "foo, 'foo bar'" ) expect_collection( "foo", "foo bar, baz", expected = "foo, 'foo bar', baz" ) expect_collection( "foo", c("foo bar", "baz"), expected = "foo, 'foo bar', baz" ) # Don't attempt to quote if , is quoted expect_warning( expect_collection( "foo", "'foo, bar', baz", expected = "foo, 'foo, bar', baz" ), "quote" ) # Can suppress the warning with quote = FALSE expect_warning( expect_collection( "'foo, bar', baz", quote = FALSE, expected = "'foo, bar', baz" ), NA ) expect_collection( font_google("foo bar baz"), "foo", expected = "'foo bar baz', foo" ) expect_collection( font_link("foo bar baz", "link"), "foo", expected = "'foo bar baz', foo" ) expect_collection( font_face("foo bar baz", "..."), "foo", expected = "'foo bar baz', foo" ) }) test_that("Special named args in font_collection", { expect_remote_font( font_collection(google = list("foo", local = FALSE)) ) expect_remote_font( font_collection(link = list("foo", href = "bar")) ) expect_remote_font( font_collection(collection = list(google = list("foo", local = FALSE))) ) expect_error( font_collection(foo = "bar"), "foo" ) expect_error(font_collection(NA)) expect_error(font_collection("")) })