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    }