001 package sysModel.classFile.code.instructions;
002
003 import sysModel.classFile.code.Opcode;
004 import junit.framework.TestCase;
005
006 import java.util.NoSuchElementException;
007
008 /**
009 * @author Mathias Ricken
010 */
011 public class LineNumberTableTest extends TestCase {
012 protected final byte[] TEST_CODE = new byte[]{
013 Opcode.ALOAD_0, // 0
014 Opcode.IFEQ, 0, 0, // 1
015 Opcode.GOTO, 0, 0, // 4
016 Opcode.GOTO_W, 0, 0, 0, 0, // 7
017 Opcode.ALOAD, 0, // 12
018 Opcode.WIDE, Opcode.ALOAD, 0, 0, // 14
019 Opcode.IINC, 0, 0, // 18
020 Opcode.WIDE, Opcode.IINC, 0, 0, 0, 0, // 21
021 Opcode.TABLESWITCH, /*default*/(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xf1, /*low*/0, 0, 0, 5, /*high*/0, 0, 0, 7,
022 /*5*/(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xf3, /*6*/(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xf7, /*7*/(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xfa, // 27
023 Opcode.LOOKUPSWITCH, /*pad*/ 0, 0, 0, /*default*/(byte)0xff, (byte)0xff, (byte)0xff, (byte)0xe7, /*n*/0, 0, 0, 2, /*key*/0, 0, 0, 0,
024 /*offset*/0, 0, 0, 0, /*key*/ 0, 0, 0, 1, /*offset*/ (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xcc, // 52
025 Opcode.RETURN // 80
026 };
027
028 public void testPCtoLineNo() {
029 LineNumberTable lnt = new LineNumberTable(TEST_CODE);
030
031 assertEquals("Wrong line number", 0, lnt.getLineNumber(0));
032 assertEquals("Wrong line number", 1, lnt.getLineNumber(1));
033 assertEquals("Wrong line number", 2, lnt.getLineNumber(4));
034 assertEquals("Wrong line number", 3, lnt.getLineNumber(7));
035 assertEquals("Wrong line number", 4, lnt.getLineNumber(12));
036 assertEquals("Wrong line number", 5, lnt.getLineNumber(14));
037 assertEquals("Wrong line number", 6, lnt.getLineNumber(18));
038 assertEquals("Wrong line number", 7, lnt.getLineNumber(21));
039 assertEquals("Wrong line number", 8, lnt.getLineNumber(27));
040 assertEquals("Wrong line number", 9, lnt.getLineNumber(52));
041 assertEquals("Wrong line number", 10, lnt.getLineNumber(80));
042 assertEquals("Wrong line number", 11, lnt.getLineNumber(81));
043
044 try {
045 lnt.getLineNumber(82);
046 fail("Should have thrown NoSuchElementException");
047 }
048 catch(NoSuchElementException e) {
049 // pass
050 }
051 catch(Throwable t) {
052 fail("Should have thrown NoSuchElementException");
053 }
054 }
055
056 public void testLineNoToPC() {
057 LineNumberTable lnt = new LineNumberTable(TEST_CODE);
058
059 assertEquals("Wrong line number", 0, lnt.getPC(0));
060 assertEquals("Wrong line number", 1, lnt.getPC(1));
061 assertEquals("Wrong line number", 4, lnt.getPC(2));
062 assertEquals("Wrong line number", 7, lnt.getPC(3));
063 assertEquals("Wrong line number", 12, lnt.getPC(4));
064 assertEquals("Wrong line number", 14, lnt.getPC(5));
065 assertEquals("Wrong line number", 18, lnt.getPC(6));
066 assertEquals("Wrong line number", 21, lnt.getPC(7));
067 assertEquals("Wrong line number", 27, lnt.getPC(8));
068 assertEquals("Wrong line number", 52, lnt.getPC(9));
069 assertEquals("Wrong line number", 80, lnt.getPC(10));
070 assertEquals("Wrong line number", 81, lnt.getPC(11));
071
072 try {
073 lnt.getPC(12);
074 fail("Should have thrown NoSuchElementException");
075 }
076 catch(NoSuchElementException e) {
077 // pass
078 }
079 catch(Throwable t) {
080 fail("Should have thrown NoSuchElementException");
081 }
082 }
083 }