package org.gridkit.jvmtool.stacktrace;
import java.lang.reflect.Field;
import org.junit.Assert;
import org.junit.Test;
public class StackFrameTest {
@Test
public void test_normal_frame_at_1() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 1);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_normal_frame_at_5() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 5);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_normal_frame_at_10() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 10);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_normal_frame_at_15() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 15);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_normal_frame_at_100() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "MyClass.java", 100);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_normal_frame_at_500() {
StackTraceElement ste = new StackTraceElement("mypackage.MyClass", "myMethod", "MyClass.java", 500);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_no_line_frame() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "MyClass.java", -1);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_no_source_frame() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", null, -1);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_native_frame() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", null, -2);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_native_frame2() {
StackTraceElement ste = new StackTraceElement("MyClass", "myMethod", "myclass.cpp", -2);
StackFrame frame = new StackFrame(ste);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_class_prefix() {
StackTraceElement ste = new StackTraceElement("mypackage.MyClass", "myMethod", "MyClass.java", 15);
StackFrame frame = new StackFrame("mypackage", "MyClass", "myMethod", "MyClass.java", 15);
Assert.assertEquals(ste.toString(), frame.toString());
}
@Test
public void test_simple_equality() {
StackFrame frame1 = new StackFrame("mypackage", "MyClass", "myMethod", "MyClass.java", 15);
StackFrame frame2 = new StackFrame("mypackage", "MyClass", "myMethod", "MyClass.java", 15);
Assert.assertEquals(frame1, frame2);
Assert.assertEquals(frame2, frame1);
Assert.assertEquals(frame1.hashCode(), frame2.hashCode());
}
@Test
public void test_equality_with_prefix_mismatch() {
StackFrame frame1 = new StackFrame(null, "mypackage.MyClass", "myMethod", "MyClass.java", 15);
StackFrame frame2 = new StackFrame("mypackage", "MyClass", "myMethod", "MyClass.java", 15);
Assert.assertEquals(frame1, frame2);
Assert.assertEquals(frame2, frame1);
Assert.assertEquals(frame1.hashCode(), frame2.hashCode());
}
@Test
public void test_non_equality_with_prefix_mismatch() {
StackFrame frame1 = new StackFrame(null, "mypackage$MyClass", "myMethod", "MyClass.java", 15);
StackFrame frame2 = new StackFrame("mypackage", "MyClass", "myMethod", "MyClass.java", 15);
Assert.assertNotEquals(frame1.hashCode(), frame2.hashCode());
zeroHash(frame1);
zeroHash(frame2);
Assert.assertFalse(frame1.equals(frame2));
Assert.assertFalse(frame2.equals(frame1));
}
private static void zeroHash(StackFrame frame) {
try {
Field f = StackFrame.class.getDeclaredField("hash");
f.setAccessible(true);
f.set(frame, 0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}