package com.oracle.truffle.llvm.tests.interop;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.llvm.tests.interop.values.BoxedStringValue;
import com.oracle.truffle.tck.TruffleRunner;
import com.oracle.truffle.tck.TruffleRunner.Inject;
import org.graalvm.polyglot.Value;
@RunWith(TruffleRunner.class)
public class PolyglotScopeTest extends InteropTestBase {
private static Object testLibrary;
@BeforeClass
public static void loadTestBitcode() {
testLibrary = loadTestBitcodeInternal("polyglotScopeTest.c");
}
public static class TestImportConstNode extends SulongTestNode {
public TestImportConstNode() {
super(testLibrary, "test_import_const");
}
}
@Test
public void testImportConst(@Inject(TestImportConstNode.class) CallTarget testImport) {
String value = "testImportConstValue";
runWithPolyglot.getPolyglotContext().getPolyglotBindings().putMember("constName", value);
Object ret = testImport.call();
Assert.assertEquals(value, ret);
}
public static class TestImportExistsNode extends SulongTestNode {
public TestImportExistsNode() {
super(testLibrary, "test_import_exists");
}
}
@Test
public void testImportFound(@Inject(TestImportExistsNode.class) CallTarget testImportExists) {
runWithPolyglot.getPolyglotContext().getPolyglotBindings().putMember("existing_name", "value");
Object ret = testImportExists.call("existing_name");
Value retValue = runWithPolyglot.getPolyglotContext().asValue(ret);
Assert.assertTrue("exists", retValue.asBoolean());
}
@Test
public void testImportNotFound(@Inject(TestImportExistsNode.class) CallTarget testImportExists) {
Object ret = testImportExists.call("not_existing_name");
Value retValue = runWithPolyglot.getPolyglotContext().asValue(ret);
Assert.assertFalse("exists", retValue.asBoolean());
}
public static class TestImportVarNode extends SulongTestNode {
public TestImportVarNode() {
super(testLibrary, "test_import_var");
}
}
@Test
public void testImportVar(@Inject(TestImportVarNode.class) CallTarget testImport) {
String value = "testImportVarValue";
runWithPolyglot.getPolyglotContext().getPolyglotBindings().putMember("varName", value);
Object ret = testImport.call("varName");
Assert.assertEquals(value, ret);
}
@Test
public void testImportBoxed(@Inject(TestImportVarNode.class) CallTarget testImport) {
String value = "testImportBoxedValue";
runWithPolyglot.getPolyglotContext().getPolyglotBindings().putMember("boxedName", value);
Object ret = testImport.call(new BoxedStringValue("boxedName"));
Assert.assertEquals(value, ret);
}
public static class TestExportNode extends SulongTestNode {
public TestExportNode() {
super(testLibrary, "test_export");
}
}
@Test
public void testExport(@Inject(TestExportNode.class) CallTarget testExport) {
runWithPolyglot.getPolyglotContext().getPolyglotBindings().removeMember("exportName");
testExport.call("exportName");
}
}