/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
*
*/
package org.mozilla.javascript.tests;
import junit.framework.TestCase;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextAction;
import org.mozilla.javascript.JavaScriptException;
import org.mozilla.javascript.RhinoException;
import org.mozilla.javascript.Scriptable;
/**
* @author Marc Guillemot
*/
public class StackTraceTest extends TestCase {
final static String LS = System.getProperty("line.separator");
/**
* As of CVS head on May, 11. 2009, stacktrace information is lost when a call to some
* native function has been made.
*/
public void testFailureStackTrace() {
RhinoException.useMozillaStackStyle(false);
final String source1 = "function f2() { throw 'hello'; }; f2();";
final String source2 = "function f2() { 'H'.toLowerCase(); throw 'hello'; }; f2();";
final String source3 = "function f2() { new java.lang.String('H').toLowerCase(); throw 'hello'; }; f2();";
final String result = "\tat test.js (f2)" + LS + "\tat test.js" + LS;
runWithExpectedStackTrace(source1, result);
runWithExpectedStackTrace(source2, result);
runWithExpectedStackTrace(source3, result);
}
private void runWithExpectedStackTrace(final String _source, final String _expectedStackTrace)
{
final ContextAction action = new ContextAction() {
public Object run(Context cx) {
final Scriptable scope = cx.initStandardObjects();
try {
cx.evaluateString(scope, _source, "test.js", 0, null);
}
catch (final JavaScriptException e)
{
assertEquals(_expectedStackTrace, e.getScriptStackTrace());
return null;
}
throw new RuntimeException("Exception expected!");
}
};
Utils.runWithOptimizationLevel(action, -1);
}
}