initial commit
[pkgdev.git] / R / runRtests.R
CommitLineData
156f8ca6
BA
1# Core function to execute R unit tests (or just show functions names)
2.pkgdev.rtest = function(path, prefix, show, cc) {
3
4 # Initial step: list every potential unit test under path/R/tests.
5 allFuncNames = .parseRunitTests(file.path(path,"R","tests"))
6
7 # Filter functions names matching prefix
8 funcNames = grep( paste("^test\\.",prefix,sep=''), allFuncNames, value=TRUE )
9 if (length(funcNames) == 0) return #shortcut: nothing to do...
10
11 # If show==TRUE, display every potential test starting with prefix, and exit
12 if (show) {
13 #display in alphabetic order
14 return (paste(sort(funcNames), sep='\n'))
15 }
16
17 # Source all R unit test files
18 rFiles = list.files(file.path(path,"R","tests"),
19 pattern="\\.[RrSsq]$", full.names=TRUE, recursive=TRUE)
20 lapply(rFiles, source)
21
22 # Source R file containing unit tests methods
23 pkdev_path = file.path(Sys.getenv("R_HOME_USER"), "pkgdev")
24 source(file.path(pkdev_path,"R","tests","unitTestsMethods.R"))
25
26 # Get package name from path
27 pathTokens = strsplit(path, c(.Platform$file.sep))[[1]]
28 pkgName = pathTokens[length(pathTokens)]
29
30 # This file tells if the package is currently loaded
31 pkgLoadFile = file.path(pkdev_path,"pkgs",pkgName,"loaded")
32
33 # Now manually load package (may not be installable if non-flat)
34 pkgAlreadyLoaded = file.exists(pkgLoadFile)
35 .pkgdev.load(path, cc)
36
37 # Run selected tests (after 'funcs' filter applied)
38 for (funcName in funcNames) {
39 cat(">>> Running ",funcName,"\n",sep='')
40 func = match.fun(funcName)
41 execTime = as.numeric(system.time(func())[1])
42 cat(">>> ... completed in ",execTime,"s.\n",sep='')
43 }
44
45 # Unload shared library if it wasn't already loaded
46 if (!pkgAlreadyLoaded) .pkgdev.unload(path)
47}
48
49# Recursively explore initial path to parse source files for unit tests.
50.parseRunitTests = function(path) {
51
52 # Unit test names to return
53 funcNames = c()
54
55 # For each file in current folder
56 for (fileName in list.files(path, full.names=TRUE, recursive=TRUE)) {
57
58 # If the file is not a source, skip
59 if ( length( grep("\\.[RrSsq]$", fileName) ) == 0) next
60
61 # Every test function has a name starting with "test."
62 matches = grep(
63 "^[ \t]*test\\.[a-zA-Z0-9_]*[ \t]*(=|<-)[ \t]*function.*",
64 scan(fileName, what="character", sep='\n', quiet=TRUE),
65 value = TRUE)
66
67 # We matched more to be 100% sure we got test functions, but need to strip now
68 funcNames = c(funcNames, sub(
69 "^[ \t]*(test\\.[a-zA-Z0-9_]*)[ \t]*(=|<-)[ \t]*function.*",
70 "\\1",
71 matches))
72 }
73
74 return (funcNames)
75}