#!/usr/bin/r -t
#
# Copyright (C) 2010 - 2014 Dirk Eddelbuettel and Romain Francois
#
# This file is part of Rcpp.
#
# Rcpp is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Rcpp is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Rcpp. If not, see .
.runThisTest <- Sys.getenv("RunAllRcppTests") == "yes"
if (.runThisTest) {
.setUp <- Rcpp:::unitTestSetup("misc.cpp")
test.Symbol <- function(){
res <- symbol_()
checkTrue( res[1L], msg = "Symbol creation - SYMSXP " )
checkTrue( res[2L], msg = "Symbol creation - CHARSXP " )
checkTrue( res[3L], msg = "Symbol creation - STRSXP " )
checkTrue( res[4L], msg = "Symbol creation - std::string " )
}
test.Symbol.notcompatible <- function(){
checkException( symbol_ctor(symbol_ctor), msg = "Symbol not compatible with function" )
checkException( symbol_ctor(asNamespace("Rcpp")), msg = "Symbol not compatible with environment" )
checkException( symbol_ctor(1:10), msg = "Symbol not compatible with integer" )
checkException( symbol_ctor(TRUE), msg = "Symbol not compatible with logical" )
checkException( symbol_ctor(1.3), msg = "Symbol not compatible with numeric" )
checkException( symbol_ctor(as.raw(1) ), msg = "Symbol not compatible with raw" )
}
test.Argument <- function(){
checkEquals( Argument_(), list( x = 2L, y = 3L ) , msg = "Argument")
}
test.Dimension.const <- function(){
checkEquals( Dimension_const( c(2L, 2L)) , 2L, msg = "testing const operator[]" )
}
test.evaluator.error <- function(){
checkException( evaluator_error(), msg = "Rcpp_eval( stop() )" )
}
test.evaluator.ok <- function(){
checkEquals( sort(evaluator_ok(1:10)), 1:10, msg = "Rcpp_eval running fine" )
}
test.exceptions <- function(){
can.demangle <- Rcpp:::capabilities()[["demangling"]]
e <- tryCatch( exceptions_(), "C++Error" = function(e) e )
checkTrue( "C++Error" %in% class(e), msg = "exception class C++Error" )
if( can.demangle ){
checkTrue( "std::range_error" %in% class(e), msg = "exception class std::range_error" )
}
checkEquals( e$message, "boom", msg = "exception message" )
if( can.demangle ){
# same with direct handler
e <- tryCatch( exceptions_(), "std::range_error" = function(e) e )
checkTrue( "C++Error" %in% class(e), msg = "(direct handler) exception class C++Error" )
checkTrue( "std::range_error" %in% class(e), msg = "(direct handler) exception class std::range_error" )
checkEquals( e$message, "boom", msg = "(direct handler) exception message" )
}
f <- function(){
try( exceptions_(), silent = TRUE)
"hello world"
}
checkEquals( f(), "hello world", msg = "life continues after an exception" )
}
test.has.iterator <- function(){
has_it <- has_iterator_()
checkTrue( has_it[1L] , msg = "has_iterator< std::vector >" )
checkTrue( has_it[2L] , msg = "has_iterator< std::ist >" )
checkTrue( has_it[3L] , msg = "has_iterator< std::deque >" )
checkTrue( has_it[4L] , msg = "has_iterator< std::set >" )
checkTrue( has_it[5L] , msg = "has_iterator< std::map >" )
checkTrue( ! has_it[6L] , msg = "has_iterator< std::pair >" )
checkTrue( ! has_it[7L] , msg = "Rcpp::Symbol" )
}
test.AreMacrosDefined <- function(){
checkTrue( Rcpp:::areMacrosDefined( "__cplusplus" ) )
}
test.rcout <- function(){
## define test string that is written to two files
teststr <- "First line.\nSecond line."
rcppfile <- tempfile()
rfile <- tempfile()
## write to test_rcpp.txt from Rcpp
test_rcout(rcppfile, teststr )
## write to test_r.txt from R
cat( teststr, file=rfile, sep='\n' )
## compare whether the two files have the same data
checkEquals( readLines(rcppfile), readLines(rfile), msg="Rcout output")
}
test.na_proxy <- function(){
checkEquals(
na_proxy(),
rep(c(TRUE,TRUE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE) , 2),
msg = "Na_Proxy NA == handling"
)
}
test.StretchyList <- function(){
checkEquals(
stretchy_list(),
pairlist( "foo", 1L, 3.2 )
)
}
test.named_StretchyList <- function(){
checkEquals(
named_stretchy_list(),
pairlist( a = "foo", b = 1L, c = 3.2 )
)
}
}