## Tests for to_gephi(), to_graphml(), to_matrix()
make_small_edges <- function() {
data.frame(
from = c("A", "A", "B"),
to = c("B", "C", "C"),
weight = c(5, 3, 2),
count = c(2L, 1L, 1L),
stringsAsFactors = FALSE
)
}
## ── to_gephi ────────────────────────────────────────────────────────────────
test_that("to_gephi returns list with nodes and edges", {
edges <- make_small_edges()
g <- to_gephi(edges)
expect_true(is.list(g))
expect_true(all(c("nodes", "edges") %in% names(g)))
})
test_that("to_gephi edge table has Gephi column names", {
edges <- make_small_edges()
g <- to_gephi(edges)
expect_true(all(c("Source", "Target", "Weight", "Type") %in% names(g$edges)))
})
test_that("to_gephi node table has Id and Label", {
edges <- make_small_edges()
g <- to_gephi(edges)
expect_true(all(c("Id", "Label") %in% names(g$nodes)))
expect_equal(sort(g$nodes$Id), c("A", "B", "C"))
})
test_that("to_gephi Type is Undirected by default", {
edges <- make_small_edges()
g <- to_gephi(edges)
expect_true(all(g$edges$Type == "Undirected"))
})
test_that("to_gephi Type is Directed when directed=TRUE", {
edges <- make_small_edges()
g <- to_gephi(edges, directed = TRUE)
expect_true(all(g$edges$Type == "Directed"))
})
test_that("to_gephi custom nodes table merges correctly", {
edges <- make_small_edges()
nodes <- data.frame(id = c("A","B","C"), group = c("g1","g1","g2"),
stringsAsFactors = FALSE)
g <- to_gephi(edges, nodes = nodes)
expect_true("group" %in% names(g$nodes))
expect_equal(nrow(g$nodes), 3)
})
test_that("to_gephi $edges is a plain data.frame, not bibnets_network", {
## Regression: previously the renamed Source/Target/Weight columns kept
## the bibnets_network class, causing the S3 print method to look up
## the now-missing $from / $to / $weight and display NA NA NA.
edges <- structure(make_small_edges(), class = c("bibnets_network", "data.frame"),
network_type = "test", counting = "full")
g <- to_gephi(edges)
expect_identical(class(g$edges), "data.frame")
expect_null(attr(g$edges, "network_type"))
expect_null(attr(g$edges, "counting"))
## Print must not produce any NA tokens for from/to/weight
out <- capture.output(print(g$edges))
expect_false(any(grepl("\\bNA\\b", out)))
})
test_that("to_gephi writes CSV files to disk", {
edges <- make_small_edges()
tmp <- tempdir()
paths <- to_gephi(edges, file = tmp)
expect_true(file.exists(file.path(tmp, "nodes.csv")))
expect_true(file.exists(file.path(tmp, "edges.csv")))
## Clean up
file.remove(file.path(tmp, "nodes.csv"), file.path(tmp, "edges.csv"))
})
## ── to_graphml ──────────────────────────────────────────────────────────────
test_that("to_graphml returns a character string", {
edges <- make_small_edges()
xml <- to_graphml(edges)
expect_true(is.character(xml))
expect_equal(length(xml), 1)
})
test_that("to_graphml output starts with XML declaration", {
edges <- make_small_edges()
xml <- to_graphml(edges)
expect_true(startsWith(xml, " tags", {
## Regression: previously NA edge attribute values produced
## NA, which downstream tools treat as a string.
edges <- data.frame(
from = c("A", "B"), to = c("B", "C"),
weight = c(NA_real_, 2),
count = c(1L, NA_integer_),
stringsAsFactors = FALSE
)
xml <- to_graphml(edges)
expect_false(grepl(">NA<", xml, fixed = TRUE))
expect_false(grepl(">NA_real", xml, fixed = TRUE))
## Non-NA values still emitted
expect_true(grepl('2', xml, fixed = TRUE))
expect_true(grepl('1', xml, fixed = TRUE))
})
test_that("to_graphml skips NA node attributes when nodes table has them", {
edges <- make_small_edges()
nodes <- data.frame(id = c("A","B","C"),
community = c(1L, NA_integer_, 2L),
stringsAsFactors = FALSE)
xml <- to_graphml(edges, nodes = nodes)
## Node B has NA community → no tag for that node
expect_false(grepl(">NA<", xml, fixed = TRUE))
})
test_that("to_graphml escapes special characters in node IDs", {
edges <- data.frame(
from = c('Smith & Jones', 'Smith & Jones'),
to = c('Lee <2020>', 'Other'),
weight = c(1, 1),
stringsAsFactors = FALSE
)
xml <- to_graphml(edges)
expect_true(grepl("&", xml, fixed = TRUE))
expect_true(grepl("<", xml, fixed = TRUE))
})
## ── to_matrix ───────────────────────────────────────────────────────────────
test_that("to_matrix returns a matrix or Matrix", {
edges <- make_small_edges()
m <- to_matrix(edges)
## Works with either base matrix or Matrix class
expect_true(is.matrix(m) || inherits(m, "Matrix"))
})
test_that("to_matrix symmetric by default", {
edges <- make_small_edges()
m <- to_matrix(edges)
m_dense <- as.matrix(m)
expect_equal(m_dense, t(m_dense))
})
test_that("to_matrix has correct dimensions and values", {
edges <- make_small_edges()
m <- to_matrix(edges)
m_dense <- as.matrix(m)
expect_equal(nrow(m_dense), 3)
expect_equal(ncol(m_dense), 3)
expect_equal(m_dense["A", "B"], 5)
expect_equal(m_dense["A", "C"], 3)
expect_equal(m_dense["B", "C"], 2)
})