library(testthat) library(pfm) context("Create PELMO runs from psm files and execute them") PELMO_base <- system.file("FOCUSPELMO.553", package = "PELMO.installeR") test_archive <- system.file("testdata/FOCUS_PELMO.tar.bz2", package = "pfm") test_dir <- tempdir() untar(test_archive, exdir = test_dir, compressed = "bzip2") runs <- list( list( psm = "Pesticide_D", fbe = c("Por"), vbe = c("Por")), list( psm = "Pesticide_D_1_day_pre_em_every_third_year", pot = c("Cha", "Ham")), list( psm = "Pesticide_D_1_May_every_other_year_mets", win = names(FOCUS_GW_scenarios_2012$names))) # Check if we have wine on the path wine_installed <- system('wine --version', ignore.stdout = TRUE) == 0 test_that("PELMO paths are correctly created", { if (!wine_installed) { skip("A wine installation is needed for this test") } psm_paths = c( PELMO_path(runs[[1]]$psm, "fbe", "Por"), PELMO_path(runs[[2]]$psm, "pot", "Ham"), PELMO_path(runs[[3]]$psm, "win", "Cha")) for (i in seq_along(psm_paths)) { psm_file <- file.path(test_dir, psm_paths[i], paste0(runs[[i]]$psm, ".psm")) expect_true(file.exists(psm_file)) psm_new_location <- file.path(PELMO_base, basename(psm_file)) file.copy(psm_file, psm_new_location, overwrite = TRUE) } }) test_that("PELMO runs are correctly set up", { if (!wine_installed) { skip("A wine installation is needed for this test") } # Prepare runs in analogy to the test archive PELMO_runs(runs, psm_dir = PELMO_base, execute = FALSE, evaluate = FALSE, overwrite = TRUE) # Check that input files are correctly generated in the right location for (run in runs) { psm <- run$psm crops <- setdiff(names(run), "psm") for (crop in crops) { for (scenario in run[[crop]]) { pp <- PELMO_path(psm, crop, scenario) input_new <- readLines(file.path(PELMO_base, "FOCUS", pp, "pelmo.inp")) input_test <- readLines(file.path(test_dir, pp, "pelmo.inp")) # Check if the input files are correctly reproduced expect_identical(input_new, input_test) } } } }) test_that("PELMO runs can be run and give the expected result files", { if (!wine_installed) { skip("A wine installation is needed for this test") } run_PELMO(runs, cores = 7) plm_files <- c("CHEM.PLM", "ECHO.PLM", "KONZCHEM.PLM", "KONZC_A1", "KONZC_B1", "PLNTPEST.plm", "PLOT.PLM", "WASSER.PLM") # Check that if output is the same as in the test archive for (run in runs) { psm <- run$psm crops <- setdiff(names(run), "psm") for (crop in crops) { for (scenario in run[[crop]]) { pp <- PELMO_path(psm, crop, scenario) for (plm in plm_files) { if (file.exists(file.path(test_dir, pp, plm))) { new <- readLines(file.path(PELMO_base, "FOCUS", pp, plm)) test <- readLines(file.path(test_dir, pp, plm)) # Check if the ouput files are correctly reproduced expect_identical(new, test) } } } } } }) pfm_PECgw <- evaluate_PELMO(runs) test_that("PELMO runs are correctly evaluated", { if (!wine_installed) { skip("A wine installation is needed for this test") } # Check that if output is the same as in the test archive for (run in runs) { psm <- run$psm crops <- setdiff(names(run), "psm") for (crop in crops) { for (scenario in run[[crop]]) { pp <- PELMO_path(psm, crop, scenario) period_file <- readLines(file.path(test_dir, pp, "period.plm"), encoding = "latin1") result_lines <- grep("^\tResults for.*in the percolate at 1 m soil depth$", period_file) acronyms <- gsub(".*\\((.*)\\).*", "\\1", period_file[result_lines]) names(result_lines) <- acronyms results <- list() for (acronym in acronyms) { results[[acronym]] <- list() conc_lines <- result_lines[acronym] + 5:24 tmp <- read.table(text = period_file[conc_lines], sep = "\t") results[[acronym]]$periods <- data.frame( period = as.integer(tmp$V2), flux = tmp$V3, percolate = tmp$V4, conc = tmp$V5) tmp80 <- read.table(text = period_file[result_lines[acronym] + 27], sep = "\t") results[[acronym]]$focus <- tmp80[[1, "V5"]] } period_pfm_file <- file.path(PELMO_base, "FOCUS", pp, "period_pfm.rda") load(period_pfm_file) #message(psm, " ", crop, " ", scenario) # Test for equality of all the components separately, # as we need to adapt the tolerance for (acronym in acronyms) { p_pelmo <- results[[acronym]]$periods p_test <- results_pfm[[acronym]]$periods expect_equal(p_test$flux, p_pelmo$flux, tol = 1e-6) expect_equal(p_test$percolate, p_pelmo$percolate) # PELMO sets the concentration to 0 when the percolate is zero. # We get NaN, which is more reasonable, but we need to # take this into account for testing p_test$conc <- ifelse(is.na(p_test$conc), 0, p_test$conc) expect_equal(p_test$conc, p_pelmo$conc, tol = 1e-3, scale = 1) # FOCUS PEC expect_equal(results_pfm[[acronym]]$focus, results[[acronym]]$focus, tol = 1e-3, scale = 1) } } } } }) test_that("PECgw from FOCUS summary files can be reproduced", { if (!wine_installed) { skip("A wine installation is needed for this test") } focus_summary <- list() for (run in runs) { psm <- run$psm focus_summary[[psm]] <- list() crops <- setdiff(names(run), "psm") for (crop in crops) { scenarios <- run[[crop]] # Read contents of summary text file copied from the GUI output. We only # have results for one crop per psm file, so the crop is not in the file # name. sumfile_path <- system.file(paste0("testdata/FOCUS_Summary_", psm, ".txt"), package = "pfm") sumfile <- readLines(sumfile_path, encoding = "latin1") result_anchors <- grep("Results for", sumfile) acronyms <- gsub(".*\\((.*)\\).*", "\\1", sumfile[result_anchors]) names(result_anchors) <- acronyms focus_summary[[psm]][[crop]] <- matrix(nrow = length(scenarios), ncol = length(acronyms), dimnames = list(scenarios, acronyms)) for (acronym in acronyms) { tmp <- sumfile[result_anchors[acronym] + 4 + (1:length(scenarios))] tmp_frame <- read.table(text = tmp, sep = "\t") PECgw <- tmp_frame$V5 focus_summary[[psm]][[crop]][, acronym] <- PECgw } } } expect_equal(pfm_PECgw, focus_summary) })