Nothing
# test-coverage-mlna-40.R - Comprehensive tests for mlna.R
# Multilevel network visualization function tests
# ============================================
# BASIC INPUT TESTS
# ============================================
skip_on_cran()
test_that("plot_mlna works with basic matrix input", {
set.seed(42)
nodes <- paste0("N", 1:9)
m <- matrix(runif(81, 0, 0.3), 9, 9)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Layer1 = paste0("N", 1:3),
Layer2 = paste0("N", 4:6),
Layer3 = paste0("N", 7:9)
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with two layers", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Top = paste0("N", 1:3),
Bottom = paste0("N", 4:6)
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with four layers", {
set.seed(42)
nodes <- paste0("N", 1:12)
m <- matrix(runif(144, 0, 0.3), 12, 12)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
L1 = paste0("N", 1:3),
L2 = paste0("N", 4:6),
L3 = paste0("N", 7:9),
L4 = paste0("N", 10:12)
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna returns NULL invisibly", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Top = paste0("N", 1:3),
Bottom = paste0("N", 4:6)
)
result <- with_temp_png({
ret <- plot_mlna(m, layers)
ret
})
expect_null(result)
})
test_that("mlna alias works the same as plot_mlna", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Top = paste0("N", 1:3),
Bottom = paste0("N", 4:6)
)
result <- safe_plot(mlna(m, layers))
expect_true(result$success, info = result$error)
})
# ============================================
# INPUT VALIDATION TESTS
# ============================================
test_that("plot_mlna errors when layer_list is NULL and community is NULL", {
m <- matrix(runif(16, 0, 0.3), 4, 4)
expect_error(
plot_mlna(m, layer_list = NULL, community = NULL),
"layer_list or community"
)
})
test_that("plot_mlna errors with less than 2 layers", {
nodes <- paste0("N", 1:4)
m <- matrix(runif(16, 0, 0.3), 4, 4)
colnames(m) <- rownames(m) <- nodes
# Single layer
layers <- list(Only = nodes)
expect_error(
plot_mlna(m, layers),
"2\\+"
)
})
test_that("plot_mlna errors with invalid layer_list type", {
m <- matrix(runif(16, 0, 0.3), 4, 4)
# Not a list
layers <- c("N1", "N2", "N3", "N4")
expect_error(
plot_mlna(m, layers),
"list"
)
})
test_that("plot_mlna errors with overlapping layers", {
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
colnames(m) <- rownames(m) <- nodes
# N3 appears in both layers
layers <- list(
Top = paste0("N", 1:3),
Bottom = paste0("N", 3:6)
)
expect_error(
plot_mlna(m, layers),
"overlap"
)
})
test_that("plot_mlna errors with nodes not in model", {
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
colnames(m) <- rownames(m) <- nodes
# "X1" does not exist
layers <- list(
Top = c("N1", "N2", "X1"),
Bottom = paste0("N", 4:6)
)
expect_error(
plot_mlna(m, layers),
"not found"
)
})
test_that("plot_mlna errors with non-matrix non-tna input", {
layers <- list(
Top = c("A", "B"),
Bottom = c("C", "D")
)
expect_error(
plot_mlna("not a matrix", layers),
"matrix"
)
})
# ============================================
# LAYOUT PARAMETER TESTS
# ============================================
test_that("plot_mlna works with horizontal layout (default)", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layout = "horizontal"))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with circle layout", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layout = "circle"))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with spring layout", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layout = "spring"))
expect_true(result$success, info = result$error)
})
# ============================================
# SPACING AND DIMENSION TESTS
# ============================================
test_that("plot_mlna works with custom layer_spacing", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layer_spacing = 6))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom layer_width", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layer_width = 10))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom layer_depth", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layer_depth = 6))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom skew_angle", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, skew_angle = 45))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom node_spacing", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, node_spacing = 0.5))
expect_true(result$success, info = result$error)
})
# ============================================
# COLOR AND SHAPE TESTS
# ============================================
test_that("plot_mlna works with custom colors", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, colors = c("red", "blue")))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom shapes", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, shapes = c("square", "triangle")))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom edge_colors", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, edge_colors = c("#FF0000", "#0000FF")))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna handles shape diamond", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, shapes = c("diamond", "circle")))
expect_true(result$success, info = result$error)
})
# ============================================
# EDGE DISPLAY TESTS
# ============================================
test_that("plot_mlna works with within_edges = FALSE", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, within_edges = FALSE))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with between_edges = FALSE", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, between_edges = FALSE))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with both edge types disabled", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, within_edges = FALSE, between_edges = FALSE))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with between_style solid", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, between_style = 1))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with between_style dotted", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, between_style = 3))
expect_true(result$success, info = result$error)
})
# ============================================
# VISUAL OPTIONS TESTS
# ============================================
test_that("plot_mlna works with show_border = FALSE", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, show_border = FALSE))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with legend = FALSE", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, legend = FALSE))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with different legend_position options", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
for (pos in c("topright", "topleft", "bottomright", "bottomleft")) {
result <- safe_plot(plot_mlna(m, layers, legend_position = pos))
expect_true(result$success, info = paste("legend_position", pos, "failed:", result$error))
}
})
test_that("plot_mlna works with custom curvature", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, curvature = 0.3))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with custom node_size", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, node_size = 5))
expect_true(result$success, info = result$error)
})
# ============================================
# MINIMUM THRESHOLD TESTS
# ============================================
test_that("plot_mlna works with minimum threshold", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, minimum = 0.1))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with high minimum hiding most edges", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, minimum = 0.25))
expect_true(result$success, info = result$error)
})
# ============================================
# SCALE PARAMETER TESTS
# ============================================
test_that("plot_mlna works with scale parameter", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, scale = 2))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with large scale for high-res output", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, scale = 4))
expect_true(result$success, info = result$error)
})
# ============================================
# COMMUNITY DETECTION TESTS
# ============================================
test_that("plot_mlna works with community parameter (louvain)", {
skip_if_not_installed("igraph")
set.seed(42)
n <- 12
m <- matrix(runif(n*n, 0, 0.3), n, n)
diag(m) <- 0
# Make symmetric for undirected (louvain requires undirected)
m <- (m + t(m)) / 2
# Create some structure for community detection
m[1:4, 1:4] <- m[1:4, 1:4] + 0.3
m[5:8, 5:8] <- m[5:8, 5:8] + 0.3
m[9:12, 9:12] <- m[9:12, 9:12] + 0.3
m <- pmin(m, 1)
colnames(m) <- rownames(m) <- paste0("N", 1:n)
result <- safe_plot(plot_mlna(m, community = "louvain"))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with community parameter (walktrap)", {
skip_if_not_installed("igraph")
set.seed(42)
n <- 12
m <- matrix(runif(n*n, 0, 0.3), n, n)
diag(m) <- 0
# Make symmetric for better community detection
m <- (m + t(m)) / 2
m[1:4, 1:4] <- m[1:4, 1:4] + 0.3
m[5:8, 5:8] <- m[5:8, 5:8] + 0.3
m[9:12, 9:12] <- m[9:12, 9:12] + 0.3
m <- pmin(m, 1)
colnames(m) <- rownames(m) <- paste0("N", 1:n)
result <- safe_plot(plot_mlna(m, community = "walktrap"))
expect_true(result$success, info = result$error)
})
# ============================================
# EDGE CASE TESTS
# ============================================
test_that("plot_mlna works with single node per layer", {
set.seed(42)
nodes <- paste0("N", 1:3)
m <- matrix(runif(9, 0, 0.3), 3, 3)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Layer1 = "N1",
Layer2 = "N2",
Layer3 = "N3"
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with unequal layer sizes", {
set.seed(42)
nodes <- paste0("N", 1:8)
m <- matrix(runif(64, 0, 0.3), 8, 8)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Large = paste0("N", 1:5),
Small = paste0("N", 6:8)
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with zero weight edges", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(0, 6, 6)
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with NA weight values", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
m[1, 2] <- NA
m[3, 4] <- NA
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with matrix without named rows/columns", {
set.seed(42)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
# No rownames/colnames set, will use indices
layers <- list(
Top = c("1", "2", "3"),
Bottom = c("4", "5", "6")
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna handles unnamed layers (NULL names)", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
# Unnamed list
layers <- list(
paste0("N", 1:3),
paste0("N", 4:6)
)
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
# ============================================
# SPRING LAYOUT SPECIFIC TESTS
# ============================================
test_that("plot_mlna spring layout works with strongly connected layer", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.1), 6, 6)
diag(m) <- 0
# Make top layer strongly connected
m[1:3, 1:3] <- 0.8
diag(m[1:3, 1:3]) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layout = "spring"))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna spring layout works with disconnected nodes in layer", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(0, 6, 6)
# Only one edge in top layer
m[1, 2] <- 0.5
m[2, 1] <- 0.5
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, layout = "spring"))
expect_true(result$success, info = result$error)
})
# ============================================
# COMBINED PARAMETER TESTS
# ============================================
test_that("plot_mlna works with multiple customizations", {
set.seed(42)
nodes <- paste0("N", 1:9)
m <- matrix(runif(81, 0, 0.3), 9, 9)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(
Top = paste0("N", 1:3),
Middle = paste0("N", 4:6),
Bottom = paste0("N", 7:9)
)
result <- safe_plot(plot_mlna(
m, layers,
layout = "circle",
layer_spacing = 3,
layer_width = 6,
layer_depth = 3,
skew_angle = 30,
node_spacing = 0.8,
colors = c("#E57373", "#81C784", "#64B5F6"),
shapes = c("circle", "square", "triangle"),
within_edges = TRUE,
between_edges = TRUE,
between_style = 2,
show_border = TRUE,
legend = TRUE,
legend_position = "topleft",
curvature = 0.2,
node_size = 2,
minimum = 0.05
))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with minimal configuration", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(
m, layers,
show_border = FALSE,
legend = FALSE,
within_edges = FALSE,
between_edges = FALSE
))
expect_true(result$success, info = result$error)
})
# ============================================
# SKEW ANGLE BOUNDARY TESTS
# ============================================
test_that("plot_mlna works with zero skew_angle", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, skew_angle = 0))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with large skew_angle", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, skew_angle = 60))
expect_true(result$success, info = result$error)
})
# ============================================
# CURVATURE BOUNDARY TESTS
# ============================================
test_that("plot_mlna works with zero curvature", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, curvature = 0))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna works with high curvature", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.3), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers, curvature = 0.5))
expect_true(result$success, info = result$error)
})
# ============================================
# MAX WEIGHT HANDLING TESTS
# ============================================
test_that("plot_mlna handles uniform weight matrix", {
nodes <- paste0("N", 1:6)
m <- matrix(0.5, 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna handles all-zero max weight gracefully", {
nodes <- paste0("N", 1:6)
m <- matrix(0, 6, 6)
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
# Should not error - max_w will be set to 1 to avoid division by zero
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna handles very small weights", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 0.01), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
test_that("plot_mlna handles very large weights", {
set.seed(42)
nodes <- paste0("N", 1:6)
m <- matrix(runif(36, 0, 100), 6, 6)
diag(m) <- 0
colnames(m) <- rownames(m) <- nodes
layers <- list(Top = paste0("N", 1:3), Bottom = paste0("N", 4:6))
result <- safe_plot(plot_mlna(m, layers))
expect_true(result$success, info = result$error)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.