001    package serp.bytecode;
002    
003    import junit.framework.*;
004    import junit.textui.*;
005    
006    /**
007     * Tests the {@link LoadInstruction} type.
008     *
009     * @author Abe White
010     */
011    public class TestLoadInstruction extends TestCase {
012        private Code _code = new Code();
013    
014        public TestLoadInstruction(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.xload().getOpcode());
023            assertNull(_code.xload().getType());
024            assertEquals(Constants.NOP, _code.iload().getOpcode());
025            assertEquals(int.class, _code.iload().getType());
026            assertEquals(Constants.NOP, _code.lload().getOpcode());
027            assertEquals(long.class, _code.lload().getType());
028            assertEquals(Constants.NOP, _code.fload().getOpcode());
029            assertEquals(float.class, _code.fload().getType());
030            assertEquals(Constants.NOP, _code.dload().getOpcode());
031            assertEquals(double.class, _code.dload().getType());
032            assertEquals(Constants.NOP, _code.aload().getOpcode());
033            assertEquals(Object.class, _code.aload().getType());
034        }
035    
036        /**
037         * Test that the instruction returns its type correctly.
038         */
039        public void testGetType() {
040            LoadInstruction ins = _code.xload();
041            assertNull(ins.getType());
042            assertEquals(-1, ins.getLocal());
043    
044            ins = _code.iload();
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.lload();
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.fload();
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.dload();
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.aload();
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            LoadInstruction ins = _code.xload();
086    
087            assertEquals(Constants.NOP, ins.getOpcode());
088            assertEquals(Constants.NOP, ins.setType(int.class).getOpcode());
089            assertEquals(Constants.ILOAD, ins.setLocal(10).getOpcode());
090            assertEquals(Constants.ILOAD, ins.setType(boolean.class).getOpcode());
091            assertEquals(Constants.ILOAD, ins.setType(byte.class).getOpcode());
092            assertEquals(Constants.ILOAD, ins.setType(char.class).getOpcode());
093            assertEquals(Constants.ILOAD, ins.setType(short.class).getOpcode());
094            assertEquals(Constants.ILOAD0, ins.setLocal(0).getOpcode());
095            assertEquals(0, ins.getLocal());
096            assertEquals(Constants.ILOAD1, ins.setLocal(1).getOpcode());
097            assertEquals(1, ins.getLocal());
098            assertEquals(Constants.ILOAD2, ins.setLocal(2).getOpcode());
099            assertEquals(2, ins.getLocal());
100            assertEquals(Constants.ILOAD3, ins.setLocal(3).getOpcode());
101            assertEquals(3, ins.getLocal());
102            assertEquals(Constants.ILOAD, ins.setLocal(4).getOpcode());
103            assertEquals(4, ins.getLocal());
104    
105            assertEquals(Constants.LLOAD, ins.setType(long.class).getOpcode());
106            assertEquals(Constants.LLOAD0, ins.setLocal(0).getOpcode());
107            assertEquals(0, ins.getLocal());
108            assertEquals(Constants.LLOAD1, ins.setLocal(1).getOpcode());
109            assertEquals(1, ins.getLocal());
110            assertEquals(Constants.LLOAD2, ins.setLocal(2).getOpcode());
111            assertEquals(2, ins.getLocal());
112            assertEquals(Constants.LLOAD3, ins.setLocal(3).getOpcode());
113            assertEquals(3, ins.getLocal());
114            assertEquals(Constants.LLOAD, ins.setLocal(4).getOpcode());
115            assertEquals(4, ins.getLocal());
116    
117            assertEquals(Constants.FLOAD, ins.setType(float.class).getOpcode());
118            assertEquals(Constants.FLOAD0, ins.setLocal(0).getOpcode());
119            assertEquals(0, ins.getLocal());
120            assertEquals(Constants.FLOAD1, ins.setLocal(1).getOpcode());
121            assertEquals(1, ins.getLocal());
122            assertEquals(Constants.FLOAD2, ins.setLocal(2).getOpcode());
123            assertEquals(2, ins.getLocal());
124            assertEquals(Constants.FLOAD3, ins.setLocal(3).getOpcode());
125            assertEquals(3, ins.getLocal());
126            assertEquals(Constants.FLOAD, ins.setLocal(4).getOpcode());
127            assertEquals(4, ins.getLocal());
128    
129            assertEquals(Constants.DLOAD, ins.setType(double.class).getOpcode());
130            assertEquals(Constants.DLOAD0, ins.setLocal(0).getOpcode());
131            assertEquals(0, ins.getLocal());
132            assertEquals(Constants.DLOAD1, ins.setLocal(1).getOpcode());
133            assertEquals(1, ins.getLocal());
134            assertEquals(Constants.DLOAD2, ins.setLocal(2).getOpcode());
135            assertEquals(2, ins.getLocal());
136            assertEquals(Constants.DLOAD3, ins.setLocal(3).getOpcode());
137            assertEquals(3, ins.getLocal());
138            assertEquals(Constants.DLOAD, ins.setLocal(4).getOpcode());
139            assertEquals(4, ins.getLocal());
140    
141            assertEquals(Constants.ALOAD, ins.setType(Object.class).getOpcode());
142            assertEquals(Constants.ALOAD, ins.setType(String.class).getOpcode());
143            assertEquals(Constants.ALOAD0, ins.setLocal(0).getOpcode());
144            assertEquals(0, ins.getLocal());
145            assertEquals(Constants.ALOAD1, ins.setLocal(1).getOpcode());
146            assertEquals(1, ins.getLocal());
147            assertEquals(Constants.ALOAD2, ins.setLocal(2).getOpcode());
148            assertEquals(2, ins.getLocal());
149            assertEquals(Constants.ALOAD3, ins.setLocal(3).getOpcode());
150            assertEquals(3, ins.getLocal());
151            assertEquals(Constants.ALOAD, ins.setLocal(4).getOpcode());
152            assertEquals(4, ins.getLocal());
153        }
154    
155        public static Test suite() {
156            return new TestSuite(TestLoadInstruction.class);
157        }
158    
159        public static void main(String[] args) {
160            TestRunner.run(suite());
161        }
162    }