* using log directory 'd:/Rcompile/CRANpkg/local/4.3/unittest.Rcheck' * using R Under development (unstable) (2022-08-11 r82713 ucrt) * using platform: x86_64-w64-mingw32 (64-bit) * using session charset: UTF-8 * checking for file 'unittest/DESCRIPTION' ... OK * checking extension type ... Package * this is package 'unittest' version '1.4-0' * package encoding: UTF-8 * checking package namespace information ... OK * checking package dependencies ... OK * checking if this is a source package ... OK * checking if there is a namespace ... OK * checking for hidden files and directories ... OK * checking for portable file names ... OK * checking whether package 'unittest' can be installed ... OK * checking installed package size ... OK * checking package directory ... OK * checking 'build' directory ... OK * checking DESCRIPTION meta-information ... OK * checking top-level files ... OK * checking for left-over files ... OK * checking index information ... OK * checking package subdirectories ... OK * checking R files for non-ASCII characters ... OK * checking R files for syntax errors ... OK * checking whether the package can be loaded ... OK * checking whether the package can be loaded with stated dependencies ... OK * checking whether the package can be unloaded cleanly ... OK * checking whether the namespace can be loaded with stated dependencies ... OK * checking whether the namespace can be unloaded cleanly ... OK * checking loading without being on the library search path ... OK * checking use of S3 registration ... OK * checking dependencies in R code ... OK * checking S3 generic/method consistency ... OK * checking replacement functions ... OK * checking foreign function calls ... OK * checking R code for possible problems ... [3s] OK * checking Rd files ... [1s] OK * checking Rd metadata ... OK * checking Rd cross-references ... OK * checking for missing documentation entries ... OK * checking for code/documentation mismatches ... OK * checking Rd \usage sections ... OK * checking Rd contents ... OK * checking for unstated dependencies in examples ... OK * checking LazyData ... NOTE 'LazyData' is specified without a 'data' directory * checking installed files from 'inst/doc' ... OK * checking files in 'vignettes' ... OK * checking examples ... [1s] OK * checking for unstated dependencies in 'tests' ... OK * checking tests ... [10s] ERROR Running 'test_non_interactive.R' [6s] Running 'test_ok.R' [1s] Running 'test_ok_group.R' [0s] Running 'test_ut_cmp.R' [2s] Running 'test_ut_cmp_error.R' [0s] Running the tests in 'tests/test_ut_cmp.R' failed. Complete output: > options(useFancyQuotes = FALSE) # Force to stabilise all.equal output > > library(unittest) > > # Compare character output of a (failing) cmp function, ignoring colors > cmp_lines <- function (actual, ...) { + # Remove color escape codes + no_color <- gsub('\033\\[.*?m', '', actual, perl = TRUE) + if(identical(no_color, c(...)[!is.null(c(...))])) { + return(TRUE) + } + # utils::str(no_color, vec.len = 1000, digits.d = 5, nchar.max = 1000) + return(actual) + } > > # Mock (fn) in namespace with (replacement) whilst (block) is being evaluated > mock <- function (fn, replacement, block) { + # Get the name of the function from the unevaluated argument, + # assuming it's of the form package::name + fn_name <- as.character(as.list(sys.call()[[2]])[[3]]) + ns <- environment(fn) + + orig_fn <- get(fn_name, env = ns) + unlockBinding(fn_name, env = ns) + assign(fn_name, replacement, envir = ns) + on.exit(assign(fn_name, orig_fn, envir = ns), add = TRUE) + + block + } > > ok_group("ut_cmp_equal", (function () { + ok(isTRUE(ut_cmp_equal(4, 4)), "Identical objects return true") + ok(isTRUE(ut_cmp_equal(as.integer(4), 4)), "Equivalent objects return true (i.e. integer vs. number)") + ok(isTRUE(ut_cmp_equal(0.01, 0.02, tolerance = 0.1)), "Additional arguments passed through to all.equal") + + if (!file.exists(unittest:::git_binary())) { + ok(TRUE, "# skip git not available") + return() + } + + ok(cmp_lines(ut_cmp_equal(c(2,4,2,8), c(5,4,2,1)), + 'Mean relative difference: 1', + '--- c(2, 4, 2, 8)', + '+++ c(5, 4, 2, 1)', + '[1] [-2-]{+5+} 4 2 [-8-]{+1+}', + NULL), "Vectors filtered by str, individual differences highlighted") + + ok(!withVisible(ut_cmp_equal("apples", "oranges"))$visible, + "Output of comparision isn't visible (we should print it at a real console though)") + + do_a_thing <- function (x) seq(x) + ok(cmp_lines(ut_cmp_equal(do_a_thing(4), do_a_thing(1 + 2)), + 'Numeric: lengths (4, 3) differ', + '--- do_a_thing(4)', + '+++ do_a_thing(1 + 2)', + '[1] 1 2 3[-4-]', + NULL), "The ---/+++ lines show expressions handed to ut_cmp_equal()") + + ok(cmp_lines(ut_cmp_equal(list(c(1, 2, 8), c(2, 3, 2), 10, 11, 12, 13), list(c(1, 2, 3), c(2, 3, 2), 10, 11, 12, 13)), + "Component 1: Mean relative difference: 0.625", + "--- list(c(1, 2, 8), c(2, 3, 2), 10, 11, 12, 13)", + "+++ list(c(1, 2, 3), c(2, 3, 2), 10, 11, 12, 13)", + "[[1]]", + "[1] 1 2 [-8-]{+3+}", + "", + "[[2]]", + "[1] 2 3 2", + "", + "[[3]]", + "[1] 10", + "", + "[[4]]", + "[1] 11", + "", + "[[5]]", + "[1] 12", + "", + "[[6]]", + "[1] 13", + NULL), "We return the whole file as context, not just the usual 3 lines") + + ok(cmp_lines(ut_cmp_equal(c("'Ouch!' he said,", "it was an iron bar."), c("Ooops!", "it was an accident.")), + '2 string mismatches', + '--- c("\'Ouch!\' he said,", "it was an iron bar.")', + '+++ c("Ooops!", "it was an accident.")', + "[-'Ouch!' he said,-]{+Ooops!+}", + 'it was an [-iron bar.-]{+accident.+}', + NULL), "Character vectors get compared one per line") + + ok(cmp_lines(ut_cmp_equal(as.environment(list(a=3, b=4)), as.environment(list(a=5, b=4, c=9))), + 'Length mismatch: comparison on first 2 components', + 'Component "a": Mean relative difference: 0.6666667', + '--- as.environment(list(a = 3, b = 4))', + '+++ as.environment(list(a = 5, b = 4, c = 9))', + '{+$c+}', + '{+[1] 9+}', + '', + '$b', + '[1] 4', + '', + '$a', + '[1] [-3-]{+5+}', + NULL), "Environments get converted to lists") + })()) # ut_cmp_equal ok - Identical objects return true ok - Equivalent objects return true (i.e. integer vs. number) ok - Additional arguments passed through to all.equal ok - Vectors filtered by str, individual differences highlighted ok - Output of comparision isn't visible (we should print it at a real console though) ok - The ---/+++ lines show expressions handed to ut_cmp_equal() ok - We return the whole file as context, not just the usual 3 lines ok - Character vectors get compared one per line not ok - Environments get converted to lists # Test returned non-TRUE value: # Length mismatch: comparison on first 2 components # Component "a": Mean relative difference: 0.6666667 # --- as.environment(list(a = 3, b = 4)) # +++ as.environment(list(a = 5, b = 4, c = 9)) # {+$c +} # {+[1] 9+} # # $b # [1] 4 # # $a # [1] [-3-]{+5+} > > # Mock git_binary(), so we don't find git even if it is available > ok_group("ut_cmp_equal:nogit", mock(unittest:::git_binary, function () "/not-here", { + ok(cmp_lines(ut_cmp_equal(c(2,4,2,8), c(5,4,2,1)), + 'Mean relative difference: 1', + '--- c(2, 4, 2, 8)', + '[1] 2 4 2 8', + '+++ c(5, 4, 2, 1)', + '[1] 5 4 2 1', + NULL), "No git available, so show outputs side by side") + + ok(cmp_lines(ut_cmp_equal(as.environment(list(a=3, b=4)), as.environment(list(a=5, b=4, c=9))), + 'Length mismatch: comparison on first 2 components', + 'Component "a": Mean relative difference: 0.6666667', + '--- as.environment(list(a = 3, b = 4))', + '$b', + '[1] 4', + '', + '$a', + '[1] 3', + '', + '+++ as.environment(list(a = 5, b = 4, c = 9))', + '$c', + '[1] 9', + '', + '$b', + '[1] 4', + '', + '$a', + '[1] 5', + '', + NULL), "Environments get converted to lists") + })) # ut_cmp_equal:nogit ok - No git available, so show outputs side by side ok - Environments get converted to lists > > ok_group("ut_cmp_identical", (function () { + if (!file.exists(unittest:::git_binary())) { + ok(TRUE, "# skip git not available") + return() + } + + ok(isTRUE(ut_cmp_identical(4, 4)), "Identical objects return true") + ok(cmp_lines(ut_cmp_identical(as.integer(4), 4), + '--- as.integer(4)', + '+++ 4', + ' [-int-]{+num+} 4', + NULL), "Equivalent objects do not, unlike ut_cmp_equal(). We also fall back to using str(), as print() will produce identical output") + })()) # ut_cmp_identical ok - Identical objects return true ok - Equivalent objects do not, unlike ut_cmp_equal(). We also fall back to using str(), as print() will produce identical output > > ok_group("ut_cmp_identical:nogit", mock(unittest:::git_binary, function () "/not-here", { + ok(isTRUE(ut_cmp_identical(4, 4)), "Identical objects return true") + ok(cmp_lines(ut_cmp_identical(as.integer(4), 4), + '--- as.integer(4)', + ' int 4', + '+++ 4', + ' num 4', + NULL), "Equivalent objects do not, unlike ut_cmp_equal(). We also fall back to using str(), as print() will produce identical output") + })) # ut_cmp_identical:nogit ok - Identical objects return true ok - Equivalent objects do not, unlike ut_cmp_equal(). We also fall back to using str(), as print() will produce identical output > > proc.time() user system elapsed 0.45 0.06 2.25 # Looks like you failed 1 of 15 tests. * checking for unstated dependencies in vignettes ... OK * checking package vignettes in 'inst/doc' ... OK * checking re-building of vignette outputs ... [9s] OK * checking PDF version of manual ... OK * DONE Status: 1 ERROR, 1 NOTE