package xapi.source.read; import java.lang.reflect.Modifier; import org.junit.Assert; import org.junit.Test; import xapi.source.read.JavaVisitor.AnnotationMemberVisitor; import xapi.source.read.JavaVisitor.AnnotationVisitor; import xapi.source.read.JavaVisitor.MethodVisitor; import xapi.source.read.JavaVisitor.ParameterVisitor; import xapi.source.read.JavaVisitor.TypeData; public class JavaLexerTest { @Test public void testAnnotationLexer() { final short[] success = new short[1]; final String annoBody = "name=\"one \\\"\\\"two\\\"\\\" three\\\\\", " + "{1, 2.0, false}, values={1, \"string\", com.test.Class.class}"; JavaLexer.visitAnnotation(new AnnotationVisitor<Void>(){ @Override public AnnotationMemberVisitor<Void> visitAnnotation(String annoName, String annoContent, Void receiver) { success[0] = 1; Assert.assertEquals(annoName, "java.lang.Annotation"); Assert.assertEquals(annoContent, annoBody); return null; } }, null, "@java.lang.Annotation(" + annoBody + ")" , 0); Assert.assertEquals(success[0], 1); } @Test public void testTypeLexer() { String type = "java.lang.Class"; TypeData data = JavaLexer.extractType(type, 0); Assert.assertEquals("java.lang", data.pkgName); Assert.assertEquals("Class", data.clsName); Assert.assertEquals("Class", data.simpleName); Assert.assertEquals(type, data.toString()); String generics = "<SomeGenerics<With, Generics, In<Them>>>"; type = "com.foo.Outer.Inner" + generics + " [] [][ ]"; data = JavaLexer.extractType(type, 0); Assert.assertEquals("com.foo", data.pkgName); Assert.assertEquals("Outer.Inner", data.clsName); Assert.assertEquals("Inner", data.simpleName); Assert.assertEquals(3, data.arrayDepth); Assert.assertEquals(generics, data.generics); } @Test public void testMethodLexer() { final String methodGeneric = "<Complex, Generic extends Signature & More<Stuff>>"; final String modifiers = "public static final"; final String returnType = "Type"; final String returnGeneric = "<With<Generics>>"; final String methodName = "methodName"; final String paramGeneric = "<? extends Generic<int[]>>"; String params = "String[] i, java . lang . Class" +paramGeneric+ " cls"; String exceptions = "java.lang.RuntimeException, ClassCastException "; String method = modifiers + " "+methodGeneric +" "+ returnType+returnGeneric+"[][] " + methodName+ "(" + params+") throws "+exceptions; final int[] success = new int[8]; JavaLexer.visitMethodSignature(new MethodVisitor<Void>() { @Override public AnnotationMemberVisitor<Void> visitAnnotation(String annoName, String annoBody, Void receiver) { Assert.fail("No annotations"); return null; } @Override public void visitJavadoc(String javadoc, Void receiver) { Assert.fail("No javadoc"); } @Override public void visitModifier(int modifier, Void receiver) { switch(modifier) { case Modifier.PUBLIC: case Modifier.STATIC: case Modifier.FINAL: success[0] = success[0] | modifier; break; default: Assert.fail("Illegal modifier: "+Integer.toHexString(modifier)); } } @Override public void visitGeneric(String generic, Void receiver) { Assert.assertEquals(generic, methodGeneric); success[1] = 1; } @Override public void visitReturnType(TypeData returnedType, Void receiver) { Assert.assertEquals(returnedType.clsName, returnType); Assert.assertEquals(returnedType.generics, returnGeneric); Assert.assertEquals(returnedType.arrayDepth, 2); success[2] = 1; } @Override public void visitName(String name, Void receiver) { Assert.assertEquals(name, methodName); success[3] = 1; } @Override public ParameterVisitor<Void> visitParameter() { return new ParameterVisitor<Void>() { @Override public AnnotationMemberVisitor<Void> visitAnnotation(String annoName, String annoBody, Void receiver) { return null; } @Override public void visitModifier(int modifier, Void receiver) { } @Override public void visitType(TypeData type, String name, boolean varargs, Void receiver) { if ("i".equals(name)) { success[4] = 1; Assert.assertEquals("String", type.clsName); Assert.assertEquals(1, type.arrayDepth); } else if ("cls".equals(name)){ success[5] = 1; Assert.assertEquals("java.lang", type.pkgName); Assert.assertEquals("Class", type.clsName); Assert.assertEquals(0, type.arrayDepth); Assert.assertEquals(paramGeneric, type.generics); } else { Assert.fail("Unrecognized name: "+name+"; type: "+type); } } }; } @Override public void visitException(String type, Void receiver) { if ("java.lang.RuntimeException".equals(type)) { success[6] = 1; } else if ("ClassCastException".equals(type)) { success[7] = 1; } else { Assert.fail("Unrecognized exception type: "+type); } } }, null, method, 0); // Make sure everything got called. Assert.assertArrayEquals(success, new int[]{ Modifier.PUBLIC|Modifier.STATIC|Modifier.FINAL ,1,1,1, 1,1,1,1 }); } }