001    package serp.bytecode;
002    
003    import junit.framework.*;
004    import junit.textui.*;
005    
006    /**
007     * Tests the {@link Code} class.
008     *
009     * @author Eric Lindauer
010     */
011    public class TestCode extends TestCase {
012        public TestCode(String test) {
013            super(test);
014        }
015    
016        /**
017         * Test that removing Instructions from a Code block
018         * removes the correct Instructions.
019         */
020        public void testRemove() {
021            Code code = new Code();
022            JumpInstruction go2 = code.go2();
023            Instruction first = code.nop();
024            Instruction second = code.nop();
025            Instruction third = code.nop();
026            Instruction fourth = code.nop();
027            go2.setTarget(second);
028    
029            // remove 'second' after a next() call
030            code.beforeFirst();
031            code.next();
032            code.next();
033            code.next();
034            code.remove();
035            assertEquals(third, code.next());
036            assertEquals(third, go2.getTarget());
037            code.beforeFirst();
038            assertEquals(go2, code.next());
039            assertEquals(first, code.next());
040            assertEquals(third, code.next());
041            assertEquals(fourth, code.next());
042    
043            // remove 'third' after a previous() call
044            code.beforeFirst();
045            code.next();
046            code.next();
047            code.next();
048            code.next();
049            code.previous();
050            code.previous();
051            code.remove();
052            assertEquals(fourth, go2.getTarget());
053            assertEquals(fourth, code.next());
054    
055            assertTrue(!code.hasNext());
056            assertEquals(fourth, code.previous());
057            code.remove();
058            code.afterLast();
059            assertEquals(code.previous(), go2.getTarget());
060            assertEquals(first, code.previous());
061        }
062    
063        /**
064         * Test that instruction indexes work correctly.
065         */
066        public void testIndexes() {
067            Code code = new Code();
068            assertEquals(0, code.nextIndex());
069            assertEquals(-1, code.previousIndex());
070    
071            Instruction first = code.nop();
072            assertEquals(1, code.nextIndex());
073            assertEquals(0, code.previousIndex());
074    
075            Instruction second = code.nop();
076            assertEquals(2, code.nextIndex());
077            assertEquals(1, code.previousIndex());
078            code.previous();
079            assertEquals(1, code.nextIndex());
080            assertEquals(0, code.previousIndex());
081            code.next();
082            assertEquals(2, code.nextIndex());
083            assertEquals(1, code.previousIndex());
084    
085            Instruction third = code.nop();
086            assertEquals(3, code.nextIndex());
087            assertEquals(2, code.previousIndex());
088    
089            code.afterLast();
090            assertEquals(3, code.nextIndex());
091            assertEquals(2, code.previousIndex());
092    
093            code.beforeFirst();
094            assertEquals(0, code.nextIndex());
095            assertEquals(-1, code.previousIndex());
096    
097            code.before(first);
098            assertEquals(0, code.nextIndex());
099            assertEquals(-1, code.previousIndex());
100            code.before(second);
101            assertEquals(1, code.nextIndex());
102            assertEquals(0, code.previousIndex());
103            code.before(third);
104            assertEquals(2, code.nextIndex());
105            assertEquals(1, code.previousIndex());
106    
107            code.after(first);
108            assertEquals(1, code.nextIndex());
109            assertEquals(0, code.previousIndex());
110            code.after(second);
111            assertEquals(2, code.nextIndex());
112            assertEquals(1, code.previousIndex());
113            code.after(third);
114            assertEquals(3, code.nextIndex());
115            assertEquals(2, code.previousIndex());
116        }
117    
118        public static Test suite() {
119            return new TestSuite(TestCode.class);
120        }
121    
122        public static void main(String[] args) {
123            TestRunner.run(suite());
124        }
125    }