/*
* Copyright 2011 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.j2objc;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import junit.framework.TestCase;
/**
* Command-line tests for java.lang.Throwable support
*
* @author Keith Stanger
*/
public class ThrowableTest extends TestCase {
static final String NSEXCEPTION_MESSAGE = "native exception";
public void testGetMessage() throws Exception {
Throwable t = new Throwable("themessage");
assertEquals("themessage", t.getMessage());
}
public void testGetStackTrace() throws Exception {
Throwable t = new Throwable();
StackTraceElement[] stackTrace = t.getStackTrace();
boolean foundSelf = false;
for (StackTraceElement element : stackTrace) {
if (element.getMethodName().contains("testGetStackTrace")) {
foundSelf = true;
}
}
assertTrue("Did not find this method in the stack trace.", foundSelf);
}
public void testSetStackTrace() throws Exception {
StackTraceElement[] stackTraceIn = new StackTraceElement[1];
stackTraceIn[0] = new StackTraceElement("class", "method", "file", 42);
Throwable t = new Throwable();
t.setStackTrace(stackTraceIn);
StackTraceElement[] stackTraceOut = t.getStackTrace();
assertEquals(1, stackTraceOut.length);
assertEquals("class", stackTraceOut[0].getClassName());
assertEquals("method", stackTraceOut[0].getMethodName());
assertEquals("file", stackTraceOut[0].getFileName());
assertEquals(42, stackTraceOut[0].getLineNumber());
}
public void testStackTraceWithPrintStream() throws Exception {
Exception testException = new Exception("test exception");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = new PrintStream(baos);
testException.printStackTrace(out);
out.flush();
String trace = baos.toString("UTF-8");
assertTrue(trace.contains("com.google.j2objc.ThrowableTest.testStackTraceWithPrintStream("));
}
public void testStackTraceWithPrintWriter() throws Exception {
Exception testException = new Exception("test exception");
StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
testException.printStackTrace(out);
out.flush();
String trace = sw.toString();
assertTrue(trace.contains("com.google.j2objc.ThrowableTest.testStackTraceWithPrintWriter("));
}
public void testEquals() {
Throwable t1 = new Throwable();
Throwable t2 = new Throwable();
assertFalse(t1.equals(t2));
}
public void testHashCode() {
Throwable t1 = new Throwable();
Throwable t2 = new Throwable();
assertFalse(t1.hashCode() == t2.hashCode());
}
public void testNotWritableStackTrace() throws Exception {
Throwable t = new Throwable("test", null, true, false) {};
StackTraceElement[] stackTrace = t.getStackTrace();
assertNotNull(stackTrace);
assertEquals(0, stackTrace.length);
// Should be a no-op.
t.fillInStackTrace();
stackTrace = t.getStackTrace();
assertNotNull(stackTrace);
assertEquals(0, stackTrace.length);
// Also should be a no-op.
StackTraceElement[] newTrace = new Throwable().getStackTrace();
assertTrue(newTrace.length > 0);
t.setStackTrace(newTrace);
stackTrace = t.getStackTrace();
assertNotNull(stackTrace);
assertEquals(0, stackTrace.length);
}
public void testThrowableToStringFormat() {
assertEquals("java.lang.Throwable", new Throwable().toString());
assertEquals("java.lang.Throwable: oops", new Throwable("oops").toString());
}
public void testNSExceptionDescriptionUnchanged() {
assertEquals(NSEXCEPTION_MESSAGE, getNSExceptionDescription());
}
// Verify [NSException description] only returns the exception's reason, not
// with the class name like java.lang.Throwable.toString() does.
static native String getNSExceptionDescription() /*-[
NSException *e = AUTORELEASE(
[[NSException alloc] initWithName:@"MyException"
reason:ComGoogleJ2objcThrowableTest_NSEXCEPTION_MESSAGE
userInfo:nil]);
return [e description];
]-*/;
/* TODO(kstanger): Make this test pass.
public void testOverwriteNullCause() throws Exception {
Throwable t = new Throwable((Throwable) null);
try {
t.initCause(new Throwable());
fail("Expected IllegalStateException");
} catch (IllegalStateException e) {
// Expected.
}
}*/
}