# test-coverage-final-6.R
# Tests for "package not installed" fallback paths using mocked has_package()
# Covers: input-igraph.R:18-20,93-95,122-124, input-qgraph.R:18-20,
# input-statnet.R:18-20, from-qgraph.R:21,27,33,39,
# shapes-svg.R:95-98,156-164,227-233
# Helper: create a mock has_package that blocks specific packages
mock_has_pkg <- function(blocked_pkgs) {
force(blocked_pkgs)
function(pkg) {
if (pkg %in% blocked_pkgs) return(FALSE)
requireNamespace(pkg, quietly = TRUE)
}
}
# ============================================
# input-igraph.R: has_package("igraph") fallbacks
# ============================================
test_that("parse_igraph errors when igraph not available", {
local_mocked_bindings(
has_package = mock_has_pkg("igraph"),
.package = "cograph"
)
expect_error(
cograph:::parse_igraph(structure(list(), class = "igraph")),
"igraph.*required"
)
})
test_that("apply_igraph_layout errors when igraph not available", {
local_mocked_bindings(
has_package = mock_has_pkg("igraph"),
.package = "cograph"
)
mat <- matrix(c(0, 1, 1, 0), nrow = 2)
net <- CographNetwork$new(mat)
expect_error(
cograph:::apply_igraph_layout(net, identity),
"igraph.*required"
)
})
test_that("apply_igraph_layout_by_name errors when igraph not available", {
local_mocked_bindings(
has_package = mock_has_pkg("igraph"),
.package = "cograph"
)
mat <- matrix(c(0, 1, 1, 0), nrow = 2)
net <- CographNetwork$new(mat)
expect_error(
cograph:::apply_igraph_layout_by_name(net, "fr"),
"igraph.*required"
)
})
# ============================================
# input-qgraph.R: has_package("qgraph") fallback
# ============================================
test_that("parse_qgraph errors when qgraph not available", {
local_mocked_bindings(
has_package = mock_has_pkg("qgraph"),
.package = "cograph"
)
expect_error(
cograph:::parse_qgraph(structure(list(), class = "qgraph")),
"qgraph.*required"
)
})
# ============================================
# input-statnet.R: has_package("network") fallback
# ============================================
test_that("parse_statnet errors when network not available", {
local_mocked_bindings(
has_package = mock_has_pkg("network"),
.package = "cograph"
)
expect_error(
cograph:::parse_statnet(structure(list(), class = "network")),
"network.*required"
)
})
# ============================================
# from-qgraph.R: RColorBrewer/colorspace fallbacks (lines 21, 27, 33, 39)
# ============================================
test_that("tna_color_palette uses hcl.colors fallback for 1-2 states", {
local_mocked_bindings(
has_package = mock_has_pkg(c("RColorBrewer", "colorspace")),
.package = "cograph"
)
colors <- cograph:::tna_color_palette(2)
expect_length(colors, 2)
expect_true(all(nchar(colors) > 0))
})
test_that("tna_color_palette uses hcl.colors fallback for 3-8 states", {
local_mocked_bindings(
has_package = mock_has_pkg(c("RColorBrewer", "colorspace")),
.package = "cograph"
)
colors <- cograph:::tna_color_palette(5)
expect_length(colors, 5)
})
test_that("tna_color_palette uses hcl.colors fallback for 9-12 states", {
local_mocked_bindings(
has_package = mock_has_pkg(c("RColorBrewer", "colorspace")),
.package = "cograph"
)
colors <- cograph:::tna_color_palette(10)
expect_length(colors, 10)
})
test_that("tna_color_palette uses hcl.colors fallback for 13+ states", {
local_mocked_bindings(
has_package = mock_has_pkg(c("RColorBrewer", "colorspace")),
.package = "cograph"
)
colors <- cograph:::tna_color_palette(15)
expect_length(colors, 15)
})
# ============================================
# shapes-svg.R: grImport2/rsvg fallback paths
# ============================================
test_that("parse_svg warns when grImport2 not available", {
local_mocked_bindings(
has_package = mock_has_pkg("grImport2"),
.package = "cograph"
)
svg_data <- list(
source = "",
is_file = FALSE,
parsed = NULL
)
expect_warning(
result <- cograph:::parse_svg(svg_data),
"grImport2.*required"
)
expect_null(result)
})
test_that("draw_svg_shape falls back to circle when parse_svg returns NULL", {
skip_if_not_installed("grid")
local_mocked_bindings(
has_package = mock_has_pkg("grImport2"),
.package = "cograph"
)
svg_data <- list(
source = "",
is_file = FALSE,
parsed = NULL
)
result <- with_temp_png({
grid::grid.newpage()
grob <- suppressWarnings(
cograph:::draw_svg_shape(
x = 0.5, y = 0.5, size = 0.1,
svg_data = svg_data,
fill = "red", border_color = "black",
border_width = 1, alpha = 1
)
)
grob
})
# Should return a circleGrob fallback
expect_true(grid::is.grob(result))
})
test_that("draw_svg_shape_base falls back to circle when rsvg not available", {
local_mocked_bindings(
has_package = mock_has_pkg("rsvg"),
.package = "cograph"
)
svg_data <- list(
source = "",
is_file = FALSE,
parsed = NULL
)
with_temp_png({
plot.new()
plot.window(xlim = c(0, 1), ylim = c(0, 1))
cograph:::draw_svg_shape_base(
x = 0.5, y = 0.5, size = 0.05,
svg_data = svg_data,
fill = "blue", border_color = "black",
border_width = 1
)
})
expect_true(TRUE) # No error = success
})