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 }