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    }