tests/testthat/test-ggplot2.R

# --- geom_latex() ---

test_that("geom_latex creates layers and renders with various options", {
  skip_if_not_installed("ggplot2")

  df <- data.frame(x = 1:3, y = 1:3,
                   eq = c("x^2", "\\frac{a}{b}", "\\sum_{i=1}^n x_i"))
  p <- ggplot2::ggplot(df, ggplot2::aes(x, y, label = eq)) + geom_latex()
  expect_s3_class(p, "gg")

  # Renders without error (also covers fontsize, path mode, math_font)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)
  expect_no_error(ggplot2::ggsave(tmp, p, width = 6, height = 4, dpi = 72))

  # NA label handling
  df_na <- data.frame(x = 1:2, y = 1:2, eq = c("x^2", NA))
  p_na <- ggplot2::ggplot(df_na, ggplot2::aes(x, y, label = eq)) +
    geom_latex(render_mode = "path", na.rm = TRUE)
  expect_no_error(ggplot2::ggsave(tmp, p_na, width = 6, height = 4, dpi = 72))
})

# --- annotate('latex') ---

test_that("annotate('latex') renders on a plot", {
  skip_if_not_installed("ggplot2")

  p <- ggplot2::ggplot(mtcars, ggplot2::aes(wt, mpg)) +
    ggplot2::geom_point() +
    ggplot2::annotate("latex", x = 4, y = 30,
                      label = "\\hat{y} = \\beta_0 + \\beta_1 x",
                      size = 12, colour = "red")
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)
  expect_no_error(ggplot2::ggsave(tmp, p, width = 6, height = 4, dpi = 72))
})

# --- element_latex() ---

test_that("element_latex works as theme element", {
  skip_if_not_installed("ggplot2")

  el <- element_latex(fontsize = 18, render_mode = "path")
  expect_true(inherits(el, "S7_object"))
  expect_equal(el@render_mode, "path")

  # Merge with parent
  merged <- ggplot2::merge_element(el, ggplot2::element_text(colour = "blue"))
  expect_equal(merged@colour, "blue")

  # Renders axis title + labels
  p <- ggplot2::ggplot(mtcars, ggplot2::aes(wt, mpg)) +
    ggplot2::geom_point() +
    ggplot2::labs(x = "$\\beta_1 \\cdot x + \\beta_0$") +
    ggplot2::scale_x_continuous(labels = function(x) paste0("$", x, "^2$")) +
    ggplot2::theme(axis.title.x = element_latex(),
                   axis.text.x = element_latex())
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)
  expect_no_error(ggplot2::ggsave(tmp, p, width = 6, height = 4, dpi = 72))
})

# --- .element_grob_latex() internals ---

test_that(".element_grob_latex handles edge cases and multiple labels", {
  skip_if_not_installed("ggplot2")

  # NULL/empty → nullGrob
  expect_true(inherits(
    gridmicrotex:::.element_grob_latex(element_latex(), label = NULL), "null"))
  expect_true(inherits(
    gridmicrotex:::.element_grob_latex(element_latex(), label = ""), "null"))

  # Single label + dollar stripping
  result <- gridmicrotex:::.element_grob_latex(element_latex(), label = "$x^2$")
  expect_s3_class(result, "latexgrob")

  # Multiple labels with NA/empty skipped
  result_multi <- gridmicrotex:::.element_grob_latex(
    element_latex(), label = c("x_1", NA, "", "x_4"))
  expect_equal(length(result_multi$children), 2)
})

Try the gridmicrotex package in your browser

Any scripts or data that you put into this service are public.

gridmicrotex documentation built on May 16, 2026, 5:06 p.m.