File: test-ggsave.R

package info (click to toggle)
r-cran-ggplot2 3.4.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 8,748 kB
  • sloc: sh: 15; makefile: 5
file content (137 lines) | stat: -rw-r--r-- 4,266 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
test_that("ggsave creates file", {
  path <- tempfile()
  on.exit(unlink(path))

  p <- ggplot(mpg, aes(displ, hwy)) + geom_point()

  expect_false(file.exists(path))
  ggsave(path, p, device = "pdf", width = 5, height = 5)
  expect_true(file.exists(path))
})

test_that("ggsave restores previous graphics device", {
  # When multiple devices are open, dev.off() restores the next one in the list,
  # not the previously-active one. (#2363)
  path <- tempfile()
  on.exit(unlink(path))

  png(tempfile())
  png(tempfile())
  on.exit(graphics.off(), add = TRUE)

  old_dev <- dev.cur()
  p <- ggplot(mpg, aes(displ, hwy)) + geom_point()
  ggsave(path, p, device = "png", width = 5, height = 5)

  expect_identical(old_dev, dev.cur())
})

test_that("ggsave uses theme background as image background", {
  skip_if_not_installed("xml2")

  path <- tempfile()
  on.exit(unlink(path))
  p <- ggplot(mtcars, aes(disp, mpg)) +
    geom_point() +
    coord_fixed() +
    theme(plot.background = element_rect(fill = "#00CCCC"))
  ggsave(path, p, device = "svg", width = 5, height = 5)
  img <- xml2::read_xml(path)
  # Find background rect in svg
  bg <- as.character(xml2::xml_find_first(img, xpath = "d1:rect/@style"))
  expect_true(grepl("fill: #00CCCC", bg))
})

test_that("ggsave can handle blank background", {
  skip_if_not_installed("xml2")

  path <- tempfile()
  on.exit(unlink(path))
  p <- ggplot(mtcars, aes(disp, mpg)) +
    geom_point() +
    theme(plot.background = element_blank())
  ggsave(path, p, device = "svg", width = 5, height = 5)
  img <- xml2::read_xml(path)
  bg <- as.character(xml2::xml_find_first(img, xpath = "d1:rect/@style"))
  expect_true(grepl("fill: none", bg))
})

test_that("ggsave warns about empty or multiple filenames", {
  filenames <- c("plot1.png", "plot2.png")
  plot <- ggplot(mtcars, aes(disp, mpg)) + geom_point()

  withr::with_file(filenames, {
    expect_warning(
      suppressMessages(ggsave(filenames, plot)),
      "`filename` must have length 1"
    )
    expect_error(
      ggsave(character(), plot),
      "`filename` cannot be empty."
    )
  })
})

# plot_dim ---------------------------------------------------------------

test_that("guesses and informs if dim not specified", {
  png(width = 10, height = 10, units = "in", res = 300)
  on.exit(capture.output(dev.off()))

  expect_message(out <- plot_dim(), "10 x 10")
  expect_equal(out, c(10, 10))
})

test_that("uses 7x7 if no graphics device open", {
  expect_equal(plot_dim(), c(7, 7))
})

test_that("warned about large plot unless limitsize = FALSE", {
  expect_error(plot_dim(c(50, 50)), "exceed 50 inches")
  expect_equal(plot_dim(c(50, 50), limitsize = FALSE), c(50, 50))
  expect_error(plot_dim(c(15000, 15000), units = "px"), "in pixels).")
})

test_that("scale multiplies height & width", {
  expect_equal(plot_dim(c(10, 10), scale = 1), c(10, 10))
  expect_equal(plot_dim(c(5, 5), scale = 2), c(10, 10))
})

# plot_dev ---------------------------------------------------------------------

test_that("unknown device triggers error", {
  expect_snapshot_error(plot_dev(1))
  expect_error(plot_dev("xyz"), "Unknown graphics device")
  expect_error(plot_dev(NULL, "test.xyz"), "Unknown graphics device")
})


test_that("text converted to function", {
  expect_identical(body(plot_dev("png"))[[1]], quote(png_dev))
  expect_identical(body(plot_dev("pdf"))[[1]], quote(grDevices::pdf))
})

test_that("if device is NULL, guess from extension", {
  expect_identical(body(plot_dev(NULL, "test.png"))[[1]], quote(png_dev))
})

# parse_dpi ---------------------------------------------------------------

test_that("DPI string values are parsed correctly", {
  expect_type(parse_dpi("print"), "double")
  expect_type(parse_dpi("screen"), "double")
  expect_type(parse_dpi("retina"), "double")
  expect_type(parse_dpi(100), "double")
  expect_type(parse_dpi(300L), "integer")
})

test_that("invalid single-string DPI values throw an error", {
  expect_snapshot_error(parse_dpi("abc"))
})

test_that("invalid non-single-string DPI values throw an error", {
  expect_snapshot_error(parse_dpi(factor(100)))
  expect_snapshot_error(parse_dpi(c("print", "screen")))
  expect_snapshot_error(parse_dpi(c(150, 300)))
  expect_snapshot_error(parse_dpi(list(150)))
})