test_that("clean() removes all output files generated by scripts", { temp_dir <- tempdir() old_wd <- getwd() setwd(temp_dir) writeLines("# Bakepipe root marker", "_bakepipe.R") writeLines("data,value\nA,1\nB,2", "input.csv") script1_content <- ' library(bakepipe) data <- read.csv(file_in("input.csv")) data$processed <- data$value * 2 write.csv(data, file_out("intermediate.csv"), row.names = FALSE) ' writeLines(script1_content, "01_process.R") script2_content <- ' library(bakepipe) data <- read.csv(file_in("intermediate.csv")) summary_data <- data.frame(total = sum(data$processed)) write.csv(summary_data, file_out("final.csv"), row.names = FALSE) ' writeLines(script2_content, "02_summarize.R") on.exit({ setwd(old_wd) unlink(c(file.path(temp_dir, "_bakepipe.R"), file.path(temp_dir, "input.csv"), file.path(temp_dir, "01_process.R"), file.path(temp_dir, "02_summarize.R"), file.path(temp_dir, "intermediate.csv"), file.path(temp_dir, "final.csv"))) }) # Run the pipeline to generate output files capture.output(run()) # Verify files were created expect_true(file.exists("intermediate.csv")) expect_true(file.exists("final.csv")) # Clean should remove output files result <- capture.output({result_value <- clean()}); result <- result_value # Verify all output files were removed expect_false(file.exists("intermediate.csv")) expect_false(file.exists("final.csv")) # Verify input files and scripts remain expect_true(file.exists("input.csv")) expect_true(file.exists("01_process.R")) expect_true(file.exists("02_summarize.R")) expect_true(file.exists("_bakepipe.R")) # Verify return value expect_type(result, "character") expect_true("intermediate.csv" %in% result) expect_true("final.csv" %in% result) }) test_that("clean() returns empty vector when no output files exist", { temp_dir <- tempdir() old_wd <- getwd() setwd(temp_dir) writeLines("# Bakepipe root marker", "_bakepipe.R") on.exit({ setwd(old_wd) unlink(file.path(temp_dir, "_bakepipe.R")) }) result <- capture.output({result_value <- clean()}); result <- result_value expect_type(result, "character") expect_length(result, 0) }) test_that("clean() only removes files that exist", { temp_dir <- tempdir() old_wd <- getwd() setwd(temp_dir) writeLines("# Bakepipe root marker", "_bakepipe.R") script_content <- ' library(bakepipe) # This script declares outputs but doesn\'t create them file_out("nonexistent1.csv") file_out("nonexistent2.csv") ' writeLines(script_content, "script.R") on.exit({ setwd(old_wd) unlink(c(file.path(temp_dir, "_bakepipe.R"), file.path(temp_dir, "script.R"))) }) result <- capture.output({result_value <- clean()}); result <- result_value expect_type(result, "character") expect_length(result, 0) }) test_that("clean() handles scripts with no outputs", { temp_dir <- tempdir() old_wd <- getwd() setwd(temp_dir) writeLines("# Bakepipe root marker", "_bakepipe.R") writeLines("data,value\nA,1\nB,2", "input.csv") script_content <- ' library(bakepipe) data <- read.csv(file_in("input.csv")) cat("Processing", nrow(data), "rows\n") ' writeLines(script_content, "process.R") on.exit({ setwd(old_wd) unlink(c(file.path(temp_dir, "_bakepipe.R"), file.path(temp_dir, "input.csv"), file.path(temp_dir, "process.R"))) }) result <- capture.output({result_value <- clean()}); result <- result_value expect_type(result, "character") expect_length(result, 0) }) test_that("clean() removes files that are both inputs and outputs", { temp_dir <- tempdir() old_wd <- getwd() setwd(temp_dir) writeLines("# Bakepipe root marker", "_bakepipe.R") # Create input file that is also declared as output by another script writeLines("input data", "shared.txt") script1_content <- ' library(bakepipe) data <- readLines(file_in("shared.txt")) writeLines(paste("processed:", data), file_out("output1.txt")) ' writeLines(script1_content, "01_process.R") script2_content <- ' library(bakepipe) # This script outputs to the same file that script1 uses as input writeLines("overwritten", file_out("shared.txt")) ' writeLines(script2_content, "02_overwrite.R") on.exit({ setwd(old_wd) unlink(c(file.path(temp_dir, "_bakepipe.R"), file.path(temp_dir, "shared.txt"), file.path(temp_dir, "01_process.R"), file.path(temp_dir, "02_overwrite.R"), file.path(temp_dir, "output1.txt"))) }) # Run pipeline to create outputs capture.output(run()) # Verify both files exist expect_true(file.exists("shared.txt")) expect_true(file.exists("output1.txt")) # Clean should remove all output files, including shared.txt result <- capture.output({result_value <- clean()}); result <- result_value # Both output files should be removed expect_false(file.exists("shared.txt")) expect_false(file.exists("output1.txt")) # Return should include all files that were removed expect_type(result, "character") expect_true("output1.txt" %in% result) expect_true("shared.txt" %in% result) })