package com.oracle.truffle.js.test.polyglot;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collections;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Source;
import org.graalvm.polyglot.Value;
import org.graalvm.polyglot.proxy.ProxyArray;
import org.graalvm.polyglot.proxy.ProxyObject;
import org.junit.Test;
import com.oracle.truffle.js.lang.JavaScriptLanguage;
import com.oracle.truffle.js.test.JSTest;
public class JavaScriptLanguageTest {
@Test
public void testToStringNestingDepth() {
try (Context context = JSTest.newContextBuilder().build()) {
context.getBindings("js").putMember("array", new ProxyArray() {
@Override
public Object get(long index) {
return this;
}
@Override
public void set(long index, Value arg1) {
}
@Override
public long getSize() {
return 10;
}
});
Source source = Source.newBuilder("js", "''+array; array", "noname").interactive(true).buildLiteral();
context.eval(source);
}
}
@Test
public void testToStringForeignNull() {
try (Context context = JSTest.newContextBuilder().build()) {
context.getBindings("js").putMember("NULL", ForeignTestMap.newNull());
Value result = context.eval(JavaScriptLanguage.ID, "[NULL, NULL];");
assertTrue(result.toString(), result.toString().contains("null,"));
result = context.eval(JavaScriptLanguage.ID, "String([NULL, NULL]);");
assertEquals("null,null", result.asString());
}
}
@Test
public void testToStringForeignArray() {
try (Context context = JSTest.newContextBuilder().build()) {
context.getBindings("js").putMember("array", new ProxyArray() {
@Override
public Object get(long index) {
return index;
}
@Override
public void set(long index, Value value) {
}
@Override
public long getSize() {
return 5;
}
});
Value result = context.eval(JavaScriptLanguage.ID, "[array];");
assertTrue(result.toString(), result.toString().contains("0, 1, 2, 3, 4"));
result = context.eval(JavaScriptLanguage.ID, "String([array]);");
assertTrue(result.toString(), result.asString().contains("0,1,2,3,4"));
result = context.eval(JavaScriptLanguage.ID, "'' + array;");
assertTrue(result.toString(), result.asString().contains("0,1,2,3,4"));
}
}
@Test
public void testToStringForeignObject() {
try (Context context = JSTest.newContextBuilder().build()) {
context.getBindings("js").putMember("obj", ProxyObject.fromMap(Collections.singletonMap("answer", 42)));
Value result = context.eval(JavaScriptLanguage.ID, "[obj];");
assertTrue(result.toString(), result.toString().contains("{answer: 42}"));
result = context.eval(JavaScriptLanguage.ID, "String([obj]);");
assertTrue(result.toString(), result.asString().contains("[object Object]"));
result = context.eval(JavaScriptLanguage.ID, "'' + obj;");
assertTrue(result.toString(), result.asString().contains("[object Object]"));
}
}
@Test
public void testToStringNestedArray() {
try (Context context = JSTest.newContextBuilder().build()) {
Value result = context.eval(JavaScriptLanguage.ID, "[1,[2,[3,[4,[5]]]]];");
assertEquals("(2)[1, [2, [3, Array(2)]]]", result.toString());
}
}
@Test
public void testToPrimitiveHostObject() {
try (Context context = Context.newBuilder(JavaScriptLanguage.ID).allowAllAccess(true).build()) {
context.getBindings(JavaScriptLanguage.ID).putMember("obj", new TestHostObject());
Value res = context.eval(JavaScriptLanguage.ID, "obj + obj");
assertEquals(84, res.asInt());
}
}
public static final class TestHostObject {
@SuppressWarnings("static-method")
public int valueOf() {
return 42;
}
@Override
public String toString() {
return "string";
}
}
@Test
public void testRemoveBindings() {
try (Context context = JSTest.newContextBuilder().build()) {
Value bindings = context.getBindings("js");
assertTrue(bindings.removeMember("eval"));
assertFalse(bindings.hasMember("foo"));
context.eval(JavaScriptLanguage.ID, "foo=42;");
assertTrue(bindings.hasMember("foo"));
assertTrue(bindings.removeMember("foo"));
assertFalse(bindings.hasMember("foo"));
}
}
}