blob: 2da5e658abfabb062d2af42003240c0689b7c6c8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.bcel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import org.apache.bcel.generic.ClassElementValueGen;
import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.ElementValueGen;
import org.apache.bcel.generic.EnumElementValueGen;
import org.apache.bcel.generic.ObjectType;
import org.apache.bcel.generic.SimpleElementValueGen;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ElementValueGenTestCase extends AbstractTestCase
{
private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) throws IOException {
final String beforeValue = evgBefore.stringifyValue();
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (DataOutputStream dos = new DataOutputStream(baos)) {
evgBefore.dump(dos);
dos.flush();
}
ElementValueGen evgAfter;
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
evgAfter = ElementValueGen.readElementValue(dis, cpg);
}
final String afterValue = evgAfter.stringifyValue();
assertEquals(beforeValue, afterValue, "Deserialization failed");
}
private ClassGen createClassGen(final String classname)
{
return new ClassGen(classname, "java.lang.Object", "<generated>",
Const.ACC_PUBLIC | Const.ACC_SUPER, null);
}
@Test
public void testCreateBooleanElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_BOOLEAN, cp, true);
// Creation of an element like that should leave a new entry in the
// cpool
final int idx = cp.lookupInteger(1); // 1 == true
assertEquals(idx, evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
@Test
public void testCreateByteElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_CHAR, cp, (byte) 'z');
// Creation of an element like that should leave a new entry in the
// cpool
final int idx = cp.lookupInteger((byte) 'z');
assertEquals(idx, evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
@Test
public void testCreateCharElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_CHAR, cp, 't');
// Creation of an element like that should leave a new entry in the
// cpool
final int idx = cp.lookupInteger('t');
assertEquals(idx, evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
// //
// Create class element value
@Test
public void testCreateClassElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final ObjectType classType = new ObjectType("java.lang.Integer");
final ClassElementValueGen evg = new ClassElementValueGen(classType, cp);
assertTrue(evg.getClassString().contains("Integer"),
"Unexpected value for contained class: '" + evg.getClassString() + "'");
checkSerialize(evg, cp);
}
@Test
public void testCreateDoubleElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_DOUBLE, cp, 333.44);
// Creation of an element like that should leave a new entry in the
// cpool
final int idx = cp.lookupDouble(333.44);
assertEquals(idx, evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
// //
// Create enum element value
@Test
public void testCreateEnumElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final ObjectType enumType = new ObjectType("SimpleEnum"); // Supports rainbow
// :)
final EnumElementValueGen evg = new EnumElementValueGen(enumType, "Red", cp);
// Creation of an element like that should leave a new entry in the
// cpool
assertEquals(cp.lookupUtf8("Red"), evg.getValueIndex(),
"The new ElementValue value index should match the contents of the constantpool");
// BCELBUG: Should the class signature or class name be in the constant
// pool? (see note in ConstantPool)
// assertTrue("The new ElementValue type index should match the contents
// of the constantpool but "+
// evg.getTypeIndex()+"!="+cp.lookupClass(enumType.getSignature()),
// evg.getTypeIndex()==cp.lookupClass(enumType.getSignature()));
checkSerialize(evg, cp);
}
@Test
public void testCreateFloatElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_FLOAT, cp, 111.222f);
// Creation of an element like that should leave a new entry in the
// cpool
assertEquals(cp.lookupFloat(111.222f), evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
/**
* Create primitive element values
*/
@Test
public void testCreateIntegerElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_INT, cp, 555);
// Creation of an element like that should leave a new entry in the
// cpool
assertEquals(cp.lookupInteger(555), evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
@Test
public void testCreateLongElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_LONG, cp, 3334455L);
// Creation of an element like that should leave a new entry in the
// cpool
final int idx = cp.lookupLong(3334455L);
assertEquals(idx, evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
@Test
public void testCreateShortElementValue() throws Exception
{
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.PRIMITIVE_SHORT, cp, (short) 42);
// Creation of an element like that should leave a new entry in the
// cpool
final int idx = cp.lookupInteger(42);
assertEquals(idx, evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
// //
// Create string element values
@Test
public void testCreateStringElementValue() throws Exception
{
// Create HelloWorld
final ClassGen cg = createClassGen("HelloWorld");
final ConstantPoolGen cp = cg.getConstantPool();
final SimpleElementValueGen evg = new SimpleElementValueGen(
ElementValueGen.STRING, cp, "hello");
// Creation of an element like that should leave a new entry in the
// cpool
assertEquals(cp.lookupUtf8("hello"), evg.getIndex(), "Should have the same index in the constantpool");
checkSerialize(evg, cp);
}
}