package com.oracle.truffle.js.test.instrumentation;
import org.junit.Ignore;
import org.junit.Test;
import com.oracle.truffle.api.instrumentation.StandardTags;
import com.oracle.truffle.js.nodes.instrumentation.JSTags.LiteralTag;
import com.oracle.truffle.js.nodes.instrumentation.JSTags.WritePropertyTag;
public class PrimaryExpressions extends FineGrainedAccessTest {
@Test
public void literalUnd() {
evalWithTag("x = undefined;", LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.UndefinedLiteral.name());
}).exit();
}
@Test
public void literalObj() {
evalWithTag("x = {};", LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.ObjectLiteral.name());
}).exit();
}
@Test
public void literalArray() {
evalWithTag("x = [];", LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.ArrayLiteral.name());
}).exit();
}
@Test
public void functionExpression() {
String src = "x = function() {}";
evalWithTag(src, LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.FunctionLiteral.name());
}).exit();
}
@Ignore
@Test
public void classExpression() {
String src = "x = class A {}";
evalWithTag(src, LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.FunctionLiteral.name());
}).exit();
}
@Test
public void generatorExpression() {
String src = "x = function* foo() {}";
evalWithTag(src, LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.FunctionLiteral.name());
}).exit();
}
@Test
public void asyncFunctionExpression() {
String src = "x = async function foo() {}";
evalWithTag(src, LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.FunctionLiteral.name());
}).exit();
}
@Test
public void coverParentheszed() {
String src = "x = (async function foo() {}, undefined)";
evalWithTag(src, LiteralTag.class);
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.FunctionLiteral.name());
}).exit();
enter(LiteralTag.class, (l) -> {
assertAttribute(l, LITERAL_TYPE, LiteralTag.Type.UndefinedLiteral.name());
}).exit();
}
@Test
public void thiz() {
String src = "(function foo() { this.x = 3 })();";
evalWithTag(src, WritePropertyTag.class);
enter(WritePropertyTag.class, (e, w) -> {
assertAttribute(e, KEY, "x");
w.input(assertJSObjectInput);
w.input(3);
}).exit();
}
@Test
public void expressionTagInFunctionExpression() {
evalWithTag("(function foo() {})", StandardTags.ExpressionTag.class);
enter(StandardTags.ExpressionTag.class, (e, expr) -> {
}).exit();
}
@Test
public void noExpressionTagInFunctionDeclaration() {
evalWithTag("function foo() {};", StandardTags.ExpressionTag.class);
}
}