package com.oracle.truffle.js.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.PolyglotException;
import org.graalvm.polyglot.PolyglotException.StackFrame;
import org.graalvm.polyglot.Source;
import org.graalvm.polyglot.Value;
import org.junit.Test;
import com.oracle.truffle.js.lang.JavaScriptLanguage;
public class SourceURLTest {
@Test
public void testSourceURL() {
try (Context context = JSTest.newContextBuilder().build()) {
context.eval(Source.newBuilder(JavaScriptLanguage.ID, "" +
"function dumpStack() { return new Error().stack; }\n" +
"function throwError() { throw new Error(); }",
"common.js").buildLiteral());
Value result;
result = context.eval(Source.newBuilder(JavaScriptLanguage.ID, "dumpStack(); //# sourceURL=testsource.js", "test1.js").buildLiteral());
assertTrue(result.isString());
assertTrue(result.asString(), result.asString().contains("testsource.js"));
assertFalse(result.asString(), result.asString().contains("test1.js"));
assertTrue(result.asString(), result.asString().contains("common.js"));
result = context.eval(Source.newBuilder(JavaScriptLanguage.ID, "eval('dumpStack(); //# sourceURL=evalsource.js');", "test2.js").buildLiteral());
assertTrue(result.isString());
assertTrue(result.asString(), result.asString().contains("evalsource.js"));
assertTrue(result.asString(), result.asString().contains("test2.js"));
assertTrue(result.asString(), result.asString().contains("common.js"));
try {
context.eval(Source.newBuilder(JavaScriptLanguage.ID, "throwError(); //# sourceURL=testsource.js", "test3.js").buildLiteral());
fail();
} catch (PolyglotException e) {
assertTrue(e.isGuestException());
verifyGuestFrames(e, Arrays.asList("common.js", "testsource.js"));
}
}
}
@Test
public void testSourceURLInternal() {
try (Context context = JSTest.newContextBuilder().build()) {
context.eval(Source.newBuilder(JavaScriptLanguage.ID, "" +
"function dumpStack() { return new Error().stack; }\n" +
"function throwError() { throw new Error(); }",
"common.js").buildLiteral());
Value result;
result = context.eval(Source.newBuilder(JavaScriptLanguage.ID, "dumpStack(); //# sourceURL=internal:testsource.js", "test1.js").buildLiteral());
assertTrue(result.isString());
assertFalse(result.asString(), result.asString().contains("testsource.js"));
assertFalse(result.asString(), result.asString().contains("test1.js"));
assertTrue(result.asString(), result.asString().contains("common.js"));
result = context.eval(Source.newBuilder(JavaScriptLanguage.ID, "eval('dumpStack(); //# sourceURL=internal:evalsource.js');", "test2.js").buildLiteral());
assertTrue(result.isString());
assertFalse(result.asString(), result.asString().contains("evalsource.js"));
assertTrue(result.asString(), result.asString().contains("test2.js"));
assertTrue(result.asString(), result.asString().contains("common.js"));
try {
context.eval(Source.newBuilder(JavaScriptLanguage.ID, "throwError(); //# sourceURL=internal:testsource.js", "test3.js").buildLiteral());
fail();
} catch (PolyglotException e) {
assertTrue(e.isGuestException());
verifyGuestFrames(e, Arrays.asList("common.js"));
}
}
}
private static void verifyGuestFrames(PolyglotException e, List<String> expectedNames) {
List<PolyglotException.StackFrame> stack = new ArrayList<>();
for (StackFrame stackFrame : e.getPolyglotStackTrace()) {
if (stackFrame.isGuestFrame()) {
stack.add(stackFrame);
}
}
assertEquals(stack.toString(), expectedNames.size(), stack.size());
for (int i = 0; i < expectedNames.size(); i++) {
String sourceName = stack.get(i).getSourceLocation().getSource().getName();
assertEquals(sourceName, expectedNames.get(i), sourceName);
}
}
}