001    package serp.bytecode;
002    
003    import junit.framework.*;
004    import junit.textui.*;
005    
006    /**
007     * Tests the {@link StoreInstruction} type.
008     *
009     * @author Abe White
010     */
011    public class TestStoreInstruction extends TestCase {
012        private Code _code = new Code();
013    
014        public TestStoreInstruction(String test) {
015            super(test);
016        }
017    
018        /**
019         * Test that the instruction intitializes correctly when generated.
020         */
021        public void testInitialize() {
022            assertEquals(Constants.NOP, _code.xstore().getOpcode());
023            assertNull(_code.xstore().getType());
024            assertEquals(Constants.NOP, _code.istore().getOpcode());
025            assertEquals(int.class, _code.istore().getType());
026            assertEquals(Constants.NOP, _code.lstore().getOpcode());
027            assertEquals(long.class, _code.lstore().getType());
028            assertEquals(Constants.NOP, _code.fstore().getOpcode());
029            assertEquals(float.class, _code.fstore().getType());
030            assertEquals(Constants.NOP, _code.dstore().getOpcode());
031            assertEquals(double.class, _code.dstore().getType());
032            assertEquals(Constants.NOP, _code.astore().getOpcode());
033            assertEquals(Object.class, _code.astore().getType());
034        }
035    
036        /**
037         * Test that the instruction returns its type correctly.
038         */
039        public void testGetType() {
040            StoreInstruction ins = _code.xstore();
041            assertNull(ins.getType());
042            assertEquals(-1, ins.getLocal());
043    
044            ins = _code.istore();
045            assertEquals(int.class, ins.getType());
046            assertEquals(int.class, ins.setLocal(1).getType());
047            assertEquals(int.class, ins.setLocal(2).getType());
048            assertEquals(int.class, ins.setLocal(3).getType());
049            assertEquals(int.class, ins.setLocal(100).getType());
050    
051            ins = _code.lstore();
052            assertEquals(long.class, ins.getType());
053            assertEquals(long.class, ins.setLocal(1).getType());
054            assertEquals(long.class, ins.setLocal(2).getType());
055            assertEquals(long.class, ins.setLocal(3).getType());
056            assertEquals(long.class, ins.setLocal(100).getType());
057    
058            ins = _code.fstore();
059            assertEquals(float.class, ins.getType());
060            assertEquals(float.class, ins.setLocal(1).getType());
061            assertEquals(float.class, ins.setLocal(2).getType());
062            assertEquals(float.class, ins.setLocal(3).getType());
063            assertEquals(float.class, ins.setLocal(100).getType());
064    
065            ins = _code.dstore();
066            assertEquals(double.class, ins.getType());
067            assertEquals(double.class, ins.setLocal(1).getType());
068            assertEquals(double.class, ins.setLocal(2).getType());
069            assertEquals(double.class, ins.setLocal(3).getType());
070            assertEquals(double.class, ins.setLocal(100).getType());
071    
072            ins = _code.astore();
073            assertEquals(Object.class, ins.getType());
074            assertEquals(Object.class, ins.setLocal(1).getType());
075            assertEquals(Object.class, ins.setLocal(2).getType());
076            assertEquals(Object.class, ins.setLocal(3).getType());
077            assertEquals(Object.class, ins.setLocal(100).getType());
078        }
079    
080        /**
081         * Test that the opcode is morphed correctly when the type and local
082         * of the instruction are changed.
083         */
084        public void testOpcodeMorph() {
085            StoreInstruction ins = _code.xstore();
086    
087            assertEquals(Constants.NOP, ins.getOpcode());
088            assertEquals(Constants.NOP, ins.setType(int.class).getOpcode());
089            assertEquals(Constants.ISTORE, ins.setLocal(10).getOpcode());
090            assertEquals(Constants.ISTORE, ins.setType(boolean.class).getOpcode());
091            assertEquals(Constants.ISTORE, ins.setType(byte.class).getOpcode());
092            assertEquals(Constants.ISTORE, ins.setType(char.class).getOpcode());
093            assertEquals(Constants.ISTORE, ins.setType(short.class).getOpcode());
094            assertEquals(Constants.ISTORE0, ins.setLocal(0).getOpcode());
095            assertEquals(0, ins.getLocal());
096            assertEquals(Constants.ISTORE1, ins.setLocal(1).getOpcode());
097            assertEquals(1, ins.getLocal());
098            assertEquals(Constants.ISTORE2, ins.setLocal(2).getOpcode());
099            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    }