001 package serp.bytecode; 002 003 import junit.framework.*; 004 import junit.textui.*; 005 006 /** 007 * Tests the {@link ConstantInstruction} type. 008 * 009 * @author Abe White 010 */ 011 public class TestConstantInstruction extends TestCase { 012 private ConstantInstruction _const = new Code().constant(); 013 014 public TestConstantInstruction(String test) { 015 super(test); 016 } 017 018 /** 019 * Test that the type instruction returns its type correctly. 020 */ 021 public void testGetType() { 022 assertNull(_const.getType()); 023 assertEquals(int.class, _const.setValue(0).getType()); 024 assertEquals(int.class, _const.setValue(2 << 3).getType()); 025 assertEquals(int.class, _const.setValue(2 << 7).getType()); 026 assertEquals(int.class, _const.setValue(2 << 15).getType()); 027 assertEquals(long.class, _const.setValue(0L).getType()); 028 assertEquals(long.class, _const.setValue(1000L).getType()); 029 assertEquals(float.class, _const.setValue(0F).getType()); 030 assertEquals(float.class, _const.setValue(1000F).getType()); 031 assertEquals(double.class, _const.setValue(0D).getType()); 032 assertEquals(double.class, _const.setValue(1000D).getType()); 033 assertEquals(Object.class, _const.setValue((Object) null).getType()); 034 assertEquals(String.class, _const.setValue("foo").getType()); 035 assertEquals(int.class, _const.setValue(true).getType()); 036 assertEquals(int.class, _const.setValue((short) 0).getType()); 037 assertEquals(int.class, _const.setValue('a').getType()); 038 assertEquals(Class.class, _const.setValue(String.class).getType()); 039 } 040 041 /** 042 * Test that the value is stored correctly. 043 */ 044 public void testGetValue() { 045 assertNull(_const.getValue()); 046 assertEquals(0, _const.setValue(0).getIntValue()); 047 assertEquals(-1, _const.setValue(-1).getIntValue()); 048 assertEquals(2 << 3, _const.setValue(2 << 3).getIntValue()); 049 assertEquals(2 << 7, _const.setValue(2 << 7).getIntValue()); 050 assertEquals(2 << 15, _const.setValue(2 << 15).getIntValue()); 051 assertEquals(0L, _const.setValue(0L).getLongValue()); 052 assertEquals(1000L, _const.setValue(1000L).getLongValue()); 053 assertEquals(0F, _const.setValue(0F).getFloatValue(), .001); 054 assertEquals(1000F, _const.setValue(1000F).getFloatValue(), .001); 055 assertEquals(0D, _const.setValue(0D).getDoubleValue(), .001); 056 assertEquals(1000D, _const.setValue(1000D).getDoubleValue(), .001); 057 assertNull(_const.setValue((Object) null).getValue()); 058 assertEquals("foo", _const.setValue("foo").getStringValue()); 059 assertEquals(1, _const.setValue(true).getIntValue()); 060 assertEquals(0, _const.setValue((short) 0).getIntValue()); 061 assertEquals((int) 'a', _const.setValue('a').getIntValue()); 062 assertEquals(String.class.getName(), 063 _const.setValue(String.class).getClassNameValue()); 064 } 065 066 /** 067 * Test the the opcode is morphed correctly when the value is set. 068 */ 069 public void testOpcodeMorph() { 070 assertEquals(Constants.NOP, _const.getOpcode()); 071 assertEquals(Constants.ICONSTM1, _const.setValue(-1).getOpcode()); 072 assertEquals(Constants.ICONST0, _const.setValue(0).getOpcode()); 073 assertEquals(Constants.ICONST1, _const.setValue(1).getOpcode()); 074 assertEquals(Constants.ICONST2, _const.setValue(2).getOpcode()); 075 assertEquals(Constants.ICONST3, _const.setValue(3).getOpcode()); 076 assertEquals(Constants.ICONST4, _const.setValue(4).getOpcode()); 077 assertEquals(Constants.ICONST5, _const.setValue(5).getOpcode()); 078 assertEquals(Constants.BIPUSH, _const.setValue(2 << 3).getOpcode()); 079 assertEquals(Constants.SIPUSH, _const.setValue(2 << 7).getOpcode()); 080 assertEquals(Constants.LDC, _const.setValue(2 << 15).getOpcode()); 081 assertEquals(Constants.LCONST0, _const.setValue(0L).getOpcode()); 082 assertEquals(Constants.LCONST1, _const.setValue(1L).getOpcode()); 083 assertEquals(Constants.LDC2W, _const.setValue(1000L).getOpcode()); 084 assertEquals(Constants.FCONST2, _const.setValue(2F).getOpcode()); 085 assertEquals(Constants.FCONST1, _const.setValue(1F).getOpcode()); 086 assertEquals(Constants.FCONST0, _const.setValue(0F).getOpcode()); 087 assertEquals(Constants.LDC, _const.setValue(1000F).getOpcode()); 088 assertEquals(Constants.DCONST0, _const.setValue(0D).getOpcode()); 089 assertEquals(Constants.DCONST1, _const.setValue(1D).getOpcode()); 090 assertEquals(Constants.LDC2W, _const.setValue(2D).getOpcode()); 091 assertEquals(Constants.LDC2W, _const.setValue(1000D).getOpcode()); 092 assertEquals(Constants.LDC, _const.setValue("foo").getOpcode()); 093 assertEquals(Constants.ICONST1, _const.setValue(true).getOpcode()); 094 assertEquals(Constants.BIPUSH, _const.setValue('a').getOpcode()); 095 assertEquals(Constants.ICONST0, _const.setValue((short) 0).getOpcode()); 096 assertEquals(Constants.ACONSTNULL, 097 _const.setValue((Object) null).getOpcode()); 098 assertEquals(Constants.LDCW, _const.setValue(String.class).getOpcode()); 099 } 100 101 public static Test suite() { 102 return new TestSuite(TestConstantInstruction.class); 103 } 104 105 public static void main(String[] args) { 106 TestRunner.run(suite()); 107 } 108 }