package com.oracle.truffle.js.test.interop;
import static com.oracle.truffle.js.lang.JavaScriptLanguage.ID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value;
import org.graalvm.polyglot.proxy.ProxyArray;
import org.graalvm.polyglot.proxy.ProxyExecutable;
import org.graalvm.polyglot.proxy.ProxyInstantiable;
import org.graalvm.polyglot.proxy.ProxyObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.oracle.truffle.js.test.JSTest;
public class ReflectInteropTest {
private Context context;
@Before
public void setUp() {
context = JSTest.newContextBuilder().build();
}
@After
public void tearDown() {
context.close();
}
@Test
public void reflectApply() {
ProxyExecutable function = (args) -> 40 + args.length;
Value result = context.eval(ID, "(f, ...args) => Reflect.apply(f, null, args)").execute(function, "et", "al");
assertTrue(result.fitsInInt());
assertEquals(42, result.asInt());
}
@Test
public void reflectConstruct() {
ProxyInstantiable constructor = (args) -> ProxyArray.fromArray((Object[]) args);
Value result = context.eval(ID, "(f, ...args) => Reflect.construct(f, args)").execute(constructor, "et", "al");
assertTrue(result.hasArrayElements());
assertEquals(2, result.getArraySize());
assertEquals("et", result.getArrayElement(0).asString());
assertEquals("al", result.getArrayElement(1).asString());
}
@Test
public void reflectGet() {
HashMap<String, Object> map = new HashMap<>();
map.put("p1", 41);
map.put("p2", 42);
map.put("p3", 43);
ProxyObject proxyObject = ProxyObject.fromMap(map);
Value result = context.eval(ID, "Reflect.get").execute(proxyObject, "p2");
assertTrue(result.fitsInInt());
assertEquals(42, result.asInt());
}
@Test
public void reflectSet() {
HashMap<String, Object> map = new HashMap<>();
map.put("p1", 41);
map.put("p2", 42);
map.put("p3", 43);
ProxyObject proxyObject = ProxyObject.fromMap(map);
context.eval(ID, "Reflect.set").execute(proxyObject, "p4", 44);
assertTrue(map.containsKey("p4"));
assertEquals(44, context.asValue(map.get("p4")).asInt());
}
@Test
public void reflectHas() {
HashMap<String, Object> map = new HashMap<>();
map.put("p1", 41);
map.put("p2", 42);
map.put("p3", 43);
ProxyObject proxyObject = ProxyObject.fromMap(map);
Value reflectHas = context.eval(ID, "Reflect.has");
assertTrue(reflectHas.execute(proxyObject, "p2").asBoolean());
assertTrue(reflectHas.execute(proxyObject, "p3").asBoolean());
assertFalse(reflectHas.execute(proxyObject, "p4").asBoolean());
}
@Test
public void reflectOwnKeys() {
HashMap<String, Object> map = new HashMap<>();
map.put("p1", 41);
map.put("p2", 42);
map.put("p3", 43);
ProxyObject proxyObject = ProxyObject.fromMap(map);
Value reflectOwnKeys = context.eval(ID, "Reflect.ownKeys");
assertEquals(Arrays.asList("p1", "p2", "p3"), reflectOwnKeys.execute(proxyObject).as(List.class));
}
@Test
public void reflectDeleteProperty() {
HashMap<String, Object> map = new HashMap<>();
map.put("p1", 41);
map.put("p2", 42);
map.put("p3", 43);
ProxyObject proxyObject = ProxyObject.fromMap(map);
Value reflectDelete = context.eval(ID, "Reflect.deleteProperty");
assertTrue(reflectDelete.execute(proxyObject, "p1").asBoolean());
assertFalse(reflectDelete.execute(proxyObject, "p1").asBoolean());
assertEquals(2, map.size());
assertTrue(map.containsKey("p2"));
assertTrue(map.containsKey("p3"));
assertFalse(reflectDelete.execute(proxyObject, 42).asBoolean());
}
}