## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/vignette_intro-", dpi = 92, fig.retina = 2 ) ## ----eval=FALSE--------------------------------------------------------------- # install.packages("xpectr") ## ----eval=FALSE--------------------------------------------------------------- # # install.packages("devtools") # devtools::install_github("ludvigolsen/xpectr") ## ----warning=FALSE, message=FALSE--------------------------------------------- library(xpectr) library(testthat) library(dplyr) # Set a seed # When R > 3.6.0, it sets sampling.kind to "Rounding" to make # tests compatible with previous versions of R set_test_seed(42) ## ----------------------------------------------------------------------------- # Some data num_vec <- 1:10 long_vec <- c(LETTERS, letters) a_factor <- factor(c("a","b","c")) df <- data.frame( 'a' = c(1, 2, 3), 'b' = c('t', 'y', 'u'), "c" = a_factor, stringsAsFactors = FALSE ) %>% dplyr::group_by(a) # A function with side effects fn <- function(raise = FALSE){ message("Hi! I'm Kevin, your favorite message!") warning("G'Day Mam! I'm a warning to the world!") message("Kevin is ma name! Yesss!") warning("Hopefully the whole world will see me :o") if (isTRUE(raise)){ stop("Lord Evil Error has arrived! Yeehaaa") } "the output" } ## ----------------------------------------------------------------------------- # Inspect num_vec num_vec ## ----eval=FALSE--------------------------------------------------------------- # # Generate expectations # gxs_selection("num_vec") # # # Inserts the following tests: # # ## Testing 'num_vec' #### # ## Initially generated by xpectr # xpectr::set_test_seed(42) # # Testing class # expect_equal( # class(num_vec), # "integer", # fixed = TRUE) # # Testing type # expect_type( # num_vec, # type = "integer") # # Testing values # expect_equal( # num_vec, # c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), # tolerance = 1e-4) # # Testing names # expect_equal( # names(num_vec), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(num_vec), # 10L) # # Testing sum of element lengths # expect_equal( # sum(xpectr::element_lengths(num_vec)), # 10L) # ## Finished testing 'num_vec' #### # ## ----------------------------------------------------------------------------- # Inspect a_factor a_factor ## ----eval=FALSE--------------------------------------------------------------- # # Generate expectations # gxs_selection("a_factor") # # # Inserts the following tests: # # ## Testing 'a_factor' #### # ## Initially generated by xpectr # xpectr::set_test_seed(42) # # Testing is factor # expect_true( # is.factor(a_factor)) # # Testing values # expect_equal( # as.character(a_factor), # c("a", "b", "c"), # fixed = TRUE) # # Testing names # expect_equal( # names(a_factor), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(a_factor), # 3L) # # Testing number of levels # expect_equal( # nlevels(a_factor), # 3L) # # Testing levels # expect_equal( # levels(a_factor), # c("a", "b", "c"), # fixed = TRUE) # ## Finished testing 'a_factor' #### # ## ----------------------------------------------------------------------------- # Inspect long_vec long_vec ## ----eval=FALSE--------------------------------------------------------------- # # Generate expectations # gxs_selection("long_vec") # # # Inserts the following tests: # # ## Testing 'long_vec' #### # ## Initially generated by xpectr # xpectr::set_test_seed(42) # # Testing class # expect_equal( # class(long_vec), # "character", # fixed = TRUE) # # Testing type # expect_type( # long_vec, # type = "character") # # Testing values # expect_equal( # xpectr::smpl(long_vec, n = 30), # c("C", "E", "G", "J", "K", "N", "O", "Q", "R", "S", "T", "W", "Y", # "Z", "b", "c", "d", "e", "h", "i", "j", "k", "l", "o", "p", # "r", "v", "w", "y", "z"), # fixed = TRUE) # # Testing names # expect_equal( # names(xpectr::smpl(long_vec, n = 30)), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(long_vec), # 52L) # # Testing sum of element lengths # expect_equal( # sum(xpectr::element_lengths(long_vec)), # 52L) # ## Finished testing 'long_vec' #### # ## ----------------------------------------------------------------------------- # Inspect df df ## ----eval=FALSE--------------------------------------------------------------- # # Generate expectations # gxs_selection("df") # # # Inserts the following tests: # # ## Testing 'df' #### # ## Initially generated by xpectr # xpectr::set_test_seed(42) # # Testing class # expect_equal( # class(df), # c("grouped_df", "tbl_df", "tbl", "data.frame"), # fixed = TRUE) # # Testing column values # expect_equal( # df[["a"]], # c(1, 2, 3), # tolerance = 1e-4) # expect_equal( # df[["b"]], # c("t", "y", "u"), # fixed = TRUE) # expect_equal( # df[["c"]], # structure(1:3, levels = c("a", "b", "c"), class = "factor")) # # Testing column names # expect_equal( # names(df), # c("a", "b", "c"), # fixed = TRUE) # # Testing column classes # expect_equal( # xpectr::element_classes(df), # c("numeric", "character", "factor"), # fixed = TRUE) # # Testing column types # expect_equal( # xpectr::element_types(df), # c("double", "character", "integer"), # fixed = TRUE) # # Testing dimensions # expect_equal( # dim(df), # c(3L, 3L)) # # Testing group keys # expect_equal( # colnames(dplyr::group_keys(df)), # "a", # fixed = TRUE) # ## Finished testing 'df' #### # ## ----------------------------------------------------------------------------- # Inspect fn fn ## ----eval=FALSE--------------------------------------------------------------- # # Generate expectations # gxs_selection("fn()") # # # Inserts the following tests: # # ## Testing 'fn()' #### # ## Initially generated by xpectr # xpectr::set_test_seed(42) # # Testing side effects # # Assigning side effects # side_effects_19148 <- xpectr::capture_side_effects(fn(), reset_seed = TRUE) # expect_equal( # xpectr::strip(side_effects_19148[['warnings']]), # xpectr::strip(c("G'Day Mam! I'm a warning to the world!", "Hopefully the whole world will see me :o")), # fixed = TRUE) # expect_equal( # xpectr::strip(side_effects_19148[['messages']]), # xpectr::strip(c("Hi! I'm Kevin, your favorite message!\n", "Kevin is ma name! Yesss!\n")), # fixed = TRUE) # # Assigning output # output_19148 <- xpectr::suppress_mw(fn()) # # Testing class # expect_equal( # class(output_19148), # "character", # fixed = TRUE) # # Testing type # expect_type( # output_19148, # type = "character") # # Testing values # expect_equal( # output_19148, # "the output", # fixed = TRUE) # # Testing names # expect_equal( # names(output_19148), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(output_19148), # 1L) # # Testing sum of element lengths # expect_equal( # sum(xpectr::element_lengths(output_19148)), # 1L) # ## Finished testing 'fn()' #### # # # In case of errors, the warnings and messages aren't tested # # gxs_selection("fn(raise = TRUE)") # # # Inserts the following tests: # # ## Testing 'fn(raise = TRUE)' #### # ## Initially generated by xpectr # xpectr::set_test_seed(42) # # Testing side effects # expect_error( # xpectr::strip_msg(fn(raise = TRUE)), # xpectr::strip("Lord Evil Error has arrived! Yeehaaa"), # fixed = TRUE) # ## Finished testing 'fn(raise = TRUE)' #### # ## ----eval=FALSE--------------------------------------------------------------- # # Define a function with arguments # fn <- function(x, y, z = 10) { # if (x > 3) stop("'x' > 3") # if (y < 0) warning("'y'<0") # if (z == 10) message("'z' was 10!") # x + y + z # } # # # Create tests for the function # # Note: We currently need to specify the list of arguments # # in the function call # gxs_function(fn = fn, # args_values = list( # "x" = list(2, 4, NA), # "y" = list(0,-1), # "z" = list(5, 10) # )) # # # Inserts the following tests: # # ## Testing 'fn' #### # ## Initially generated by xpectr # # Testing different combinations of argument values # # # Testing fn(x = 2, y = 0, z = 5) # xpectr::set_test_seed(42) # # Assigning output # output_19148 <- fn(x = 2, y = 0, z = 5) # # Testing class # expect_equal( # class(output_19148), # "numeric", # fixed = TRUE) # # Testing type # expect_type( # output_19148, # type = "double") # # Testing values # expect_equal( # output_19148, # 7, # tolerance = 1e-4) # # Testing names # expect_equal( # names(output_19148), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(output_19148), # 1L) # # Testing sum of element lengths # expect_equal( # sum(xpectr::element_lengths(output_19148)), # 1L) # # # Testing fn(x = 4, y = 0, z = 5) # # Changed from baseline: x = 4 # xpectr::set_test_seed(42) # # Testing side effects # expect_error( # xpectr::strip_msg(fn(x = 4, y = 0, z = 5)), # xpectr::strip("'x' > 3"), # fixed = TRUE) # # # Testing fn(x = NA, y = 0, z = 5) # # Changed from baseline: x = NA # xpectr::set_test_seed(42) # # Testing side effects # expect_error( # xpectr::strip_msg(fn(x = NA, y = 0, z = 5)), # xpectr::strip("missing value where TRUE/FALSE needed"), # fixed = TRUE) # # # Testing fn(x = NULL, y = 0, z = 5) # # Changed from baseline: x = NULL # xpectr::set_test_seed(42) # # Testing side effects # expect_error( # xpectr::strip_msg(fn(x = NULL, y = 0, z = 5)), # xpectr::strip("argument is of length zero"), # fixed = TRUE) # # # Testing fn(x = 2, y = -1, z = 5) # # Changed from baseline: y = -1 # xpectr::set_test_seed(42) # # Testing side effects # # Assigning side effects # side_effects_16417 <- xpectr::capture_side_effects(fn(x = 2, y = -1, z = 5), reset_seed = TRUE) # expect_equal( # xpectr::strip(side_effects_16417[['warnings']]), # xpectr::strip("'y'<0"), # fixed = TRUE) # expect_equal( # xpectr::strip(side_effects_16417[['messages']]), # xpectr::strip(character(0)), # fixed = TRUE) # # Assigning output # output_16417 <- xpectr::suppress_mw(fn(x = 2, y = -1, z = 5)) # # Testing class # expect_equal( # class(output_16417), # "numeric", # fixed = TRUE) # # Testing type # expect_type( # output_16417, # type = "double") # # Testing values # expect_equal( # output_16417, # 6, # tolerance = 1e-4) # # Testing names # expect_equal( # names(output_16417), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(output_16417), # 1L) # # Testing sum of element lengths # expect_equal( # sum(xpectr::element_lengths(output_16417)), # 1L) # # # Testing fn(x = 2, y = NULL, z = 5) # # Changed from baseline: y = NULL # xpectr::set_test_seed(42) # # Testing side effects # expect_error( # xpectr::strip_msg(fn(x = 2, y = NULL, z = 5)), # xpectr::strip("argument is of length zero"), # fixed = TRUE) # # # Testing fn(x = 2, y = 0, z = 10) # # Changed from baseline: z = 10 # xpectr::set_test_seed(42) # # Testing side effects # # Assigning side effects # side_effects_17365 <- xpectr::capture_side_effects(fn(x = 2, y = 0, z = 10), reset_seed = TRUE) # expect_equal( # xpectr::strip(side_effects_17365[['warnings']]), # xpectr::strip(character(0)), # fixed = TRUE) # expect_equal( # xpectr::strip(side_effects_17365[['messages']]), # xpectr::strip("'z' was 10!\n"), # fixed = TRUE) # # Assigning output # output_17365 <- xpectr::suppress_mw(fn(x = 2, y = 0, z = 10)) # # Testing class # expect_equal( # class(output_17365), # "numeric", # fixed = TRUE) # # Testing type # expect_type( # output_17365, # type = "double") # # Testing values # expect_equal( # output_17365, # 12, # tolerance = 1e-4) # # Testing names # expect_equal( # names(output_17365), # NULL, # fixed = TRUE) # # Testing length # expect_equal( # length(output_17365), # 1L) # # Testing sum of element lengths # expect_equal( # sum(xpectr::element_lengths(output_17365)), # 1L) # # # Testing fn(x = 2, y = 0, z = NULL) # # Changed from baseline: z = NULL # xpectr::set_test_seed(42) # # Testing side effects # expect_error( # xpectr::strip_msg(fn(x = 2, y = 0, z = NULL)), # xpectr::strip("argument is of length zero"), # fixed = TRUE) # # ## Finished testing 'fn' #### # ## ----eval=FALSE--------------------------------------------------------------- # initializeGXSFunctionAddin("fn") # # # Inserts the following: # # # Generate expectations for 'fn' # # Tip: comment out the gxs_function() call # # so it is easy to regenerate the tests # xpectr::set_test_seed(42) # xpectr::gxs_function( # fn = fn, # args_values = list( # "x" = list(), # "y" = list(), # "z" = list(10) # ), # identation = 2, # copy_env = FALSE # ) # # # # ## ----eval=FALSE--------------------------------------------------------------- # wrapStringAddin("This is a fairly long sentence that we would very very much like to make shorter in our test file!") # # # Inserts the following: # # paste0("This is a fairly long sentence that we would very very much ", # "like to make shorter in our test file!") # ## ----eval=FALSE--------------------------------------------------------------- # initializeTestthatAddin() # # # Inserts the following: # # test_that("testing ...()", { # xpectr::set_test_seed(42) # # # ... # # }) # ## ----eval=FALSE--------------------------------------------------------------- # assertCollectionAddin() # # # Inserts the following: # # # Check arguments #### # assert_collection <- checkmate::makeAssertCollection() # # checkmate::assert_ , add = assert_collection) # checkmate::reportAssertions(assert_collection) # # End of argument checks #### # ## ----eval=FALSE--------------------------------------------------------------- # v <- c(1, 2, 3) # # dputSelectedAddin("v") # "v" is the selected code # # # Inserts the following: # # c(1, 2, 3) #