tests/testthat/test-coverage-output-save-41.R

# test-coverage-output-save-41.R - Additional Coverage Tests for output-save.R
# Targets uncovered code paths to improve coverage from 86%

skip_on_cran()

# ============================================
# SN_SAVE() - SVG FORMAT EDGE CASES
# ============================================

test_that("sn_save() creates SVG with custom dimensions", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".svg")
  on.exit(unlink(tmp), add = TRUE)

  # Skip if SVG device not available
  result <- tryCatch({
    grDevices::svg(tmp)
    grDevices::dev.off()
    TRUE
  }, warning = function(w) {
    if (grepl("cairo|X11", conditionMessage(w), ignore.case = TRUE)) FALSE else TRUE
  }, error = function(e) FALSE)

  if (!result) skip("SVG device not available on this system")

  unlink(tmp)
  expect_message(sn_save(net, tmp, width = 12, height = 8), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() creates SVG with title", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".svg")
  on.exit(unlink(tmp), add = TRUE)

  # Skip if SVG device not available
  result <- tryCatch({
    grDevices::svg(tmp)
    grDevices::dev.off()
    TRUE
  }, warning = function(w) {
    if (grepl("cairo|X11", conditionMessage(w), ignore.case = TRUE)) FALSE else TRUE
  }, error = function(e) FALSE)

  if (!result) skip("SVG device not available on this system")

  unlink(tmp)
  expect_message(sn_save(net, tmp, title = "SVG Network Plot"), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - EPS FORMAT EDGE CASES
# ============================================

test_that("sn_save() creates EPS with custom dimensions", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".eps")
  on.exit(unlink(tmp), add = TRUE)

  # PostScript devices can fail with font family issues
  result <- tryCatch({
    suppressWarnings(sn_save(net, tmp, width = 10, height = 8))
    TRUE
  }, error = function(e) {
    if (grepl("font|family|postscript", conditionMessage(e), ignore.case = TRUE)) {
      FALSE
    } else {
      stop(e)
    }
  })

  if (!result) skip("PostScript device has font issues on this system")
  expect_file_created(tmp)
})

test_that("sn_save() creates EPS with title", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".eps")
  on.exit(unlink(tmp), add = TRUE)

  # PostScript devices can fail with font family issues
  result <- tryCatch({
    suppressWarnings(sn_save(net, tmp, title = "EPS Network"))
    TRUE
  }, error = function(e) {
    if (grepl("font|family|postscript", conditionMessage(e), ignore.case = TRUE)) {
      FALSE
    } else {
      stop(e)
    }
  })

  if (!result) skip("PostScript device has font issues on this system")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - PS FORMAT EDGE CASES
# ============================================

test_that("sn_save() creates PS with custom dimensions", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".ps")
  on.exit(unlink(tmp), add = TRUE)

  # PostScript devices can fail with font family issues
  result <- tryCatch({
    suppressWarnings(sn_save(net, tmp, width = 8, height = 6))
    TRUE
  }, error = function(e) {
    if (grepl("font|family|postscript", conditionMessage(e), ignore.case = TRUE)) {
      FALSE
    } else {
      stop(e)
    }
  })

  if (!result) skip("PostScript device has font issues on this system")
  expect_file_created(tmp)
})

test_that("sn_save() creates PS with title", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".ps")
  on.exit(unlink(tmp), add = TRUE)

  # PostScript devices can fail with font family issues
  result <- tryCatch({
    suppressWarnings(sn_save(net, tmp, title = "PS Network"))
    TRUE
  }, error = function(e) {
    if (grepl("font|family|postscript", conditionMessage(e), ignore.case = TRUE)) {
      FALSE
    } else {
      stop(e)
    }
  })

  if (!result) skip("PostScript device has font issues on this system")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - TIFF FORMAT EDGE CASES
# ============================================

test_that("sn_save() creates TIFF with custom DPI", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".tiff")
  on.exit(unlink(tmp), add = TRUE)

  # Suppress compression warning on macOS/quartz
  suppressWarnings(expect_message(sn_save(net, tmp, dpi = 150), "Saved"))
  expect_file_created(tmp)
})

test_that("sn_save() creates TIFF with title", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".tiff")
  on.exit(unlink(tmp), add = TRUE)

  # Suppress compression warning on macOS/quartz
  suppressWarnings(expect_message(sn_save(net, tmp, title = "TIFF Network"), "Saved"))
  expect_file_created(tmp)
})

test_that("sn_save() creates TIFF with non-square dimensions", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".tiff")
  on.exit(unlink(tmp), add = TRUE)

  # Suppress compression warning on macOS/quartz
  suppressWarnings(expect_message(sn_save(net, tmp, width = 10, height = 6), "Saved"))
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - JPEG FORMAT EDGE CASES
# ============================================

test_that("sn_save() creates JPEG with custom DPI", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".jpeg")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp, dpi = 150), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() creates JPEG with title", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".jpeg")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp, title = "JPEG Network"), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() creates JPG with non-square dimensions", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".jpg")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp, width = 8, height = 4), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - TNA INPUT SUPPORT
# ============================================

test_that("sn_save() handles tna object input", {
  skip_if_no_tna()

  # Create simple tna object
  mat <- matrix(c(
    0, 0.5, 0.3,
    0.2, 0, 0.4,
    0.1, 0.3, 0
  ), nrow = 3, byrow = TRUE)
  rownames(mat) <- colnames(mat) <- c("A", "B", "C")

  tna_obj <- tna::tna(mat)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(tna_obj, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles tna object with PDF output", {
  skip_if_no_tna()

  mat <- matrix(c(
    0, 0.4, 0.2,
    0.3, 0, 0.5,
    0.1, 0.2, 0
  ), nrow = 3, byrow = TRUE)
  rownames(mat) <- colnames(mat) <- c("X", "Y", "Z")

  tna_obj <- tna::tna(mat)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(tna_obj, tmp, title = "TNA Network"), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - ADDITIONAL INPUT TYPES
# ============================================

test_that("sn_save() handles named matrix input", {
  adj <- create_test_matrix(4)
  rownames(adj) <- colnames(adj) <- paste0("Node_", 1:4)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(adj, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles sparse matrix via igraph", {
  skip_if_no_igraph()

  # Create sparse network
  g <- igraph::graph_from_edgelist(matrix(c(1, 2, 2, 3, 3, 1), ncol = 2, byrow = TRUE))
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(g, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles dense network", {
  adj <- create_test_topology("complete", n = 8)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(adj, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - LAYOUT VARIATIONS
# ============================================

test_that("sn_save() handles network with random layout", {
  adj <- create_test_matrix(5)
  net <- cograph(adj, layout = "random", seed = 123)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with custom layout matrix", {
  adj <- create_test_matrix(4)
  custom_layout <- data.frame(
    x = c(0, 1, 0, 1),
    y = c(0, 0, 1, 1)
  )
  net <- cograph(adj, layout = custom_layout)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - EDGE STYLING VARIATIONS
# ============================================

test_that("sn_save() handles network with curved edges", {
  adj <- create_test_matrix(4)
  net <- cograph(adj) |>
    sn_edges(curve_shape = 0.3, curves = "force")
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with edge labels", {
  adj <- create_test_matrix(4, weighted = TRUE)
  net <- cograph(adj)
  net$edges$label <- round(net$edges$weight, 2)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with varying edge widths", {
  adj <- create_test_matrix(4, weighted = TRUE)
  net <- cograph(adj) |>
    sn_edges(width = abs(adj[adj != 0]) * 3)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - NODE STYLING VARIATIONS
# ============================================

test_that("sn_save() handles network with varying node sizes", {
  adj <- create_test_matrix(5)
  net <- cograph(adj) |>
    sn_nodes(size = c(0.08, 0.10, 0.12, 0.14, 0.16))
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with node labels", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  net$nodes$label <- paste0("State ", 1:4)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with alpha transparency", {
  adj <- create_test_matrix(4)
  net <- cograph(adj) |>
    sn_nodes(alpha = 0.7) |>
    sn_edges(alpha = 0.5)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE_GGPLOT() - ADDITIONAL FORMATS
# ============================================

test_that("sn_save_ggplot() creates TIFF file", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".tiff")
  on.exit(unlink(tmp), add = TRUE)

  suppressWarnings(expect_message(sn_save_ggplot(net, tmp, dpi = 100), "Saved"))
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() creates EPS file", {
  skip_if_not_installed("ggplot2")
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".eps")
  on.exit(unlink(tmp), add = TRUE)

  # EPS/PostScript may have font issues
  result <- tryCatch({
    suppressWarnings(sn_save_ggplot(net, tmp))
    TRUE
  }, error = function(e) {
    if (grepl("font|family|postscript", conditionMessage(e), ignore.case = TRUE)) {
      FALSE
    } else {
      stop(e)
    }
  })

  if (!result) skip("PostScript device has font issues on this system")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() creates PS file", {
  skip_if_not_installed("ggplot2")
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".ps")
  on.exit(unlink(tmp), add = TRUE)

  # PostScript may have font issues
  result <- tryCatch({
    suppressWarnings(sn_save_ggplot(net, tmp))
    TRUE
  }, error = function(e) {
    if (grepl("font|family|postscript", conditionMessage(e), ignore.case = TRUE)) {
      FALSE
    } else {
      stop(e)
    }
  })

  if (!result) skip("PostScript device has font issues on this system")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE_GGPLOT() - INPUT VARIATIONS
# ============================================

test_that("sn_save_ggplot() handles network with custom theme", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj) |> sn_theme("minimal")
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles network with dark theme", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj) |> sn_theme("dark")
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp, dpi = 72), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles star topology", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_topology("star", n = 6)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles ring topology", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_topology("ring", n = 7)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp, dpi = 72), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE_GGPLOT() - DIMENSION VARIATIONS
# ============================================

test_that("sn_save_ggplot() handles landscape dimensions", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp, width = 12, height = 6), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles portrait dimensions", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp, width = 5, height = 10, dpi = 72), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles high DPI", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(3)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp, width = 4, height = 4, dpi = 300), "Saved")
  expect_file_created(tmp)
  # High DPI should create larger file
  expect_true(file.size(tmp) > 5000)
})

# ============================================
# SN_SAVE() - ERROR PATH TESTING
# ============================================

test_that("sn_save() provides informative error for unknown format", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".docx")

  expect_error(sn_save(net, tmp), "Unsupported format: docx")
})

test_that("sn_save() provides informative error for html format", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".html")

  expect_error(sn_save(net, tmp), "Unsupported")
})

test_that("sn_save() provides informative error for json format", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".json")

  expect_error(sn_save(net, tmp), "Unsupported")
})

# ============================================
# SN_SAVE() - DEVICE CLEANUP EDGE CASES
# ============================================

test_that("sn_save() properly manages device count across formats", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)

  dev_before <- length(dev.list())

  tmp_pdf <- tempfile(fileext = ".pdf")
  tmp_png <- tempfile(fileext = ".png")
  tmp_jpeg <- tempfile(fileext = ".jpeg")

  on.exit({
    unlink(tmp_pdf)
    unlink(tmp_png)
    unlink(tmp_jpeg)
  }, add = TRUE)

  suppressMessages(sn_save(net, tmp_pdf))
  suppressMessages(sn_save(net, tmp_png))
  suppressMessages(sn_save(net, tmp_jpeg))

  dev_after <- length(dev.list())

  expect_equal(dev_after, dev_before)
  expect_file_created(tmp_pdf)
  expect_file_created(tmp_png)
  expect_file_created(tmp_jpeg)
})

test_that("sn_save() closes device on error in unsupported format", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)

  dev_before <- length(dev.list())

  # This should error but not leave a device open
  expect_error(sn_save(net, "test.xyz"), "Unsupported")

  dev_after <- length(dev.list())
  expect_equal(dev_after, dev_before)
})

# ============================================
# SN_SAVE() - SPECIAL NETWORK CONFIGURATIONS
# ============================================

test_that("sn_save() handles disconnected network", {
  adj <- create_test_topology("disconnected", n = 6)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles path topology", {
  adj <- create_test_topology("path", n = 5)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles very large network", {
  adj <- create_test_matrix(25, density = 0.2)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE_GGPLOT() - SPECIAL CONFIGURATIONS
# ============================================

test_that("sn_save_ggplot() handles disconnected network", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_topology("disconnected", n = 6)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles two-node network", {
  skip_if_not_installed("ggplot2")

  adj <- matrix(c(0, 1, 1, 0), nrow = 2)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles network with self-loops", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  diag(adj) <- 1
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - RETURN VALUE EDGE CASES
# ============================================

test_that("sn_save() returns invisible filename for all formats", {
  adj <- create_test_matrix(3)
  net <- cograph(adj)

  # Test PDF
  tmp_pdf <- tempfile(fileext = ".pdf")
  result_pdf <- suppressMessages(sn_save(net, tmp_pdf))
  expect_equal(result_pdf, tmp_pdf)
  expect_true(is.character(result_pdf))

  # Test PNG
  tmp_png <- tempfile(fileext = ".png")
  result_png <- suppressMessages(sn_save(net, tmp_png))
  expect_equal(result_png, tmp_png)
  expect_true(is.character(result_png))

  # Test JPEG
  tmp_jpeg <- tempfile(fileext = ".jpeg")
  result_jpeg <- suppressMessages(sn_save(net, tmp_jpeg))
  expect_equal(result_jpeg, tmp_jpeg)
  expect_true(is.character(result_jpeg))

  on.exit({
    unlink(tmp_pdf)
    unlink(tmp_png)
    unlink(tmp_jpeg)
  }, add = TRUE)
})

test_that("sn_save_ggplot() returns invisible filename for all formats", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(3)
  net <- cograph(adj)

  # Test PDF
  tmp_pdf <- tempfile(fileext = ".pdf")
  result_pdf <- suppressMessages(sn_save_ggplot(net, tmp_pdf))
  expect_equal(result_pdf, tmp_pdf)
  expect_true(is.character(result_pdf))

  # Test PNG
  tmp_png <- tempfile(fileext = ".png")
  result_png <- suppressMessages(sn_save_ggplot(net, tmp_png, dpi = 72))
  expect_equal(result_png, tmp_png)
  expect_true(is.character(result_png))

  on.exit({
    unlink(tmp_pdf)
    unlink(tmp_png)
  }, add = TRUE)
})

# ============================================
# SN_SAVE() - FILENAME EDGE CASES
# ============================================

test_that("sn_save() handles filename with unicode characters", {
  skip_on_cran()

  adj <- create_test_matrix(4)
  net <- cograph(adj)

  tmp_dir <- create_temp_dir()
  on.exit(unlink(tmp_dir, recursive = TRUE), add = TRUE)

  # Simple unicode in filename
  filepath <- file.path(tmp_dir, "network_test.pdf")

  expect_message(sn_save(net, filepath), "Saved")
  expect_file_created(filepath)
})

test_that("sn_save() handles filename with numbers", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)

  tmp_dir <- create_temp_dir()
  on.exit(unlink(tmp_dir, recursive = TRUE), add = TRUE)

  filepath <- file.path(tmp_dir, "network_123_v2.pdf")

  expect_message(sn_save(net, filepath), "Saved")
  expect_file_created(filepath)
})

test_that("sn_save() handles deeply nested directory", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)

  tmp_dir <- create_temp_dir()
  nested_dir <- file.path(tmp_dir, "level1", "level2", "level3")
  dir.create(nested_dir, recursive = TRUE)
  on.exit(unlink(tmp_dir, recursive = TRUE), add = TRUE)

  filepath <- file.path(nested_dir, "network.pdf")

  expect_message(sn_save(net, filepath), "Saved")
  expect_file_created(filepath)
})

# ============================================
# SN_SAVE() - NULL TITLE HANDLING
# ============================================

test_that("sn_save() handles NULL title explicitly", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp, title = NULL), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save_ggplot() handles NULL title explicitly", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save_ggplot(net, tmp, title = NULL), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - IGRAPH INPUT EDGE CASES
# ============================================

test_that("sn_save() handles igraph bipartite network", {
  skip_if_no_igraph()

  # Create bipartite graph
  g <- igraph::make_bipartite_graph(c(0, 0, 1, 1, 1), c(1, 3, 1, 4, 2, 5, 2, 4))
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(g, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles igraph named graph", {
  skip_if_no_igraph()

  g <- igraph::make_ring(5)
  igraph::V(g)$name <- c("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(g, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles igraph with node attributes", {
  skip_if_no_igraph()

  g <- igraph::make_star(5, mode = "undirected")
  igraph::V(g)$color <- c("red", "blue", "green", "yellow", "purple")
  igraph::V(g)$size <- c(30, 20, 20, 20, 20)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(g, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - WEIGHTED NETWORK VARIATIONS
# ============================================

test_that("sn_save() handles network with all same weights", {
  adj <- matrix(0.5, 4, 4)
  diag(adj) <- 0
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with very small weights", {
  adj <- create_test_matrix(4, weighted = TRUE)
  adj <- adj * 0.001  # Make weights very small
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".png")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

test_that("sn_save() handles network with very large weights", {
  adj <- create_test_matrix(4, weighted = TRUE)
  adj <- adj * 1000  # Make weights very large
  net <- cograph(adj)
  tmp <- tempfile(fileext = ".pdf")
  on.exit(unlink(tmp), add = TRUE)

  expect_message(sn_save(net, tmp), "Saved")
  expect_file_created(tmp)
})

# ============================================
# SN_SAVE() - MULTIPLE SEQUENTIAL SAVES
# ============================================

test_that("sn_save() handles rapid sequential saves", {
  adj <- create_test_matrix(4)
  net <- cograph(adj)

  files <- vapply(1:5, function(i) {
    tmp <- tempfile(fileext = ".pdf")
    suppressMessages(sn_save(net, tmp))
    tmp
  }, character(1))

  on.exit(unlink(files), add = TRUE)

  # All files should be created
  lapply(files, expect_file_created)
})

test_that("sn_save_ggplot() handles rapid sequential saves", {
  skip_if_not_installed("ggplot2")

  adj <- create_test_matrix(4)
  net <- cograph(adj)

  files <- vapply(1:3, function(i) {
    tmp <- tempfile(fileext = ".pdf")
    suppressMessages(sn_save_ggplot(net, tmp))
    tmp
  }, character(1))

  on.exit(unlink(files), add = TRUE)

  # All files should be created
  lapply(files, expect_file_created)
})

Try the cograph package in your browser

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

cograph documentation built on April 1, 2026, 1:07 a.m.