jigsawR / inst /scripts /test_hexagonal_individual.R
pjt222's picture
Upload folder using huggingface_hub
e232e39 verified
#!/usr/bin/env Rscript
# Test hexagonal individual pieces generation
cat("=== Testing Hexagonal Individual Pieces Generation ===\n\n")
# Source dependencies
source("R/logging.R")
source("R/config_utils.R")
source("R/hexagonal_puzzle.R")
source("R/hexagonal_topology.R")
source("R/hexagonal_neighbors.R")
source("R/hexagonal_bezier_generation.R")
source("R/hexagonal_edge_generation_fixed.R")
source("R/hexagonal_individual_pieces.R")
# Test 1: Generate individual pieces
cat("--- Test 1: Generate individual hexagonal pieces ---\n")
result <- tryCatch({
pieces <- generate_hexagonal_individual_pieces(
rings = 3,
seed = 42,
diameter = 240,
output_dir = "output/hex_individual_test",
save_combined = TRUE,
save_individual = TRUE
)
cat(sprintf(" Generated %d pieces\n", pieces$parameters$num_pieces))
cat(sprintf(" Individual files: %d\n", length(pieces$files$individual)))
cat(sprintf(" Combined file: %s\n", pieces$files$combined))
# Check that files were created
if (length(pieces$files$individual) == pieces$parameters$num_pieces) {
cat(" PASS: Correct number of individual files\n")
} else {
cat(" FAIL: Wrong number of individual files\n")
}
if (!is.null(pieces$files$combined) && file.exists(pieces$files$combined)) {
cat(" PASS: Combined file exists\n")
} else {
cat(" FAIL: Combined file missing\n")
}
"PASS"
}, error = function(e) {
cat(sprintf(" ERROR: %s\n", conditionMessage(e)))
"FAIL"
})
# Test 2: Verify piece structure
cat("\n--- Test 2: Verify piece structure ---\n")
if (exists("pieces") && !is.null(pieces$pieces)) {
p1 <- pieces$pieces[[1]]
cat(sprintf(" Piece 1 has path: %s\n", if (!is.null(p1$path)) "YES" else "NO"))
cat(sprintf(" Piece 1 center: (%.2f, %.2f)\n", p1$center_x, p1$center_y))
cat(sprintf(" Piece 1 ring: %d\n", p1$ring))
cat(sprintf(" Piece 1 type: %s\n", p1$type))
# Check that paths are valid SVG
if (grepl("^M ", p1$path) && grepl("Z$", p1$path)) {
cat(" PASS: Path is valid SVG (starts with M, ends with Z)\n")
} else {
cat(" FAIL: Path format incorrect\n")
}
# Check for bezier curves
if (grepl("C ", p1$path)) {
cat(" PASS: Path contains bezier curves\n")
} else {
cat(" FAIL: Path missing bezier curves\n")
}
}
# Test 3: Verify adjacent pieces have complementary edges
cat("\n--- Test 3: Verify complementary edges ---\n")
if (exists("pieces") && length(pieces$pieces) >= 7) {
# Center piece (1) is adjacent to pieces 2-7
# Check that edges connect properly
p1 <- pieces$pieces[[1]]
p2 <- pieces$pieces[[2]]
# Parse paths to extract control points
# For pieces that share an edge, the bezier control points should match
# (one piece uses forward, the other uses reverse)
cat(" Center piece (1) should connect to ring 1 pieces (2-7)\n")
cat(" Checking edge mapping consistency...\n")
# Generate edge map to verify
edge_data <- generate_hex_edge_map(
rings = 3, seed = 42, diameter = 240
)
cat(sprintf(" Total unique edges: %d\n", edge_data$num_edges))
# Count border vs internal edges
border_count <- 0
internal_count <- 0
for (key in names(edge_data$piece_edge_map)) {
edge <- edge_data$piece_edge_map[[key]]
if (edge$type == "border") {
border_count <- border_count + 1
} else {
internal_count <- internal_count + 1
}
}
cat(sprintf(" Border edges: %d\n", border_count))
cat(sprintf(" Internal edges: %d\n", internal_count))
# For 3 rings: 19 pieces, each with 6 sides = 114 total sides
# Internal edges are shared (counted twice), border edges counted once
expected_total <- 3 * 3 * (3 - 1) + 1 # 19 pieces
cat(sprintf(" Expected pieces: %d, Got: %d\n", expected_total, length(pieces$pieces)))
if (length(pieces$pieces) == expected_total) {
cat(" PASS: Correct number of pieces\n")
} else {
cat(" FAIL: Wrong number of pieces\n")
}
}
# Test 4: Test different ring counts
cat("\n--- Test 4: Test different ring counts ---\n")
for (rings in 2:4) {
expected_pieces <- 3 * rings * (rings - 1) + 1
result <- tryCatch({
test_pieces <- generate_hex_pieces_with_edge_map(
rings = rings, seed = 123, diameter = 200,
separated = FALSE
)
if (length(test_pieces) == expected_pieces) {
cat(sprintf(" Rings=%d: PASS (%d pieces)\n", rings, expected_pieces))
} else {
cat(sprintf(" Rings=%d: FAIL (expected %d, got %d)\n",
rings, expected_pieces, length(test_pieces)))
}
}, error = function(e) {
cat(sprintf(" Rings=%d: ERROR - %s\n", rings, conditionMessage(e)))
})
}
# Test 5: Visual verification - create SVG preview
cat("\n--- Test 5: Visual verification ---\n")
cat(" Check output/hex_individual_test/ for SVG files\n")
cat(" - Individual piece files: hexagonal_piece_XX_seed42.svg\n")
cat(" - Combined view: hexagonal_combined_seed42.svg\n")
cat("\n=== Tests Complete ===\n")