\name{assertCondition} \alias{assertCondition} \alias{assertWarning} \alias{assertError} \title{Asserting Error Conditions} \description{ When testing code, it is not sufficient to check that results are correct, but also that errors or warnings are signalled in appropriate situations. The functions described here provide a convenient facility for doing so. The three functions check that evaluating the supplied expression produces an error, a warning or one of a specified list of conditions, respectively. If the assertion fails, an error is signalled. } \usage{ assertError(expr, verbose = FALSE) assertWarning(expr, verbose = FALSE) assertCondition(expr, ..., .exprString = , verbose = FALSE) } \arguments{ \item{expr}{an unevaluated \R expression which will be evaluated via \code{\link{tryCatch}(expr, ..)}.} \item{\dots}{\code{\link{character}} strings corresponding to the classes of the conditions that would satisfy the assertion; e.g., \code{"error"} or \code{"warning"}. If none are specified, any condition will satisfy the assertion. See the details section. } \item{.exprString}{The string to be printed corresponding to \code{expr}. By default, the actual \code{expr} will be deparsed. Will be omitted if the function is supplied with the actual expression to be tested. If \code{assertCondition()} is called from another function, with the actual expression passed as an argument to that function, supply the deparsed version.} \item{verbose}{If \code{TRUE}, a message is printed when the condition is satisfied.} } \details{ \code{assertCondition()} uses the general condition mechanism to check all the conditions generated in evaluating \code{expr}. The occurrence of any of the supplied condition classes among these satisfies the assertion regardless of what other conditions may be signalled. \code{assertError()} is a convenience function for asserting errors; it calls \code{assertCondition()}. \code{assertWarning()} asserts that a warning will be signalled, but \emph{not} an error, whereas \code{assertCondition(expr, "warning")} will be satisfied even if an error follows the warning. See the examples. } \value{ If the assertion is satisfied, a list of all the condition objects signalled is returned, invisibly. See \code{\link{conditionMessage}} for the interpretation of these objects. Note that \emph{all} conditions signalled during the evaluation are returned, whether or not they were among the requirements. } \author{John Chambers and Martin Maechler} \seealso{ \code{\link{stop}}, \code{\link{warning}}; \code{\link{signalCondition}}, \code{\link{tryCatch}}. } \examples{ assertError(sqrt("abc")) assertWarning(matrix(1:8, 4,3)) assertCondition( ""-1 ) # ok, any condition would satisfy this try( assertCondition(sqrt(2), "warning") ) ## .. Failed to get warning in evaluating sqrt(2) assertCondition(sqrt("abc"), "error") # ok try( assertCondition(sqrt("abc"), "warning") )# -> error: had no warning assertCondition(sqrt("abc"), "error") ## identical to assertError() call above assertCondition(matrix(1:5, 2,3), "warning") try( assertCondition(matrix(1:8, 4,3), "error") ) ## .. Failed to get expected error .... ## either warning or worse: assertCondition(matrix(1:8, 4,3), "error","warning") # OK assertCondition(matrix(1:8, 4, 3), "warning") # OK ## when both are signalled: ff <- function() { warning("my warning"); stop("my error") } assertCondition(ff(), "warning") ## but assertWarning does not allow an error to follow try(assertWarning(ff())) assertCondition(ff(), "error") # ok assertCondition(ff(), "error", "warning") # ok (quietly, catching warning) ## assert that assertC..() does not assert [and use *one* argument only] assertCondition( assertCondition(sqrt( 2 ), "warning") ) assertCondition( assertCondition(sqrt("abc"), "warning"), "error") assertCondition( assertCondition(matrix(1:8, 4,3), "error"), "error") } \keyword{programming} \keyword{error}