diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java index 4df7b6905fc49ccf0a9c85da1bd25854a7a25507..75a2ea15c3029a50da3eb3d6002cffa57e7f9501 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/AttributesPrinter.java @@ -44,7 +44,9 @@ final class AttributesPrinter implements ValuePrinter<RAttributable> { } final StringBuilder savedBuffer = printCtx.getTagBuffer(); - printCtx.resetTagBuffer(); + if (printCtx.attrDepth() == 0) { + printCtx.resetTagBuffer(); + } for (RAttributesLayout.RAttribute a : RAttributesLayout.asIterable(attrs)) { if (useSlots && RRuntime.CLASS_SYMBOL.equals(a.getName())) { continue; @@ -88,22 +90,25 @@ final class AttributesPrinter implements ValuePrinter<RAttributable> { } else { tag = String.format("attr(,\"%s\")", a.getName()); } - out.println(tag); StringBuilder buff = printCtx.getOrCreateTagBuffer(); int origLen = buff.length(); buff.append(tag); - - RContext ctx = RContext.getInstance(); - if (ctx.isMethodTableDispatchOn() && utils.isS4(a.getValue())) { - S4ObjectPrinter.printS4(printCtx, a.getValue()); - // throw new UnsupportedOperationException("TODO"); - } else { - if (a.getValue() instanceof RAttributable && ((RAttributable) a.getValue()).isObject()) { - RContext.getEngine().printResult(ctx, a.getValue()); + out.println(buff); + printCtx.updateAttrDepth(+1); + try { + RContext ctx = RContext.getInstance(); + if (ctx.isMethodTableDispatchOn() && utils.isS4(a.getValue())) { + S4ObjectPrinter.printS4(printCtx, a.getValue()); } else { - ValuePrinters.INSTANCE.print(a.getValue(), printCtx); + if (a.getValue() instanceof RAttributable && ((RAttributable) a.getValue()).isObject()) { + RContext.getEngine().printResult(ctx, a.getValue()); + } else { + ValuePrinters.INSTANCE.print(a.getValue(), printCtx); + } } + } finally { + printCtx.updateAttrDepth(-1); } // restore tag buffer to its original value diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java index e4dc0a297c9d59a31b7fe63e5f9df8a7bce5a39f..a021acd4bac26b9657e6ffcd616ded9d13bb87ee 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/PrintContext.java @@ -35,6 +35,7 @@ final class PrintContext { private final PrettyPrintWriter out; private final Map<String, Object> attrs = new HashMap<>(); private StringBuilder tagbuf; + private int attrDepth; private static final ThreadLocal<ArrayDeque<PrintContext>> printCtxTL = new ThreadLocal<>(); @@ -92,6 +93,15 @@ final class PrintContext { attrs.put(attrName, attrValue); } + public int attrDepth() { + return attrDepth; + } + + public void updateAttrDepth(int attrDepthDiff) { + attrDepth += attrDepthDiff; + assert (attrDepth >= 0) : "Invalid attrDepth=" + attrDepth; + } + public PrintContext cloneContext() { PrintContext cloned = new PrintContext(pn, params.cloneParameters(), out); cloned.attrs.putAll(attrs); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index c0d15c5eb83077efeb6892b339c0b28dbaee9538..9ac630fd27319195129f2260540384875c86d636 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -10746,7 +10746,7 @@ $class #argv <- list(c(1000, 1e+07, 1));attributes(argv[[1]]); NULL -##com.oracle.truffle.r.test.builtins.TestBuiltin_attributes.testattributes23#Ignored.ImplementationError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_attributes.testattributes23#Ignored.OutputFormatting# #argv <- list(structure(list(), .Names = character(0), arguments = structure('object', simpleOnly = TRUE), signatures = list(), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')), class = structure('listOfMethods', package = 'methods')));attributes(argv[[1]]); $names character(0) @@ -15842,7 +15842,7 @@ attr(,"class") attr(,"class")attr(,"package") [1] "methods" -##com.oracle.truffle.r.test.builtins.TestBuiltin_classassign.testclassassign18#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_classassign.testclassassign18#Output.IgnoreWhitespace# #argv <- list(structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]); function (x, y = NULL) .Internal(crossprod(x, y)) @@ -16728,7 +16728,7 @@ Warning message: In format.data.frame(x, digits = digits, na.encode = FALSE) : corrupt data frame: columns will be truncated or padded with NAs -##com.oracle.truffle.r.test.builtins.TestBuiltin_copyDFattr.testcopyDFattr13#Ignored.ReferenceError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_copyDFattr.testcopyDFattr13#Ignored.ImplementationError# #argv <- list(structure(list(x = 1:10, y = c(-0.626453810742332, 0.183643324222082, -0.835628612410047, 1.59528080213779, 0.329507771815361, -0.820468384118015, 0.487429052428485, 0.738324705129217, 0.575781351653492, -0.305388387156356), z = structure(c(9L, 3L, 6L, 2L, 10L, 5L, 1L, 4L, 8L, 7L), .Label = c('a', 'c', 'f', 'h', 'i', 'p', 'v', 'x', 'y', 'z'), class = 'factor')), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv')), structure(list(x = NULL, y = NULL, z = NULL), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv'))); .Internal(copyDFattr(argv[[1]], argv[[2]])) $x NULL @@ -35813,7 +35813,7 @@ TRUE [1] "2003-10-09 04:00:00 GMT" -##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist19#Ignored.ImplementationError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist19#Ignored.OutputFormatting# #argv <- list(arguments = structure('object', simpleOnly = TRUE), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')));list(argv[[1]],argv[[2]]); [[1]] [1] "object" @@ -36161,7 +36161,7 @@ x@aa[[i]] [1] TRUE -##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist32#Ignored.ImplementationError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist32#Ignored.OutputFormatting# #argv <- list(structure(function (e1, e2) standardGeneric('Ops'), generic = structure('Ops', package = 'base'), package = 'base', group = list(), valueClass = character(0), signature = c('e1', 'e2'), default = quote(`\001NULL\001`), skeleton = quote((function (e1, e2) stop('invalid call in method dispatch to Ops (no default method)', domain = NA))(e1, e2)), groupMembers = list('Arith', 'Compare', 'Logic'), class = structure('groupGenericFunction', package = 'methods')));list(argv[[1]]); [[1]] function (e1, e2) @@ -37028,7 +37028,7 @@ attr(,"constant") [1] 0.5234843 -##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist65#Output.IgnoreWhitespace#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_list.testlist65#Output.IgnoreWhitespace# #argv <- list(ANY = structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = structure('crossprod', package = 'base'), class = structure('derivedDefaultMethod', package = 'methods')));list(argv[[1]]); [[1]] function (x, y = NULL) @@ -45680,7 +45680,7 @@ FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #argv <- list(structure(c(1208822400, 1208908800, 1208995200, 1209081600, 1209168000, 1209254400), class = c('POSIXct', 'POSIXt'), tzone = 'GMT'), structure(1209168000, class = c('POSIXct', 'POSIXt'), tzone = 'GMT'));`<=`(argv[[1]],argv[[2]]); [1] TRUE TRUE TRUE TRUE TRUE FALSE -##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators257#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators257# #argv <- list(structure(c(1, 1.4142135623731, 1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459, 2.82842712474619, 3, 3.16227766016838), id = 'test 1', class = structure('withId', package = '.GlobalEnv')), 1);`%%`(argv[[1]],argv[[2]]); [1] 0.0000000 0.4142136 0.7320508 0.0000000 0.2360680 0.4494897 0.6457513 [8] 0.8284271 0.0000000 0.1622777 @@ -46171,7 +46171,7 @@ Error in |argv[[1]] : 1 argument passed to '|' which requires 2 [1,] TRUE TRUE [2,] FALSE TRUE -##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators31#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators31# #argv <- list(structure(FALSE, class = structure('foo', package = '.GlobalEnv')), NA);`+`(argv[[1]],argv[[2]]); [1] NA attr(,"class") @@ -46884,7 +46884,7 @@ function (x, base = exp(1)) .Primitive("log") 2 NA NA NA NA NA <NA> 3 1 2.0 3.0+0i NA TRUE def -##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators355#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators355# #argv <- list(structure(NA, .Dim = c(1L, 1L), name = 'Sam', class = structure('Foo', package = '.GlobalEnv')));`(`(argv[[1]]); [,1] [1,] NA @@ -47939,7 +47939,7 @@ FALSE FALSE FALSE FALSE FALSE FALSE gridSVG2 TRUE -##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators9#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_operators.testoperators9# #argv <- list(structure(1:10, class = structure('NumericNotStructure', package = '.GlobalEnv')), 1);`+`(argv[[1]],argv[[2]]); [1] 2 3 4 5 6 7 8 9 10 11 attr(,"class") @@ -71502,7 +71502,7 @@ numeric(0) ar1 ar2 intercept trend 0.100911916 0.103585134 0.246129163 0.008388095 -##com.oracle.truffle.r.test.builtins.TestBuiltin_sqrt.testsqrt7#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_sqrt.testsqrt7# #argv <- list(structure(1:10, id = 'test 1', class = structure('withId', package = '.GlobalEnv')));sqrt(argv[[1]]); [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 [9] 3.000000 3.162278 diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java index 778809e2c2a806f00968e4465ce7a58f6ee1fdad..0a5b88ca84a285c9b46903509a4fdfbbedaa65ba 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestR5.java @@ -105,6 +105,10 @@ public class TestR5 extends TestBase { // list/modify methods assertEval("{ clazz <- setRefClass('Foo19R5'); clazz$methods('inexistingMethod') }"); + // FastR does not output environment info in output while GnuR does: + // function (object) + // standardGeneric("gen") + // <environment: 0x...> assertSuppress(Ignored.OutputFormatting, "clazz <- setRefClass('Foo20R5', methods = list(foo = function() NULL)); clazz$methods('foo')"); assertSuppress("clazz <- setRefClass('Foo21R5', methods = list(foo = function() NULL)); clazz$new()$foo(); clazz$methods(foo = function(x) x); clazz$new()$foo(3)"); @@ -128,6 +132,7 @@ public class TestR5 extends TestBase { assertSuppress("A1R5 <- setRefClass('A1R5', methods = list(foo = function() { print('hello') })); B1R5 <- setRefClass('B1R5', contains = 'A1R5'); obj <- B1R5$new(); obj$foo()"); assertSuppress("A2R5 <- setRefClass('A2R5', methods = list(foo = function() { print('hello') })); B2R5 <- setRefClass('B2R5', methods = list(foo = function() { print('world') }), contains = 'A2R5'); obj <- B2R5$new(); obj$foo()"); assertSuppress("A3R5 <- setRefClass('A3R5', methods = list(foo = function() { print('hello') })); B3R5 <- setRefClass('B3R5', methods = list(foo = function() { callSuper(); print('world') }), contains = 'A3R5'); obj <- B3R5$new(); obj$foo()"); + // "Class methods sorted differently => Ignored.OutputFormatting assertSuppress(Ignored.OutputFormatting, "{ setRefClass('A4R5', fields = c('a')); setRefClass('B4R5', contains = 'A4R5', methods = list(set_a = function(a){ a <<- a })) }"); assertEval("A5R5 <- setRefClass('A5R5', field = c('a'), methods = list(initialize <- function() { a <<- 0 })); B5R5 <- setRefClass('B5R5', field = c('a'), methods = list(initialize <- function() { a <<- 'hello' })); C5R5 <- setRefClass('C5R5', contains = c('A5R5', 'B5R5')); obj <- C5R5$new(); obj$a <- raw(0)"); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java index 633c0c63c65d43fbc8c0e5e7db50339f8ff3a86b..06c265e265259c9c24f49bb013144799fca8b1bc 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java @@ -112,6 +112,9 @@ public class TestS4 extends TestRBase { @Test public void testMethods() { // output slightly different from GNU R even though we use R's "show" method to print it + // GNU R shows environment info: + // function(object) standardGeneric("gen") + // <environment: 0x...> assertEval(Ignored.OutputFormatting, "{ setGeneric(\"gen\", function(object) standardGeneric(\"gen\")); res<-print(gen); removeGeneric(\"gen\"); res }"); assertEval(Ignored.OutputFormatting, "{ gen<-function(object) 0; setGeneric(\"gen\"); res<-print(gen); removeGeneric(\"gen\"); res }"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java index 7e3bdde2b505a414a1a61b49ed2c9a61da682ed1..ce5e6d262c52e817fa787d4b1a7b92160cbf3d34 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/TestBase.java @@ -675,42 +675,48 @@ public class TestBase { microTestFailed(); if (!ProcessFailedTests || ShowFailedTestsResults) { // Show hint where first diff occurs - use preprocessed text - int len = Math.min(checkResult.expected.length(), checkResult.result.length()); + int expectedLen = checkResult.expected.length(); + int testLen = checkResult.result.length(); + int len = Math.min(expectedLen, testLen); int line = 0; int col = 0; + StringBuilder sb = new StringBuilder(128); for (int i = 0; i < len; i++) { char c = checkResult.expected.charAt(i); if (c != checkResult.result.charAt(i)) { - StringBuilder sb = new StringBuilder(64); - sb.append("index=").append(i).append('[').append(line + 1).append(':').append(col + 1).append("] \""); - int dLen = Math.min(i + 20, len); - for (int j = i; j < dLen; j++) { - char ch = checkResult.expected.charAt(j); - switch (ch) { - case '\n': - sb.append("\\n"); - break; - case '\r': - sb.append("\\r"); - break; - case '\t': - sb.append("\\t"); - break; - case '\b': - sb.append("\\b"); - break; - case '\f': - sb.append("\\f"); - break; - default: - sb.append(ch); + sb.append("First different char index: ").append(i).append('[').append(line + 1).append(':').append(col + 1).append("]\n Expected: "); + for (int type = 0; type <= 1; type++) { + int maxLen = (type == 0) ? expectedLen : testLen; + int dLen = Math.min(i + 60, maxLen); + for (int j = i; j < dLen; j++) { + char ch = ((type == 0) ? checkResult.expected : checkResult.result).charAt(j); + switch (ch) { + case '\n': + sb.append("\\n"); + break; + case '\r': + sb.append("\\r"); + break; + case '\t': + sb.append("\\t"); + break; + case '\b': + sb.append("\\b"); + break; + case '\f': + sb.append("\\f"); + break; + default: + sb.append(ch); + } + } + if (dLen < maxLen) { + sb.append("..."); + } + if (type == 0) { + sb.append("\n FastR: "); } } - if (dLen < len) { - sb.append("..."); - } - sb.append('"'); - System.err.printf("%16s %s%n", "Prepr.text diff:", sb); break; } col++; @@ -719,6 +725,7 @@ public class TestBase { col = 0; } } + System.err.println(sb); } if (inputs.length > 1) { diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java index d5425ad60c595995c9591d1886dfa45285e53db4..14f523cdfde53f810bec0325381111ffd3ffbc1f 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_attributes.java @@ -129,8 +129,10 @@ public class TestBuiltin_attributes extends TestBase { @Test public void testattributes23() { - // FIXME several differences in output - assertEval(Ignored.ImplementationError, + // Quotes vs. apostrophes + // GnuR: standardGeneric("show") + // FastR: standardGeneric('show') + assertEval(Ignored.OutputFormatting, "argv <- list(structure(list(), .Names = character(0), arguments = structure('object', simpleOnly = TRUE), signatures = list(), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')), class = structure('listOfMethods', package = 'methods')));attributes(argv[[1]]);"); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java index 4cd74097c70bd35476de9207d4172a73b4f34fc1..2d8fe885a66a6fc743b46658e2289ea24705c064 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_classassign.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -19,7 +19,9 @@ public class TestBuiltin_classassign extends TestBase { @Test public void testclassassign1() { - // GnuR: extra newline before '.Ignored' and several 'attr(,"class")' + // Quotes vs. apostrophes: + // GnuR: function (x, mode = "any") + // FastR: function (x, mode = 'any') assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (x, mode = 'any') .Internal(as.vector(x, mode)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @@ -43,7 +45,9 @@ public class TestBuiltin_classassign extends TestBase { @Test public void testclassassign5() { - // GnuR: extra 'attr(,"class")' + // FastR does not output the following: + // attr(,"class")attr(,"package") + // [1] "methods" assertEval(Ignored.OutputFormatting, "argv <- list(structure(character(0), .Names = character(0), package = character(0), class = structure('signature', package = 'methods')), value = structure('signature', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @@ -65,7 +69,9 @@ public class TestBuiltin_classassign extends TestBase { @Test public void testclassassign9() { - // GnuR: extra 'attr(,"class")' + // FastR does not output the following: + // attr(,"class")attr(,"package") + // [1] ".GlobalEnv" assertEval(Ignored.OutputFormatting, "argv <- list(structure(c(1, 0, 0, 0, 1, 0, 0, 0, 1), .Dim = c(3L, 3L), class = structure('mmat2', package = '.GlobalEnv')), value = structure('mmat2', package = '.GlobalEnv'));`class<-`(argv[[1]],argv[[2]]);"); } @@ -91,14 +97,16 @@ public class TestBuiltin_classassign extends TestBase { @Test public void testclassassign13() { - // GnuR: extra 'attr(,"class")' + // Quotes vs. apostrophes in output + // Expected: "qr.fitted")attr(,"target")qr"ANY"attr(,... + // FastR: 'qr.fitted')attr(,"target")qr"ANY"attr(,... assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (qr, y, k = qr$rank) standardGeneric('qr.fitted'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'qr', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'qr', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @Test public void testclassassign14() { - // GnuR: extra 'attr(,"class")' + // Quotes vs. apostrophes in output assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (x = 1, nrow, ncol) standardGeneric('diag'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @@ -110,28 +118,27 @@ public class TestBuiltin_classassign extends TestBase { @Test public void testclassassign16() { - // GnuR: extra 'attr(,"class")' + // Quotes vs. apostrophes in output assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (x, y, ...) standardGeneric('plot'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @Test public void testclassassign17() { - // GnuR: extra 'attr(,"class")' + // Quotes vs. apostrophes in output assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (x, logarithm = TRUE, ...) UseMethod('determinant'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @Test public void testclassassign18() { - // GnuR: extra 'attr(,"class")' - assertEval(Ignored.OutputFormatting, + assertEval(Output.IgnoreWhitespace, "argv <- list(structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } @Test public void testclassassign19() { - // GnuR: extra 'attr(,"class")' + // Quotes vs. apostrophes in output assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (obj, force = FALSE) standardGeneric('unname'), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'obj', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'obj', package = 'methods'), generic = character(0), class = structure('MethodDefinition', package = 'methods')), value = structure('MethodDefinition', package = 'methods'));`class<-`(argv[[1]],argv[[2]]);"); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java index eab5145ae376887c17bb8c306b7c4e2645a03f1a..91d5e42577e88276bdeb5b1599408f48c8f7720f 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_copyDFattr.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -82,8 +82,10 @@ public class TestBuiltin_copyDFattr extends TestBase { @Test public void testcopyDFattr13() { - // GnuR extra attr(,"class") in output - not sure if appropriate - assertEval(Ignored.ReferenceError, + // GNU R forces row.names=c(NA, 10L) to become 1 2 3 4 5 6 7 8 9 10 + // while FastR retains c(NA, 10L) + // manual says that row.names should have the same size like vector and do not contain NAs + assertEval(Ignored.ImplementationError, "argv <- list(structure(list(x = 1:10, y = c(-0.626453810742332, 0.183643324222082, -0.835628612410047, 1.59528080213779, 0.329507771815361, -0.820468384118015, 0.487429052428485, 0.738324705129217, 0.575781351653492, -0.305388387156356), z = structure(c(9L, 3L, 6L, 2L, 10L, 5L, 1L, 4L, 8L, 7L), .Label = c('a', 'c', 'f', 'h', 'i', 'p', 'v', 'x', 'y', 'z'), class = 'factor')), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv')), structure(list(x = NULL, y = NULL, z = NULL), .Names = c('x', 'y', 'z'), row.names = c(NA, 10L), .S3Class = 'data.frame', timestamps = structure(1386392033.84327, class = c('POSIXct', 'POSIXt')), class = structure('myFrame', package = '.GlobalEnv'))); .Internal(copyDFattr(argv[[1]], argv[[2]]))"); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java index 7b5ffe64deb8b49683d103d3d20bccf3a60bdb27..526022c053c57324511482cbd3024bb1b4f3cf0d 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_list.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -114,7 +114,8 @@ public class TestBuiltin_list extends TestBase { @Test public void testlist19() { - assertEval(Ignored.ImplementationError, + // Quotes vs. apostrophes and whitespace diffs + assertEval(Ignored.OutputFormatting, "argv <- list(arguments = structure('object', simpleOnly = TRUE), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')));list(argv[[1]],argv[[2]]);"); } @@ -181,7 +182,8 @@ public class TestBuiltin_list extends TestBase { @Test public void testlist32() { - assertEval(Ignored.ImplementationError, + // Quotes vs. apostrophes and whitespace diffs + assertEval(Ignored.OutputFormatting, "argv <- list(structure(function (e1, e2) standardGeneric('Ops'), generic = structure('Ops', package = 'base'), package = 'base', group = list(), valueClass = character(0), signature = c('e1', 'e2'), default = quote(`\\001NULL\\001`), skeleton = quote((function (e1, e2) stop('invalid call in method dispatch to Ops (no default method)', domain = NA))(e1, e2)), groupMembers = list('Arith', 'Compare', 'Logic'), class = structure('groupGenericFunction', package = 'methods')));list(argv[[1]]);"); } @@ -342,12 +344,7 @@ public class TestBuiltin_list extends TestBase { @Test public void testlist65() { - // FIXME Besides whitespace diff in "function (x, y..." output there's - // at several places e.g. after '[1] "signature"' GnuR outputs - // attr(,"class")attr(,"package") - // while FastR outputs just - // attr(,"package") - assertEval(Output.IgnoreWhitespace, Ignored.OutputFormatting, + assertEval(Output.IgnoreWhitespace, "argv <- list(ANY = structure(function (x, y = NULL) .Internal(crossprod(x, y)), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'x', package = 'methods'), generic = structure('crossprod', package = 'base'), class = structure('derivedDefaultMethod', package = 'methods')));list(argv[[1]]);"); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java index 26b615f6c3acf80d6ac4057e0c3500c8138d7d37..264dc766209354b3b3f1d30bac00c647d1dfe7c8 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_operators.java @@ -60,13 +60,7 @@ public class TestBuiltin_operators extends TestBase { @Test public void testoperators9() { - // FIXME GnuR outputs extra 'attr(,"class")' for the following: - // [1] "NumericNotStructure" - // attr(,"class")attr(,"package") - // FastR outputs - // [1] "NumericNotStructure" - // attr(,"package") - assertEval(Ignored.OutputFormatting, "argv <- list(structure(1:10, class = structure('NumericNotStructure', package = '.GlobalEnv')), 1);`+`(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(1:10, class = structure('NumericNotStructure', package = '.GlobalEnv')), 1);`+`(argv[[1]],argv[[2]]);"); } @Test @@ -176,13 +170,7 @@ public class TestBuiltin_operators extends TestBase { @Test public void testoperators31() { - // FIXME GnuR outputs extra 'attr(,"class")' for the following: - // [1] "foo" - // attr(,"class")attr(,"package") - // FastR outputs - // [1] "foo" - // attr(,"package") - assertEval(Ignored.OutputFormatting, "argv <- list(structure(FALSE, class = structure('foo', package = '.GlobalEnv')), NA);`+`(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(FALSE, class = structure('foo', package = '.GlobalEnv')), NA);`+`(argv[[1]],argv[[2]]);"); } @Test @@ -1308,14 +1296,7 @@ public class TestBuiltin_operators extends TestBase { @Test public void testoperators257() { - // FIXME GnuR outputs extra 'attr(,"class")' for the following: - // [1] "withId" - // attr(,"class")attr(,"package") - // FastR outputs - // [1] "withId" - // attr(,"package") - assertEval(Ignored.OutputFormatting, - "argv <- list(structure(c(1, 1.4142135623731, 1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459, 2.82842712474619, 3, 3.16227766016838), id = 'test 1', class = structure('withId', package = '.GlobalEnv')), 1);`%%`(argv[[1]],argv[[2]]);"); + assertEval("argv <- list(structure(c(1, 1.4142135623731, 1.73205080756888, 2, 2.23606797749979, 2.44948974278318, 2.64575131106459, 2.82842712474619, 3, 3.16227766016838), id = 'test 1', class = structure('withId', package = '.GlobalEnv')), 1);`%%`(argv[[1]],argv[[2]]);"); } @Test @@ -1832,13 +1813,7 @@ public class TestBuiltin_operators extends TestBase { @Test public void testoperators355() { - // FIXME GnuR outputs extra 'attr(,"class")' for the following: - // [1] "Foo" - // attr(,"class")attr(,"package") - // FastR outputs - // [1] "Foo" - // attr(,"package") - assertEval(Ignored.OutputFormatting, "argv <- list(structure(NA, .Dim = c(1L, 1L), name = 'Sam', class = structure('Foo', package = '.GlobalEnv')));`(`(argv[[1]]);"); + assertEval("argv <- list(structure(NA, .Dim = c(1L, 1L), name = 'Sam', class = structure('Foo', package = '.GlobalEnv')));`(`(argv[[1]]);"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java index 05d9ab1503af4b5050944b0b305e6c6516595cd7..910e69287b4a5d667f5a6698abc4b6a973175dc1 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_setS4Object.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2017, Oracle and/or its affiliates + * Copyright (c) 2014, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -104,7 +104,6 @@ public class TestBuiltin_setS4Object extends TestBase { // length of 'dimnames' [1] not equal to array extent // FastR uses apostrophes to quote string: function (object) cat('I am a \'foo\'\n') - // GnuR outputs several attr(,"class")attr(,"package") while GnuR just attr(,"package") assertEval(Ignored.ImplementationError, "argv <- list(structure(list(`NA` = structure(function (object) cat('I am a \\\'foo\\\'\\n'), target = structure('foo', .Names = 'object', package = 'myTst', class = structure('signature', package = 'methods')), defined = structure('foo', .Names = 'object', package = 'myTst', class = structure('signature', package = 'methods')), generic = structure('show', package = 'methods'), class = structure('MethodDefinition', package = 'methods'))), .Names = NA_character_, arguments = structure('object', simpleOnly = TRUE), signatures = list(), generic = structure(function (object) standardGeneric('show'), generic = structure('show', package = 'methods'), package = 'methods', group = list(), valueClass = character(0), signature = structure('object', simpleOnly = TRUE), default = structure(function (object) showDefault(object, FALSE), target = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), defined = structure('ANY', class = structure('signature', package = 'methods'), .Names = 'object', package = 'methods'), generic = structure('show', package = 'methods'), class = structure('derivedDefaultMethod', package = 'methods')), skeleton = quote((function (object) showDefault(object, FALSE))(object)), class = structure('standardGeneric', package = 'methods')), class = structure('listOfMethods', package = 'methods')), TRUE, 0L); .Internal(setS4Object(argv[[1]], argv[[2]], argv[[3]]))"); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java index cc75851fa2cb41368f94ef8fa984ccec610f710d..99e9165c19d1c0af3dc4372a0375afe906d205e3 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_sqrt.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2012-2014, Purdue University - * Copyright (c) 2013, 2017, Oracle and/or its affiliates + * Copyright (c) 2013, 2018, Oracle and/or its affiliates * * All rights reserved. */ @@ -49,11 +49,7 @@ public class TestBuiltin_sqrt extends TestBase { @Test public void testsqrt7() { - // FIXME GnuR outputs - // attr(,"class")attr(,"package") - // while FastR outputs just - // attr(,"package") - assertEval(Ignored.OutputFormatting, "argv <- list(structure(1:10, id = 'test 1', class = structure('withId', package = '.GlobalEnv')));sqrt(argv[[1]]);"); + assertEval("argv <- list(structure(1:10, id = 'test 1', class = structure('withId', package = '.GlobalEnv')));sqrt(argv[[1]]);"); } @Test