R version 4.5.0 beta (2025-03-29 r88074 ucrt) -- "How About a Twenty-Six" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > library(future.tests) > library(future) > > lazy <- FALSE > global <- TRUE > stdout <- TRUE > value <- TRUE > recursive <- FALSE > > tests <- load_tests() > message("Number of tests: ", length(tests)) Number of tests: 55 > > df_tests <- do.call(rbind, tests) > print(df_tests) title 1 future() - conditions 2 %<-% - conditions 3 future() - muffle conditions 4 Argument '...' 5 Argument '...' from parent function 6 Argument '...' - non existing 7 Argument '...' - exception 8 Early signaling of errors 9 Early signaling of errors 10 Early signaling of errors 11 Early signaling of errors 12 Early signaling of warnings 13 Early signaling of warnings 14 Early signaling of warnings 15 Early signaling of warnings 16 Early signaling of messages 17 Early signaling of messages 18 Early signaling of messages 19 Early signaling of messages 20 futureAssign() - lazy evaluation 21 futureAssign() - lazy evaluation 22 futureAssign() - potential task name clashes 23 futureAssign() - global variables with and without lazy evaluation 24 futureAssign() - global variables with and without lazy evaluation 25 futureAssign() - lazy evaluation via disposable option 26 futureAssign() - lazy evaluation via disposable option 27 %<-% - local evaluation 28 %<-% - local evaluation 29 %<-% - local evaluation & global variable 30 %<-% - local evaluation & global variable 31 %<-% - errors 32 %<-% - errors 33 %<-% - errors and listenv 34 %<-% - errors and listenv 35 %<-% & %->% 36 %<-% & %->% 37 %<-% - nested 38 futureCall() 39 futureCall() 40 futureCall() 41 futureCall() 42 futureCall() - globals = list(a = 3) 43 futureCall() - globals = list(a = 3) 44 futureCall() - globals = "a" 45 futureCall() - globals = "a" 46 future() - rm() a global variable 47 future() - rm() a global variable 48 future() - non-exported package objects 49 future() - NSE '...' 50 future() - global variables with and without lazy evaluation 51 future() - global variables with and without lazy evaluation 52 resolved() on lazy futures 53 demo("mandelbrot", package = "future") 54 demo("mandelbrot", package = "future") 55 nbrOfWorkers() 56 future() - preserve R options (data.table) 57 future() - 'data.table' inject 58 future() - can load 'ff' package 59 future() - can attach 'ff' package 60 future() - preserve R options (ff) 61 plan() 62 plan() - workers= 63 plan() - workers= 64 plan() - workers= 65 resolve() 66 resolve() 67 resolve() 68 resolve() 69 resolve() 70 resolve() 71 resolve() 72 resolve() 73 resolve() - run-time exception 74 resolve() - run-time exception 75 resolve() - run-time exception 76 resolve() - run-time exception 77 resolve() - run-time exception 78 resolve() - run-time exception 79 resolve() - run-time exception 80 resolve() - run-time exception 81 resolve() 82 resolve() 83 resolve() 84 resolve() 85 resolve() - time ordering 86 resolved() - assert non-blocking while launching lazy futures 87 Random Number Generation (RNG) - seeds and preserving RNGkind 88 Random Number Generation (RNG) - future 89 Random Number Generation (RNG) - future 90 Random Number Generation (RNG) - %<-% 91 Random Number Generation (RNG) - %<-% 92 Orchestration Stability - future() does not update RNG state 93 Orchestration Stability - run() does not update RNG state 94 Orchestration Stability - result() does not update RNG state 95 Orchestration Stability - value() does not update RNG state 96 future() - standard output 97 future() - standard output 98 %<-% - standard output 99 %<-% - standard output 100 value() - visibility tags lazy earlySignal globals result recursive stdout 1 future, .... NA NA NA NA NA NA 2 %<-%, co.... NA NA NA NA NA NA 3 future, .... NA NA NA NA NA NA 4 %<-%, ... NA NA NA NA NA NA 5 %<-%, ... NA NA NA NA NA NA 6 %<-%, ... NA NA NA NA NA NA 7 %<-%, ... NA NA NA NA NA NA 8 earlySig.... FALSE FALSE NA NA NA NA 9 earlySig.... TRUE FALSE NA NA NA NA 10 earlySig.... FALSE TRUE NA NA NA NA 11 earlySig.... TRUE TRUE NA NA NA NA 12 earlySig.... FALSE FALSE NA NA NA NA 13 earlySig.... TRUE FALSE NA NA NA NA 14 earlySig.... FALSE TRUE NA NA NA NA 15 earlySig.... TRUE TRUE NA NA NA NA 16 earlySig.... FALSE FALSE NA NA NA NA 17 earlySig.... TRUE FALSE NA NA NA NA 18 earlySig.... FALSE TRUE NA NA NA NA 19 earlySig.... TRUE TRUE NA NA NA NA 20 futureAs.... FALSE NA NA NA NA NA 21 futureAs.... TRUE NA NA NA NA NA 22 futureAssign NA NA NA NA NA NA 23 futureAs.... FALSE NA NA NA NA NA 24 futureAs.... TRUE NA NA NA NA NA 25 futureAs.... FALSE NA NA NA NA NA 26 futureAs.... TRUE NA NA NA NA NA 27 %<-%, lazy FALSE NA NA NA NA NA 28 %<-%, lazy TRUE NA NA NA NA NA 29 %<-%, la.... FALSE NA NA NA NA NA 30 %<-%, la.... TRUE NA NA NA NA NA 31 %<-%, la.... FALSE NA NA NA NA NA 32 %<-%, la.... TRUE NA NA NA NA NA 33 %<-%, la.... FALSE NA NA NA NA NA 34 %<-%, la.... TRUE NA NA NA NA NA 35 %<-%, %-.... FALSE NA NA NA NA NA 36 %<-%, %-.... TRUE NA NA NA NA NA 37 %<-%, nested NA NA NA NA NA NA 38 futureCa.... FALSE NA FALSE NA NA NA 39 futureCa.... TRUE NA FALSE NA NA NA 40 futureCa.... FALSE NA TRUE NA NA NA 41 futureCa.... TRUE NA TRUE NA NA NA 42 futureCa.... FALSE NA NA NA NA NA 43 futureCa.... TRUE NA NA NA NA NA 44 futureCa.... FALSE NA NA NA NA NA 45 futureCa.... TRUE NA NA NA NA NA 46 future, .... FALSE NA NA NA NA NA 47 future, .... TRUE NA NA NA NA NA 48 future, .... NA NA NA NA NA NA 49 future, .... NA NA NA NA NA NA 50 future, lazy FALSE NA NA NA NA NA 51 future, lazy TRUE NA NA NA NA NA 52 resolved.... NA NA NA NA NA NA 53 demo, ma.... FALSE NA NA NA NA NA 54 demo, ma.... TRUE NA NA NA NA NA 55 nbrOfWorkers NA NA NA NA NA NA 56 future, .... NA NA NA NA NA NA 57 future, .... NA NA NA NA NA NA 58 future, .... NA NA NA NA NA NA 59 future, .... NA NA NA NA NA NA 60 future, .... NA NA NA NA NA NA 61 plan NA NA NA NA NA NA 62 plan, wo.... NA NA NA NA NA NA 63 plan, wo.... NA NA NA NA NA NA 64 plan, wo.... NA NA NA NA NA NA 65 resolve,.... FALSE NA NA FALSE FALSE NA 66 resolve,.... TRUE NA NA FALSE FALSE NA 67 resolve,.... FALSE NA NA TRUE FALSE NA 68 resolve,.... TRUE NA NA TRUE FALSE NA 69 resolve,.... FALSE NA NA FALSE TRUE NA 70 resolve,.... TRUE NA NA FALSE TRUE NA 71 resolve,.... FALSE NA NA TRUE TRUE NA 72 resolve,.... TRUE NA NA TRUE TRUE NA 73 resolve,.... FALSE NA NA FALSE FALSE NA 74 resolve,.... TRUE NA NA FALSE FALSE NA 75 resolve,.... FALSE NA NA TRUE FALSE NA 76 resolve,.... TRUE NA NA TRUE FALSE NA 77 resolve,.... FALSE NA NA FALSE TRUE NA 78 resolve,.... TRUE NA NA FALSE TRUE NA 79 resolve,.... FALSE NA NA TRUE TRUE NA 80 resolve,.... TRUE NA NA TRUE TRUE NA 81 resolve,.... FALSE NA NA NA NA NA 82 resolve,.... TRUE NA NA NA NA NA 83 resolve,.... FALSE NA NA NA NA NA 84 resolve,.... TRUE NA NA NA NA NA 85 resolve,.... NA NA NA NA NA NA 86 resolved.... NA NA NA NA NA NA 87 rng, seed NA NA NA NA NA NA 88 rng, see.... FALSE NA NA NA NA NA 89 rng, see.... TRUE NA NA NA NA NA 90 rng, see.... FALSE NA NA NA NA NA 91 rng, see.... TRUE NA NA NA NA NA 92 orchestr.... NA NA NA NA NA NA 93 orchestr.... NA NA NA NA NA NA 94 orchestr.... NA NA NA NA NA NA 95 orchestr.... NA NA NA NA NA NA 96 future, .... NA NA NA NA NA FALSE 97 future, .... NA NA NA NA NA TRUE 98 %<-%, stdout NA NA NA NA NA FALSE 99 %<-%, stdout NA NA NA NA NA TRUE 100 value, v.... NA NA NA NA NA NA > > message("Run first three tests ...") Run first three tests ... > > library(future) > results <- run_tests(head(tests, 3L)) > print(results) [[1]] TestResult: - Test: - Title: 'future() - conditions' - Tags: 'future', 'conditions' - Reset workers: FALSE - Arguments: => Test combinations: 1 - Expression: 1: { 2: captureConditions <- function (...) 3: { 4: conditions <- list() 5: withCallingHandlers(..., condition = function(c) { 6: conditions[[length(conditions) + 1L]] <<- c 7: if (inherits(c, "message")) { 8: invokeRestart("muffleMessage") 9: } 10: else if (inherits(c, "warning")) { 11: invokeRestart("muffleWarning") 12: } 13: }) 14: conditions 15: } 16: truth <- captureConditions({ 17: message("hello") 18: warning("whoops") 19: message("world") 20: }) 21: f <- future({ 22: print(1:3) 23: message("hello") 24: warning("whoops") 25: message("world") 26: 42L 27: }) 28: r <- result(f) 29: str(r) 30: stopifnot(value(f) == 42L) 31: conditions <- r$conditions 32: stopifnot(is.list(conditions), length(conditions) == 3L) 33: conditions <- lapply(conditions, FUN = function(c) c$condition) 34: for (kk in seq_along(conditions)) { 35: stopifnot(identical(class(conditions[[kk]]), class(truth[[kk]])), 36: identical(conditions[[kk]]$message, truth[[kk]]$message)) 37: } 38: conditions <- captureConditions(value(f)) 39: stopifnot(is.list(conditions), length(conditions) == 3L) 40: for (kk in seq_along(conditions)) { 41: stopifnot(identical(class(conditions[[kk]]), class(truth[[kk]])), 42: identical(conditions[[kk]]$message, truth[[kk]]$message)) 43: } 44: } - Arguments tested: - Local evaluation: TRUE - Result: - Value: NULL - Visible: FALSE - Captured output: 1: 'List of 11' 2: ' $ value : int 42' 3: ' $ visible : logi TRUE' 4: ' $ stdout : chr "[1] 1 2 3\n"' 5: ' $ conditions :List of 3' 6: ' ..$ :List of 2' 7: ' .. ..$ condition:List of 2' 8: ' .. .. ..$ message: chr "hello\n"' 9: ' .. .. ..$ call : language message("hello")' 10: ' .. .. ..- attr(*, "class")= chr [1:3] "simpleMessage" "message" "condition"' 11: ' .. ..$ signaled : int 0' 12: ' ..$ :List of 2' 13: ' .. ..$ condition:List of 2' 14: ' .. .. ..$ message: chr "whoops"' 15: ' .. .. ..$ call : language eval(quote({ print(1:3) ...' 16: ' .. .. ..- attr(*, "class")= chr [1:3] "simpleWarning" "warning" "condition"' 17: ' .. ..$ signaled : int 0' 18: ' ..$ :List of 2' 19: ' .. ..$ condition:List of 2' 20: ' .. .. ..$ message: chr "world\n"' 21: ' .. .. ..$ call : language message("world")' 22: ' .. .. ..- attr(*, "class")= chr [1:3] "simpleMessage" "message" "condition"' 23: ' .. ..$ signaled : int 0' 24: ' $ rng : logi FALSE' 25: ' $ globalenv : NULL' 26: ' $ started : POSIXct[1:1], format: "2025-03-31 07:22:08"' 27: ' $ finished : POSIXct[1:1], format: "2025-03-31 07:22:08"' 28: ' $ session_uuid: chr "43b455e3-bada-cd57-7fc1-715fea6abd1f"' 29: ' ..- attr(*, "source")=List of 5' 30: ' .. ..$ host : Named chr "CRANWIN3"' 31: ' .. .. ..- attr(*, "names")= chr "COMPUTERNAME"' 32: ' .. ..$ info : Named chr [1:9] "Windows" "Server x64" "build 20348" "CRANWIN3" ...' 33: ' .. .. ..- attr(*, "names")= chr [1:9] "sysname" "release" "version" "nodename" ...' 34: ' .. ..$ pid : int 89680' 35: ' .. ..$ time : POSIXct[1:1], format: "2025-03-31 07:22:05"' 36: ' .. ..$ random: int 2147483647' 37: ' $ r_info :List of 4' 38: ' ..$ version :Classes 'R_system_version', 'package_version', 'numeric_version' hidden list of 1' 39: ' .. ..$ : int [1:3] 4 5 0' 40: ' ..$ os : chr "windows"' 41: ' ..$ os_name : chr "Windows"' 42: ' ..$ captures_utf8: logi TRUE' 43: ' $ version : chr "1.8"' 44: ' - attr(*, "class")= chr "FutureResult"' 45: '[1] 1 2 3' 46: '[1] 1 2 3' - Success: TRUE - Processing time: 0.180 secs [[2]] TestResult: - Test: - Title: '%<-% - conditions' - Tags: '%<-%', 'conditions' - Reset workers: FALSE - Arguments: => Test combinations: 1 - Expression: 1: { 2: captureConditions <- function (...) 3: { 4: conditions <- list() 5: withCallingHandlers(..., condition = function(c) { 6: conditions[[length(conditions) + 1L]] <<- c 7: if (inherits(c, "message")) { 8: invokeRestart("muffleMessage") 9: } 10: else if (inherits(c, "warning")) { 11: invokeRestart("muffleWarning") 12: } 13: }) 14: conditions 15: } 16: truth <- captureConditions({ 17: message("hello") 18: warning("whoops") 19: message("world") 20: }) 21: v %<-% { 22: print(1:3) 23: message("hello") 24: warning("whoops") 25: message("world") 26: 42L 27: } 28: conditions <- captureConditions(v) 29: stopifnot(v == 42L) 30: stopifnot(is.list(conditions), length(conditions) == 3L) 31: for (kk in seq_along(conditions)) { 32: stopifnot(identical(class(conditions[[kk]]), class(truth[[kk]])), 33: identical(conditions[[kk]]$message, truth[[kk]]$message)) 34: } 35: } - Arguments tested: - Local evaluation: TRUE - Result: - Value: NULL - Visible: FALSE - Captured output: 1: '[1] 1 2 3' - Success: TRUE - Processing time: 0.045 secs [[3]] TestResult: - Test: - Title: 'future() - muffle conditions' - Tags: 'future', 'conditions', 'muffle' - Reset workers: FALSE - Arguments: => Test combinations: 1 - Expression: 1: { 2: captureConditions <- function (...) 3: { 4: conditions <- list() 5: withCallingHandlers(..., condition = function(c) { 6: conditions[[length(conditions) + 1L]] <<- c 7: if (inherits(c, "message")) { 8: invokeRestart("muffleMessage") 9: } 10: else if (inherits(c, "warning")) { 11: invokeRestart("muffleWarning") 12: } 13: }) 14: conditions 15: } 16: f <- future({ 17: print(1:3) 18: message("hello") 19: warning("whoops") 20: message("world") 21: 42L 22: }, conditions = character(0L)) 23: r <- result(f) 24: str(r) 25: stopifnot(value(f) == 42L) 26: conditions <- r$conditions 27: stopifnot(is.list(conditions), length(conditions) == 0L) 28: conditions <- captureConditions(value(f)) 29: stopifnot(is.list(conditions), length(conditions) == 0L) 30: } - Arguments tested: - Local evaluation: TRUE - Result: - Value: NULL - Visible: FALSE - Captured output: 1: 'List of 11' 2: ' $ value : int 42' 3: ' $ visible : logi TRUE' 4: ' $ stdout : chr "[1] 1 2 3\n"' 5: ' $ conditions : list()' 6: ' $ rng : logi FALSE' 7: ' $ globalenv : NULL' 8: ' $ started : POSIXct[1:1], format: "2025-03-31 07:22:08"' 9: ' $ finished : POSIXct[1:1], format: "2025-03-31 07:22:09"' 10: ' $ session_uuid: chr "43b455e3-bada-cd57-7fc1-715fea6abd1f"' 11: ' ..- attr(*, "source")=List of 5' 12: ' .. ..$ host : Named chr "CRANWIN3"' 13: ' .. .. ..- attr(*, "names")= chr "COMPUTERNAME"' 14: ' .. ..$ info : Named chr [1:9] "Windows" "Server x64" "build 20348" "CRANWIN3" ...' 15: ' .. .. ..- attr(*, "names")= chr [1:9] "sysname" "release" "version" "nodename" ...' 16: ' .. ..$ pid : int 89680' 17: ' .. ..$ time : POSIXct[1:1], format: "2025-03-31 07:22:05"' 18: ' .. ..$ random: int 2147483647' 19: ' $ r_info :List of 4' 20: ' ..$ version :Classes 'R_system_version', 'package_version', 'numeric_version' hidden list of 1' 21: ' .. ..$ : int [1:3] 4 5 0' 22: ' ..$ os : chr "windows"' 23: ' ..$ os_name : chr "Windows"' 24: ' ..$ captures_utf8: logi TRUE' 25: ' $ version : chr "1.8"' 26: ' - attr(*, "class")= chr "FutureResult"' 27: '[1] 1 2 3' 28: '[1] 1 2 3' - Success: TRUE - Processing time: 0.046 secs > > df_results <- do.call(rbind, results) > print(df_results) title time success 1 future() - conditions 0.18036008 secs TRUE 2 %<-% - conditions 0.04464793 secs TRUE 3 future() - muffle conditions 0.04627585 secs TRUE > > message("Run first three tests ... DONE") Run first three tests ... DONE > > > message("Run a few tests across different future plans ...") Run a few tests across different future plans ... > > tests <- tests[seq(from = 1L, to = length(tests), length.out = 5L)] > > library(future) > > value <- TRUE > recursive <- FALSE > > ntests <- length(tests) > > add_test_plan(plan(sequential)) > add_test_plan(plan(multisession, workers = 1L)) > add_test_plan(plan(multisession, workers = 2L)) > > test_plans <- test_plans() > print(test_plans) [[1]] plan(sequential) [[2]] plan(multisession, workers = 1L) [[3]] plan(multisession, workers = 2L) > > res <- along_test_plans({ + res_plan <- list() + for (lazy in c(FALSE, TRUE)) { + for (global in c(FALSE, TRUE)) { + for (stdout in c(FALSE, TRUE)) { + args <- c(lazy = lazy, global = global, stdout = stdout) + args_tag <- paste(sprintf("%s=%s", names(args), args), collapse = ",") + message(sprintf("Running tests with (%s) ...", args_tag)) + + tests_tt <- subset_tests(tests, args = args) + ntests_tt <- length(tests_tt) + message(sprintf(" - Number of tests: %d out of %d", ntests_tt, ntests)) + + res_tt <- run_tests(tests_tt) + print(res_tt) + stopifnot(is.list(res_tt)) + + res_plan[[args_tag]] <- res_tt + + message(sprintf("Running tests with (%s) ... DONE", args_tag)) + } + } + } + stopifnot(is.list(res_plan), length(res_plan) == 2*2*2) + res_plan + }) Evaluating expression under future plan #1 of 3 ... sequential: - args: function (..., envir = parent.frame(), workers = "") - tweaked: FALSE - call: plan(sequential) Evaluating expression under future plan #1 of 3 ... DONE Evaluating expression under future plan #2 of 3 ... multisession: - args: function (..., workers = 1L, envir = parent.frame()) - tweaked: TRUE - call: plan(multisession, workers = 1L) Evaluating expression under future plan #2 of 3 ... DONE Evaluating expression under future plan #3 of 3 ... multisession: - args: function (..., workers = 2L, envir = parent.frame()) - tweaked: TRUE - call: plan(multisession, workers = 2L) Evaluating expression under future plan #3 of 3 ... DONE > print(res) [[1]] NULL > > message("Run a few tests across different future plans ... DONE") Run a few tests across different future plans ... DONE > > proc.time() user system elapsed 4.67 0.25 6.76