mirror of
https://github.com/eclipse-aspectj/aspectj.git
synced 2024-08-12 14:10:43 +02:00
144 lines
5.3 KiB
Java
144 lines
5.3 KiB
Java
/* *******************************************************************
|
|
* Copyright (c) 2004 IBM
|
|
* All rights reserved.
|
|
* This program and the accompanying materials are made available
|
|
* under the terms of the Eclipse Public License v1.0
|
|
* which accompanies this distribution and is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html
|
|
*
|
|
* Contributors:
|
|
* Andy Clement - initial implementation
|
|
* ******************************************************************/
|
|
|
|
package org.aspectj.apache.bcel.classfile.tests;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.util.Iterator;
|
|
|
|
import org.aspectj.apache.bcel.classfile.Attribute;
|
|
import org.aspectj.apache.bcel.classfile.JavaClass;
|
|
import org.aspectj.apache.bcel.classfile.Method;
|
|
import org.aspectj.apache.bcel.classfile.annotation.AnnotationGen;
|
|
import org.aspectj.apache.bcel.classfile.annotation.NameValuePair;
|
|
import org.aspectj.apache.bcel.classfile.annotation.RuntimeVisParamAnnos;
|
|
import org.aspectj.apache.bcel.util.SyntheticRepository;
|
|
|
|
|
|
public class RuntimeVisibleParameterAnnotationAttributeTest extends BcelTestCase {
|
|
|
|
|
|
protected void setUp() throws Exception {
|
|
super.setUp();
|
|
}
|
|
|
|
|
|
public void testAccessingRuntimeVisibleParameterAnnotations() throws ClassNotFoundException {
|
|
JavaClass clazz = getClassFromJar("AnnotatedParameters");
|
|
Attribute[] rvaAttr = findAttribute("RuntimeVisibleParameterAnnotations",clazz);
|
|
Method[] methods = clazz.getMethods();
|
|
|
|
for (int i = 0; i < methods.length; i++) {
|
|
Method m = methods[i];
|
|
if (m.getName().equals("foo")) {
|
|
RuntimeVisParamAnnos paramAnns =
|
|
(RuntimeVisParamAnnos) findAttribute("RuntimeVisibleParameterAnnotations",m.getAttributes());
|
|
assertTrue("foo takes two parameters, not "+paramAnns.getParameterAnnotations().size(),
|
|
paramAnns.getParameterAnnotations().size()==2);
|
|
|
|
AnnotationGen[] firstParamAnnotations = paramAnns.getAnnotationsOnParameter(0);
|
|
checkAnnotation(firstParamAnnotations[0],"SimpleAnnotation","id","2");
|
|
|
|
AnnotationGen[] secondParamAnnotations = paramAnns.getAnnotationsOnParameter(1);
|
|
checkAnnotation(secondParamAnnotations[0],"SimpleAnnotation","id","3");
|
|
checkAnnotation(secondParamAnnotations[1],"AnnotationEnumElement","enumval","LSimpleEnum;Red");
|
|
|
|
}
|
|
if (m.getName().equals("main")) {
|
|
RuntimeVisParamAnnos paramAnns =
|
|
(RuntimeVisParamAnnos) findAttribute("RuntimeVisibleParameterAnnotations",m.getAttributes());
|
|
assertTrue("main takes one parameter, not "+paramAnns.getParameterAnnotations().size(),
|
|
paramAnns.getParameterAnnotations().size()==1);
|
|
|
|
AnnotationGen[] firstParamAnnotations = paramAnns.getAnnotationsOnParameter(0);
|
|
checkAnnotation(firstParamAnnotations[0],"SimpleAnnotation","id","1");
|
|
}
|
|
}
|
|
}
|
|
|
|
public void testAccessingParameterAnnotationsThroughGetAnnotations() throws ClassNotFoundException {
|
|
JavaClass clazz = getClassFromJar("AnnotatedParameters");
|
|
Attribute[] rvaAttr = findAttribute("RuntimeVisibleParameterAnnotations",clazz);
|
|
|
|
checkFooMethod(clazz);
|
|
}
|
|
|
|
public void testParameterAnnotationsReadWrite() throws ClassNotFoundException,IOException {
|
|
JavaClass clazz = getClassFromJar("AnnotatedParameters");
|
|
|
|
checkFooMethod(clazz);
|
|
|
|
// Write it out
|
|
File tfile = createTestdataFile("AnnotatedParameters.class");
|
|
clazz.dump(tfile);
|
|
|
|
SyntheticRepository repos2 = createRepos(".");
|
|
JavaClass clazz2 = repos2.loadClass("AnnotatedParameters");
|
|
|
|
checkFooMethod(clazz);
|
|
|
|
assertTrue(tfile.delete());
|
|
}
|
|
|
|
|
|
public void checkFooMethod(JavaClass clazz) {
|
|
Method[] methods = clazz.getMethods();
|
|
|
|
for (int i = 0; i < methods.length; i++) {
|
|
Method m = methods[i];
|
|
if (m.getName().equals("foo")) {
|
|
|
|
AnnotationGen[] firstParamAnnotations = m.getAnnotationsOnParameter(0);
|
|
checkAnnotation(firstParamAnnotations[0],"SimpleAnnotation","id","2");
|
|
|
|
AnnotationGen[] secondParamAnnotations = m.getAnnotationsOnParameter(1);
|
|
checkAnnotation(secondParamAnnotations[0],"SimpleAnnotation","id","3");
|
|
checkAnnotation(secondParamAnnotations[1],"AnnotationEnumElement","enumval","LSimpleEnum;Red");
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private void checkAnnotation(AnnotationGen a,String name,String elementname,String elementvalue) {
|
|
assertTrue("Expected annotation to have name "+name+" but it had name "+a.getTypeName(),
|
|
a.getTypeName().equals(name));
|
|
assertTrue("Expected annotation to have one element but it had "+a.getValues().size(),a.getValues().size()==1);
|
|
NameValuePair envp = a.getValues().get(0);
|
|
assertTrue("Expected element name "+elementname+" but was "+envp.getNameString(),
|
|
elementname.equals(envp.getNameString()));
|
|
assertTrue("Expected element value "+elementvalue+" but was "+envp.getValue().stringifyValue(),
|
|
elementvalue.equals(envp.getValue().stringifyValue()));
|
|
}
|
|
|
|
|
|
// helper methods
|
|
|
|
public void checkValue(AnnotationGen a,String name,String tostring) {
|
|
for (Iterator<NameValuePair> i = a.getValues().iterator(); i.hasNext();) {
|
|
NameValuePair element = i.next();
|
|
if (element.getNameString().equals(name)) {
|
|
if (!element.getValue().stringifyValue().equals(tostring)) {
|
|
fail("Expected element "+name+" to have value "+tostring+" but it had value "+element.getValue().stringifyValue());
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
fail("Didnt find named element "+name);
|
|
}
|
|
|
|
protected void tearDown() throws Exception {
|
|
super.tearDown();
|
|
}
|
|
|
|
}
|