/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.util;
import java.util.Arrays;
import com.github.anba.es6draft.parser.ParserException;
import com.github.anba.es6draft.runtime.ExecutionContext;
import com.github.anba.es6draft.runtime.internal.ScriptException;
import com.github.anba.es6draft.runtime.internal.StackTraces;
/**
*
*/
public final class TestAssertions {
private static final boolean FILTER_STACK_TRACE = true;
private static final String BASE = "com.github.anba.es6draft";
private static final String[] ALLOWED_PACKAGES = { BASE + ".interpreter", BASE + ".parser", BASE + ".regexp",
BASE + ".runtime", BASE + ".scripting" };
private static final String[] HIDDEN_CLASSES = { BASE + ".runtime.internal.RuntimeInfo" };
private static final String[] HIDDEN_METHODS = { "newInstance" };
private TestAssertions() {
}
/**
* Creates a new {@link AssertionError} using the given message string.
*
* @param message
* the error message
* @return a new assertion error
*/
public static AssertionError newAssertionError(String message) {
AssertionError error = new AssertionError(message);
error.setStackTrace(StackTraces.scriptStackTrace(error));
return error;
}
/**
* Creates a new {@link AssertionError} for the parser exception.
*
* @param e
* the script exception
* @return a new assertion error
*/
public static AssertionError toAssertionError(ParserException e) {
ParserException exception = withFilteredStackTrace(e);
AssertionError error = new AssertionError(exception.getMessage(), exception);
error.setStackTrace(StackTraces.scriptStackTrace(exception));
return error;
}
/**
* Creates a new {@link AssertionError} for the script exception.
*
* @param cx
* the execution context
* @param e
* the script exception
* @return a new assertion error
*/
public static AssertionError toAssertionError(ExecutionContext cx, ScriptException e) {
ScriptException exception = withFilteredStackTrace(e);
AssertionError error = new AssertionError(exception.getMessage(cx), exception);
error.setStackTrace(exception.getScriptStackTrace());
return error;
}
private static ParserException withFilteredStackTrace(ParserException e) {
if (!FILTER_STACK_TRACE) {
return e;
}
ParserException exception = new ParserException(e.getType(), e.getFile(), e.getLine(), e.getColumn(),
e.getMessageKey(), e.getMessageArguments());
exception.setStackTrace(filterStackTrace(e));
return exception;
}
private static ScriptException withFilteredStackTrace(ScriptException e) {
if (!FILTER_STACK_TRACE) {
return e;
}
ScriptException exception = new ScriptException(e.getValue(), e.getCause());
exception.setStackTrace(filterStackTrace(e));
return exception;
}
private static StackTraceElement[] filterStackTrace(Throwable e) {
StackTraceElement[] stackTrace = e.getStackTrace();
StackTraceElement[] filtered = new StackTraceElement[stackTrace.length];
int top = 0;
for (int i = 0; i < stackTrace.length; ++i) {
StackTraceElement frame = stackTrace[i];
if (isVisibleFrame(frame)) {
filtered[top++] = frame;
}
}
return Arrays.copyOf(filtered, top);
}
private static boolean isVisibleFrame(StackTraceElement frame) {
String className = frame.getClassName();
if (className.startsWith("#")) {
// Always display script frames.
return true;
}
PACKAGE: {
for (String packageName : ALLOWED_PACKAGES) {
if (className.startsWith(packageName)) {
break PACKAGE;
}
}
return false;
}
for (String hiddenClass : HIDDEN_CLASSES) {
if (className.startsWith(hiddenClass)) {
return false;
}
}
String methodName = frame.getMethodName();
for (String hiddenMethod : HIDDEN_METHODS) {
if (hiddenMethod.equals(methodName)) {
return false;
}
}
return true;
}
}