Skip to content

Commit

Permalink
[PR-446] Add FastR sample to the tutorial and TCK tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
steve-s committed Apr 6, 2017
2 parents 8cac095 + 8c675d0 commit 16fe1b1
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.oracle.truffle.tck.impl;

import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.vm.PolyglotEngine;
import com.oracle.truffle.tck.impl.TruffleLanguageRunner.FastRRunner;

/**
* Tests with code snippets referencing FastR. They are used from {@link PolyglotEngine} & co.
* classes, but executed only when implementation of FastR is around.
*/
@RunWith(FastRRunner.class)
public class PolyglotEngineWithFastR {

private PolyglotEngine engine;

@Before
public void initEngine() {
engine = PolyglotEngine.newBuilder().build();
}

@After
public void disposeEngine() {
engine.dispose();
}

// @formatter:off

@Test
public void testCallRtFunctionFromJava() {
callRFunctionFromJava();
}

// BEGIN: com.oracle.truffle.tck.impl.PolyglotEngineWithFastR#callRFunctionFromJava
@FunctionalInterface
interface BinomQuantile {
int qbinom(double q, int count, double prob);
}

public void callRFunctionFromJava() {
Source src = Source.newBuilder("qbinom").
mimeType("text/x-r").name("qbinom.R").build();
BinomQuantile func = engine.eval(src).as(BinomQuantile.class);
assertEquals(4, func.qbinom(0.37, 10, 0.5));
}
// END: com.oracle.truffle.tck.impl.PolyglotEngineWithFastR#callRFunctionFromJava
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.vm.PolyglotEngine;
import com.oracle.truffle.api.vm.PolyglotEngine.Value;
import com.oracle.truffle.tck.impl.TruffleLanguageRunner.JavaScriptRunner;

/**
* Tests with code snippets referencing JavaScript. They are used from {@link PolyglotEngine} & co.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand All @@ -24,29 +24,47 @@
*/
package com.oracle.truffle.tck.impl;

import com.oracle.truffle.api.vm.PolyglotEngine;
import org.junit.runner.Description;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;

public final class JavaScriptRunner extends BlockJUnit4ClassRunner {
import com.oracle.truffle.api.vm.PolyglotEngine;

public abstract class TruffleLanguageRunner extends BlockJUnit4ClassRunner {

public JavaScriptRunner(Class<?> klass) throws InitializationError {
private final String mimeType;

private TruffleLanguageRunner(Class<?> klass, String mimeType) throws InitializationError {
super(klass);
this.mimeType = mimeType;
}

@Override
protected void runChild(FrameworkMethod method, RunNotifier notifier) {
if (skipOnMissingJavaScript()) {
if (skipOnMissingLanguage(mimeType)) {
notifier.fireTestIgnored(Description.createTestDescription(method.getType(), method.getName()));
} else {
super.runChild(method, notifier);
}
}

private static boolean skipOnMissingJavaScript() {
return !PolyglotEngine.newBuilder().build().getLanguages().containsKey("text/javascript");
private static boolean skipOnMissingLanguage(String mimeType) {
return !PolyglotEngine.newBuilder().build().getLanguages().containsKey(mimeType);
}

public static final class JavaScriptRunner extends TruffleLanguageRunner {

public JavaScriptRunner(Class<?> klass) throws InitializationError {
super(klass, "text/javascript");
}
}

public static final class FastRRunner extends TruffleLanguageRunner {

public FastRRunner(Class<?> klass) throws InitializationError {
super(klass, "text/x-r");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,10 @@
* (TBD)
*
* <h3>Define and call an R function</h3>
* (TBD)
*
* In this sample we use a reference to existing R function {@code qbinom} from the built-in <em>stats</em> package.
*
* {@codesnippet com.oracle.truffle.tck.impl.PolyglotEngineWithFastR#callRFunctionFromJava}
*
* <h2>Call multiple guest language functions with shared state from Java</h2>
*
Expand Down

0 comments on commit 16fe1b1

Please sign in to comment.