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 }