1   package serp.bytecode;
2   
3   import junit.framework.*;
4   import junit.textui.*;
5   
6   /**
7    * Tests the {@link Code} class.
8    *
9    * @author Eric Lindauer
10   */
11  public class TestCode extends TestCase {
12      public TestCode(String test) {
13          super(test);
14      }
15  
16      /**
17       * Test that removing Instructions from a Code block
18       * removes the correct Instructions.
19       */
20      public void testRemove() {
21          Code code = new Code();
22          JumpInstruction go2 = code.go2();
23          Instruction first = code.nop();
24          Instruction second = code.nop();
25          Instruction third = code.nop();
26          Instruction fourth = code.nop();
27          go2.setTarget(second);
28  
29          // remove 'second' after a next() call
30          code.beforeFirst();
31          code.next();
32          code.next();
33          code.next();
34          code.remove();
35          assertEquals(third, code.next());
36          assertEquals(third, go2.getTarget());
37          code.beforeFirst();
38          assertEquals(go2, code.next());
39          assertEquals(first, code.next());
40          assertEquals(third, code.next());
41          assertEquals(fourth, code.next());
42  
43          // remove 'third' after a previous() call
44          code.beforeFirst();
45          code.next();
46          code.next();
47          code.next();
48          code.next();
49          code.previous();
50          code.previous();
51          code.remove();
52          assertEquals(fourth, go2.getTarget());
53          assertEquals(fourth, code.next());
54  
55          assertTrue(!code.hasNext());
56          assertEquals(fourth, code.previous());
57          code.remove();
58          code.afterLast();
59          assertEquals(code.previous(), go2.getTarget());
60          assertEquals(first, code.previous());
61      }
62  
63      /**
64       * Test that instruction indexes work correctly.
65       */
66      public void testIndexes() {
67          Code code = new Code();
68          assertEquals(0, code.nextIndex());
69          assertEquals(-1, code.previousIndex());
70  
71          Instruction first = code.nop();
72          assertEquals(1, code.nextIndex());
73          assertEquals(0, code.previousIndex());
74  
75          Instruction second = code.nop();
76          assertEquals(2, code.nextIndex());
77          assertEquals(1, code.previousIndex());
78          code.previous();
79          assertEquals(1, code.nextIndex());
80          assertEquals(0, code.previousIndex());
81          code.next();
82          assertEquals(2, code.nextIndex());
83          assertEquals(1, code.previousIndex());
84  
85          Instruction third = code.nop();
86          assertEquals(3, code.nextIndex());
87          assertEquals(2, code.previousIndex());
88  
89          code.afterLast();
90          assertEquals(3, code.nextIndex());
91          assertEquals(2, code.previousIndex());
92  
93          code.beforeFirst();
94          assertEquals(0, code.nextIndex());
95          assertEquals(-1, code.previousIndex());
96  
97          code.before(first);
98          assertEquals(0, code.nextIndex());
99          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 }