View Javadoc

1   package serp.bytecode;
2   
3   import junit.framework.*;
4   import junit.textui.*;
5   
6   /**
7    * Tests the {@link StoreInstruction} type.
8    *
9    * @author Abe White
10   */
11  public class TestStoreInstruction extends TestCase {
12      private Code _code = new Code();
13  
14      public TestStoreInstruction(String test) {
15          super(test);
16      }
17  
18      /**
19       * Test that the instruction intitializes correctly when generated.
20       */
21      public void testInitialize() {
22          assertEquals(Constants.NOP, _code.xstore().getOpcode());
23          assertNull(_code.xstore().getType());
24          assertEquals(Constants.NOP, _code.istore().getOpcode());
25          assertEquals(int.class, _code.istore().getType());
26          assertEquals(Constants.NOP, _code.lstore().getOpcode());
27          assertEquals(long.class, _code.lstore().getType());
28          assertEquals(Constants.NOP, _code.fstore().getOpcode());
29          assertEquals(float.class, _code.fstore().getType());
30          assertEquals(Constants.NOP, _code.dstore().getOpcode());
31          assertEquals(double.class, _code.dstore().getType());
32          assertEquals(Constants.NOP, _code.astore().getOpcode());
33          assertEquals(Object.class, _code.astore().getType());
34      }
35  
36      /**
37       * Test that the instruction returns its type correctly.
38       */
39      public void testGetType() {
40          StoreInstruction ins = _code.xstore();
41          assertNull(ins.getType());
42          assertEquals(-1, ins.getLocal());
43  
44          ins = _code.istore();
45          assertEquals(int.class, ins.getType());
46          assertEquals(int.class, ins.setLocal(1).getType());
47          assertEquals(int.class, ins.setLocal(2).getType());
48          assertEquals(int.class, ins.setLocal(3).getType());
49          assertEquals(int.class, ins.setLocal(100).getType());
50  
51          ins = _code.lstore();
52          assertEquals(long.class, ins.getType());
53          assertEquals(long.class, ins.setLocal(1).getType());
54          assertEquals(long.class, ins.setLocal(2).getType());
55          assertEquals(long.class, ins.setLocal(3).getType());
56          assertEquals(long.class, ins.setLocal(100).getType());
57  
58          ins = _code.fstore();
59          assertEquals(float.class, ins.getType());
60          assertEquals(float.class, ins.setLocal(1).getType());
61          assertEquals(float.class, ins.setLocal(2).getType());
62          assertEquals(float.class, ins.setLocal(3).getType());
63          assertEquals(float.class, ins.setLocal(100).getType());
64  
65          ins = _code.dstore();
66          assertEquals(double.class, ins.getType());
67          assertEquals(double.class, ins.setLocal(1).getType());
68          assertEquals(double.class, ins.setLocal(2).getType());
69          assertEquals(double.class, ins.setLocal(3).getType());
70          assertEquals(double.class, ins.setLocal(100).getType());
71  
72          ins = _code.astore();
73          assertEquals(Object.class, ins.getType());
74          assertEquals(Object.class, ins.setLocal(1).getType());
75          assertEquals(Object.class, ins.setLocal(2).getType());
76          assertEquals(Object.class, ins.setLocal(3).getType());
77          assertEquals(Object.class, ins.setLocal(100).getType());
78      }
79  
80      /**
81       * Test that the opcode is morphed correctly when the type and local
82       * of the instruction are changed.
83       */
84      public void testOpcodeMorph() {
85          StoreInstruction ins = _code.xstore();
86  
87          assertEquals(Constants.NOP, ins.getOpcode());
88          assertEquals(Constants.NOP, ins.setType(int.class).getOpcode());
89          assertEquals(Constants.ISTORE, ins.setLocal(10).getOpcode());
90          assertEquals(Constants.ISTORE, ins.setType(boolean.class).getOpcode());
91          assertEquals(Constants.ISTORE, ins.setType(byte.class).getOpcode());
92          assertEquals(Constants.ISTORE, ins.setType(char.class).getOpcode());
93          assertEquals(Constants.ISTORE, ins.setType(short.class).getOpcode());
94          assertEquals(Constants.ISTORE0, ins.setLocal(0).getOpcode());
95          assertEquals(0, ins.getLocal());
96          assertEquals(Constants.ISTORE1, ins.setLocal(1).getOpcode());
97          assertEquals(1, ins.getLocal());
98          assertEquals(Constants.ISTORE2, ins.setLocal(2).getOpcode());
99          assertEquals(2, ins.getLocal());
100         assertEquals(Constants.ISTORE3, ins.setLocal(3).getOpcode());
101         assertEquals(3, ins.getLocal());
102         assertEquals(Constants.ISTORE, ins.setLocal(4).getOpcode());
103         assertEquals(4, ins.getLocal());
104 
105         assertEquals(Constants.LSTORE, ins.setType(long.class).getOpcode());
106         assertEquals(Constants.LSTORE0, ins.setLocal(0).getOpcode());
107         assertEquals(0, ins.getLocal());
108         assertEquals(Constants.LSTORE1, ins.setLocal(1).getOpcode());
109         assertEquals(1, ins.getLocal());
110         assertEquals(Constants.LSTORE2, ins.setLocal(2).getOpcode());
111         assertEquals(2, ins.getLocal());
112         assertEquals(Constants.LSTORE3, ins.setLocal(3).getOpcode());
113         assertEquals(3, ins.getLocal());
114         assertEquals(Constants.LSTORE, ins.setLocal(4).getOpcode());
115         assertEquals(4, ins.getLocal());
116 
117         assertEquals(Constants.FSTORE, ins.setType(float.class).getOpcode());
118         assertEquals(Constants.FSTORE0, ins.setLocal(0).getOpcode());
119         assertEquals(0, ins.getLocal());
120         assertEquals(Constants.FSTORE1, ins.setLocal(1).getOpcode());
121         assertEquals(1, ins.getLocal());
122         assertEquals(Constants.FSTORE2, ins.setLocal(2).getOpcode());
123         assertEquals(2, ins.getLocal());
124         assertEquals(Constants.FSTORE3, ins.setLocal(3).getOpcode());
125         assertEquals(3, ins.getLocal());
126         assertEquals(Constants.FSTORE, ins.setLocal(4).getOpcode());
127         assertEquals(4, ins.getLocal());
128 
129         assertEquals(Constants.DSTORE, ins.setType(double.class).getOpcode());
130         assertEquals(Constants.DSTORE0, ins.setLocal(0).getOpcode());
131         assertEquals(0, ins.getLocal());
132         assertEquals(Constants.DSTORE1, ins.setLocal(1).getOpcode());
133         assertEquals(1, ins.getLocal());
134         assertEquals(Constants.DSTORE2, ins.setLocal(2).getOpcode());
135         assertEquals(2, ins.getLocal());
136         assertEquals(Constants.DSTORE3, ins.setLocal(3).getOpcode());
137         assertEquals(3, ins.getLocal());
138         assertEquals(Constants.DSTORE, ins.setLocal(4).getOpcode());
139         assertEquals(4, ins.getLocal());
140 
141         assertEquals(Constants.ASTORE, ins.setType(Object.class).getOpcode());
142         assertEquals(Constants.ASTORE, ins.setType(String.class).getOpcode());
143         assertEquals(Constants.ASTORE0, ins.setLocal(0).getOpcode());
144         assertEquals(0, ins.getLocal());
145         assertEquals(Constants.ASTORE1, ins.setLocal(1).getOpcode());
146         assertEquals(1, ins.getLocal());
147         assertEquals(Constants.ASTORE2, ins.setLocal(2).getOpcode());
148         assertEquals(2, ins.getLocal());
149         assertEquals(Constants.ASTORE3, ins.setLocal(3).getOpcode());
150         assertEquals(3, ins.getLocal());
151         assertEquals(Constants.ASTORE, ins.setLocal(4).getOpcode());
152         assertEquals(4, ins.getLocal());
153     }
154 
155     public static Test suite() {
156         return new TestSuite(TestStoreInstruction.class);
157     }
158 
159     public static void main(String[] args) {
160         TestRunner.run(suite());
161     }
162 }