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 }