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 }