/* * ModeShape (http://www.modeshape.org) * * Licensed 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.modeshape.sequencer.javafile; import static org.junit.Assert.assertNotNull; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertThat; import javax.jcr.Node; import javax.jcr.NodeIterator; import org.junit.Ignore; import org.junit.Test; import org.modeshape.jcr.sequencer.AbstractSequencerTest; import org.modeshape.sequencer.classfile.ClassFileSequencerLexicon; import org.modeshape.sequencer.classfile.metadata.Visibility; import org.modeshape.sequencer.testdata.ClassType; public final class ClassTypeSequencerTest extends AbstractSequencerTest { @Ignore @Test public void shouldTestFixForMode2272() throws Exception { final int count = 10; jcrSession().getRootNode().addNode("java"); // prevent SNS jcrSession().save(); for (int i = 0; i < count; ++i) { createNodeWithContentFromFile("myclassannotation" + i + ".java", "org/acme/annotation/MyClassAnnotation.java"); createNodeWithContentFromFile("mypackageannotation" + i + ".java", "org/acme/annotation/MyPackageAnnotation.java"); createNodeWithContentFromFile("mysource" + i + ".java", "org/acme/MySource.java"); } for (int i = 0; i < count; ++i) { String relativePath = "java/" + "myclassannotation" + i + ".java"; Node outputNode = getOutputNode(rootNode, relativePath); assertNotNull("Failed to get " + relativePath, outputNode); relativePath = "java/" + "mypackageannotation" + i + ".java"; outputNode = getOutputNode(rootNode, relativePath); assertNotNull("Failed to get " + relativePath, outputNode); relativePath = "java/" + "mysource" + i + ".java"; outputNode = getOutputNode(rootNode, relativePath); assertNotNull("Failed to get " + relativePath, outputNode); } } @Test public void shouldSequenceClassInDefaultPackage() throws Exception { createNodeWithContentFromFile("defaultpackageclass.java", "DefaultPackageClass.java"); final String expectedOutputPath = "java/defaultpackageclass.java"; final Node compilationUnitNode = getOutputNode(rootNode, expectedOutputPath); assertThat(compilationUnitNode, is(notNullValue())); } @Test public void shouldSequenceClassTypeFile() throws Exception { final String packagePath = ClassType.class.getName().replaceAll("\\.", "/"); createNodeWithContentFromFile("classtype.java", packagePath + ".java"); // expected by sequencer in a different location final String expectedOutputPath = "java/classtype.java"; final Node compilationUnitNode = getOutputNode(rootNode, expectedOutputPath); assertThat(compilationUnitNode, is(notNullValue())); assertThat(compilationUnitNode.isNodeType(ClassFileSequencerLexicon.COMPILATION_UNIT), is(true)); assertThat(compilationUnitNode.hasProperty(ClassFileSequencerLexicon.SEQUENCED_DATE), is(true)); assertThat(compilationUnitNode.hasProperty(ClassFileSequencerLexicon.TYPES), is(true)); assertThat(compilationUnitNode.getProperty(ClassFileSequencerLexicon.TYPES).getValues().length, is(1)); assertThat(compilationUnitNode.hasNode(ClassFileSequencerLexicon.MESSAGES), is(false)); { // 2 imports assertThat(compilationUnitNode.hasNode(ClassFileSequencerLexicon.IMPORTS), is(true)); assertThat(compilationUnitNode.getNode(ClassFileSequencerLexicon.IMPORTS).getNodes().getSize(), is(3L)); final NodeIterator itr = compilationUnitNode.getNode(ClassFileSequencerLexicon.IMPORTS).getNodes(); { // first import final Node firstImport = itr.nextNode(); assertThat(firstImport.getName(), is("java.io.Serializable")); assertThat(firstImport.hasProperty(ClassFileSequencerLexicon.STATIC), is(true)); assertThat(firstImport.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(firstImport.hasProperty(ClassFileSequencerLexicon.ON_DEMAND), is(true)); assertThat(firstImport.getProperty(ClassFileSequencerLexicon.ON_DEMAND).getBoolean(), is(false)); } { // second import final Node secondImport = itr.nextNode(); assertThat(secondImport.getName(), is("java.util.ArrayList")); assertThat(secondImport.hasProperty(ClassFileSequencerLexicon.STATIC), is(true)); assertThat(secondImport.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(secondImport.hasProperty(ClassFileSequencerLexicon.ON_DEMAND), is(true)); assertThat(secondImport.getProperty(ClassFileSequencerLexicon.ON_DEMAND).getBoolean(), is(false)); } { // third import final Node thirdImport = itr.nextNode(); assertThat(thirdImport.getName(), is("java.util.HashMap")); assertThat(thirdImport.hasProperty(ClassFileSequencerLexicon.STATIC), is(true)); assertThat(thirdImport.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(thirdImport.hasProperty(ClassFileSequencerLexicon.ON_DEMAND), is(true)); assertThat(thirdImport.getProperty(ClassFileSequencerLexicon.ON_DEMAND).getBoolean(), is(false)); } } { // comments assertThat(compilationUnitNode.hasNode(ClassFileSequencerLexicon.COMMENTS), is(true)); assertThat(compilationUnitNode.getNode(ClassFileSequencerLexicon.COMMENTS).getNodes().getSize(), is(2L)); final NodeIterator itr = compilationUnitNode.getNode(ClassFileSequencerLexicon.COMMENTS).getNodes(); { // file block header final Node firstComment = itr.nextNode(); assertThat(firstComment.getName(), is(ClassFileSequencerLexicon.COMMENT)); assertThat(firstComment.hasProperty(ClassFileSequencerLexicon.COMMENT_TYPE), is(true)); assertThat(firstComment.getProperty(ClassFileSequencerLexicon.COMMENT_TYPE).getString(), is(ClassFileSequencerLexicon.CommentType.BLOCK.toString())); assertThat(firstComment.hasProperty(ClassFileSequencerLexicon.COMMENT), is(true)); assertThat(firstComment.getProperty(ClassFileSequencerLexicon.COMMENT).getString().startsWith("/*\n * ModeShape"), is(true)); } { // line comment for field CONSTANT final Node secondComment = itr.nextNode(); assertThat(secondComment.getName(), is(ClassFileSequencerLexicon.COMMENT)); assertThat(secondComment.hasProperty(ClassFileSequencerLexicon.COMMENT_TYPE), is(true)); assertThat(secondComment.getProperty(ClassFileSequencerLexicon.COMMENT_TYPE).getString(), is(ClassFileSequencerLexicon.CommentType.LINE.toString())); assertThat(secondComment.hasProperty(ClassFileSequencerLexicon.COMMENT), is(true)); assertThat(secondComment.getProperty(ClassFileSequencerLexicon.COMMENT).getString(), is("// a line comment")); } } { // class type final Node classNode = compilationUnitNode.getNode(packagePath); assertThat(classNode.getName(), is("ClassType")); assertThat(classNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(classNode.getName())); assertThat(classNode.hasProperty(ClassFileSequencerLexicon.SEQUENCED_DATE), is(true)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.SUPER_CLASS_NAME).getString(), is("ArrayList<T>")); assertThat(classNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is(Visibility.PUBLIC.getDescription())); assertThat(classNode.getProperty(ClassFileSequencerLexicon.ABSTRACT).getBoolean(), is(true)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.INTERFACE).getBoolean(), is(false)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.STRICT_FP).getBoolean(), is(false)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(classNode.hasProperty(ClassFileSequencerLexicon.IMPORTS), is(false)); assertThat(classNode.hasProperty(ClassFileSequencerLexicon.INTERFACES), is(true)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.INTERFACES).getValues().length, is(1)); assertThat(classNode.getProperty(ClassFileSequencerLexicon.INTERFACES).getValues()[0].getString(), is("Serializable")); assertThat(classNode.hasNode(ClassFileSequencerLexicon.CONSTRUCTORS), is(false)); { // initializer assertThat(classNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(true)); final Node initializerNode = classNode.getNode(ClassFileSequencerLexicon.INITIALIZER); assertThat(initializerNode.getNodes().getSize(), is(1L)); final Node statementNode = initializerNode.getNodes().nextNode(); assertThat(statementNode.getProperty(ClassFileSequencerLexicon.CONTENT).getString(), is("System.out.println(System.currentTimeMillis());\n")); } { // annotations assertThat(classNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.ANNOTATIONS).getNodes().getSize(), is(1l)); final Node annotationNode = classNode.getNode(ClassFileSequencerLexicon.ANNOTATIONS).getNodes().nextNode(); assertThat(annotationNode.getName(), is("SuppressWarnings")); assertThat(annotationNode.hasProperty(ClassFileSequencerLexicon.ANNOTATION_TYPE), is(true)); assertThat(annotationNode.getProperty(ClassFileSequencerLexicon.ANNOTATION_TYPE).getString(), is(ClassFileSequencerLexicon.AnnotationType.SINGLE_MEMBER.toString())); assertThat(annotationNode.getNodes().getSize(), is(1L)); final String memberName = "default"; assertThat(annotationNode.hasNode(memberName), is(true)); final Node memberNode = annotationNode.getNode(memberName); assertThat(memberNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(memberName)); assertThat(memberNode.hasProperty(ClassFileSequencerLexicon.VALUE), is(true)); assertThat(memberNode.getProperty(ClassFileSequencerLexicon.VALUE).getString(), is("{\"serial\",\"unused\"}")); } { // fields assertThat(classNode.hasNode(ClassFileSequencerLexicon.FIELDS), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.FIELDS).getNodes().getSize(), is(4L)); final Node fieldsNode = classNode.getNode(ClassFileSequencerLexicon.FIELDS); { // CONSTANT field final Node fieldNode = fieldsNode.getNode("CONSTANT"); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(fieldNode.getName())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("String")); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is(Visibility.PUBLIC.getDescription())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(true)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(true)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TRANSIENT).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VOLATILE).getBoolean(), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(true)); final Node initializerNode = fieldNode.getNode(ClassFileSequencerLexicon.INITIALIZER); assertThat(initializerNode.getProperty(ClassFileSequencerLexicon.CONTENT).getString(), is("\"constant\"")); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.TYPE), is(true)); final Node fieldTypeNode = fieldNode.getNode(ClassFileSequencerLexicon.TYPE); assertThat(fieldTypeNode.isNodeType(ClassFileSequencerLexicon.SIMPLE_TYPE), is(true)); assertThat(fieldTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("String")); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(true)); final Node javadocNode = fieldNode.getNode(ClassFileSequencerLexicon.JAVADOC); final String comment = "A constant"; assertThat(javadocNode.getProperty(ClassFileSequencerLexicon.COMMENT).getString().contains(comment), is(true)); } { // twoString field final Node fieldNode = fieldsNode.getNode("twoString"); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(fieldNode.getName())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("Object")); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is(Visibility.PUBLIC.getDescription())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TRANSIENT).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VOLATILE).getBoolean(), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.TYPE), is(true)); final Node fieldTypeNode = fieldNode.getNode(ClassFileSequencerLexicon.TYPE); assertThat(fieldTypeNode.isNodeType(ClassFileSequencerLexicon.SIMPLE_TYPE), is(true)); assertThat(fieldTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("Object")); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(true)); final Node initializerNode = fieldNode.getNode(ClassFileSequencerLexicon.INITIALIZER); assertThat(initializerNode.getProperty(ClassFileSequencerLexicon.CONTENT).getString().contains("toString"), is(true)); } { // number field final Node fieldNode = fieldsNode.getNode("number"); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(fieldNode.getName())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("Number")); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is("package")); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TRANSIENT).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VOLATILE).getBoolean(), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.TYPE), is(true)); final Node fieldTypeNode = fieldNode.getNode(ClassFileSequencerLexicon.TYPE); assertThat(fieldTypeNode.isNodeType(ClassFileSequencerLexicon.SIMPLE_TYPE), is(true)); assertThat(fieldTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("Number")); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(true)); final Node initializerNode = fieldNode.getNode(ClassFileSequencerLexicon.INITIALIZER); assertThat(initializerNode.getProperty(ClassFileSequencerLexicon.CONTENT).getLong(), is(1L)); } { // t field final Node fieldNode = fieldsNode.getNode("t"); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(fieldNode.getName())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("T")); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is(Visibility.PRIVATE.getDescription())); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.TRANSIENT).getBoolean(), is(false)); assertThat(fieldNode.getProperty(ClassFileSequencerLexicon.VOLATILE).getBoolean(), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(false)); assertThat(fieldNode.hasNode(ClassFileSequencerLexicon.TYPE), is(true)); final Node fieldTypeNode = fieldNode.getNode(ClassFileSequencerLexicon.TYPE); assertThat(fieldTypeNode.isNodeType(ClassFileSequencerLexicon.ARRAY_TYPE), is(true)); assertThat(fieldTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("T")); assertThat(fieldTypeNode.getProperty(ClassFileSequencerLexicon.DIMENSIONS).getLong(), is(1L)); assertThat(fieldTypeNode.hasNode(ClassFileSequencerLexicon.COMPONENT_TYPE), is(true)); final Node componentTypeNode = fieldTypeNode.getNode(ClassFileSequencerLexicon.COMPONENT_TYPE); assertThat(componentTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("T")); } } { // methods assertThat(classNode.hasNode(ClassFileSequencerLexicon.METHODS), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.METHODS).getNodes().getSize(), is(4L)); final Node methodsNode = classNode.getNode(ClassFileSequencerLexicon.METHODS); { // getId method final Node methodNode = methodsNode.getNode("getId"); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(methodNode.getName())); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.RETURN_TYPE_CLASS_NAME).getString(), is("String")); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is("package")); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.ABSTRACT).getBoolean(), is(true)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STRICT_FP).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NATIVE).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.SYNCHRONIZED).getBoolean(), is(false)); assertThat(methodNode.hasProperty(ClassFileSequencerLexicon.THROWN_EXCEPTIONS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.TYPE_PARAMETERS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.METHOD_PARAMETERS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.BODY), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(true)); final Node javadocNode = methodNode.getNode(ClassFileSequencerLexicon.JAVADOC); final String comment = "@return the identifier (never <code>null</code>)"; assertThat(javadocNode.getProperty(ClassFileSequencerLexicon.COMMENT).getString().contains(comment), is(true)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.RETURN_TYPE), is(true)); final Node returnTypeNode = methodNode.getNode(ClassFileSequencerLexicon.RETURN_TYPE); assertThat(returnTypeNode.isNodeType(ClassFileSequencerLexicon.SIMPLE_TYPE), is(true)); assertThat(returnTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("String")); } { // set method final Node methodNode = methodsNode.getNode("set"); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(methodNode.getName())); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is("public")); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(true)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.ABSTRACT).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STRICT_FP).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NATIVE).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.SYNCHRONIZED).getBoolean(), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(true)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.TYPE_PARAMETERS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.BODY), is(true)); { // parameters assertThat(methodNode.hasNode(ClassFileSequencerLexicon.METHOD_PARAMETERS), is(true)); assertThat(methodNode.getNode(ClassFileSequencerLexicon.METHOD_PARAMETERS).getNodes().getSize(), is(1L)); final Node paramNode = methodNode.getNode(ClassFileSequencerLexicon.METHOD_PARAMETERS).getNodes().nextNode(); assertThat(paramNode.getName(), is("t")); assertThat(paramNode.getPrimaryNodeType().getName(), is(ClassFileSequencerLexicon.PARAMETER)); assertThat(paramNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("T")); assertThat(paramNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(paramNode.getProperty(ClassFileSequencerLexicon.VARARGS).getBoolean(), is(true)); assertThat(paramNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(false)); assertThat(paramNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(true)); assertThat(paramNode.getNode(ClassFileSequencerLexicon.ANNOTATIONS).getNodes().getSize(), is(1L)); final Node annotationNode = paramNode.getNode(ClassFileSequencerLexicon.ANNOTATIONS).getNodes().nextNode(); assertThat(annotationNode.getName(), is("SuppressWarnings")); assertThat(annotationNode.hasProperty(ClassFileSequencerLexicon.ANNOTATION_TYPE), is(true)); assertThat(annotationNode.getProperty(ClassFileSequencerLexicon.ANNOTATION_TYPE).getString(), is(ClassFileSequencerLexicon.AnnotationType.SINGLE_MEMBER.toString())); assertThat(annotationNode.getNodes().getSize(), is(1L)); final String memberName = "default"; assertThat(annotationNode.hasNode(memberName), is(true)); final Node memberNode = annotationNode.getNode(memberName); assertThat(memberNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(memberName)); assertThat(memberNode.hasProperty(ClassFileSequencerLexicon.VALUE), is(true)); assertThat(memberNode.getProperty(ClassFileSequencerLexicon.VALUE).getString(), is("unchecked")); } { // thrown exceptions assertThat(methodNode.hasProperty(ClassFileSequencerLexicon.THROWN_EXCEPTIONS), is(true)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.THROWN_EXCEPTIONS).getValues().length, is(1)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.THROWN_EXCEPTIONS).getValues()[0].getString(), is("Exception")); } { // return type assertThat(methodNode.getProperty(ClassFileSequencerLexicon.RETURN_TYPE_CLASS_NAME).getString(), is("void")); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.RETURN_TYPE), is(true)); final Node returnTypeNode = methodNode.getNode(ClassFileSequencerLexicon.RETURN_TYPE); assertThat(returnTypeNode.isNodeType(ClassFileSequencerLexicon.PRIMITIVE_TYPE), is(true)); assertThat(returnTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("void")); } } { // get method final Node methodNode = methodsNode.getNode("get"); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(methodNode.getName())); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.RETURN_TYPE_CLASS_NAME).getString(), is("T")); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is("public")); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.ABSTRACT).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STRICT_FP).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NATIVE).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.SYNCHRONIZED).getBoolean(), is(true)); assertThat(methodNode.hasProperty(ClassFileSequencerLexicon.THROWN_EXCEPTIONS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.TYPE_PARAMETERS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.METHOD_PARAMETERS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.RETURN_TYPE), is(true)); final Node returnTypeNode = methodNode.getNode(ClassFileSequencerLexicon.RETURN_TYPE); assertThat(returnTypeNode.isNodeType(ClassFileSequencerLexicon.ARRAY_TYPE), is(true)); assertThat(returnTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("T")); assertThat(returnTypeNode.getProperty(ClassFileSequencerLexicon.DIMENSIONS).getLong(), is(1L)); assertThat(returnTypeNode.hasNode(ClassFileSequencerLexicon.COMPONENT_TYPE), is(true)); final Node componentTypeNode = returnTypeNode.getNode(ClassFileSequencerLexicon.COMPONENT_TYPE); assertThat(componentTypeNode.isNodeType(ClassFileSequencerLexicon.TYPE), is(true)); assertThat(componentTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("T")); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.BODY), is(true)); assertThat(methodNode.getNode(ClassFileSequencerLexicon.BODY).getNodes().getSize(), is(1L)); final Node statementNode = methodNode.getNode(ClassFileSequencerLexicon.BODY).getNodes().nextNode(); assertThat(statementNode.getName(), is(ClassFileSequencerLexicon.STATEMENT)); assertThat(statementNode.getProperty(ClassFileSequencerLexicon.CONTENT).getString(), is("return this.t;\n")); } { // shutdown method final Node methodNode = methodsNode.getNode("shutdown"); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(methodNode.getName())); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is("public")); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.ABSTRACT).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.STRICT_FP).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.NATIVE).getBoolean(), is(false)); assertThat(methodNode.getProperty(ClassFileSequencerLexicon.SYNCHRONIZED).getBoolean(), is(false)); assertThat(methodNode.hasProperty(ClassFileSequencerLexicon.THROWN_EXCEPTIONS), is(false)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.BODY), is(true)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(true)); assertThat(methodNode.getNode(ClassFileSequencerLexicon.ANNOTATIONS).getNodes().getSize(), is(1l)); final Node annotationNode = methodNode.getNode(ClassFileSequencerLexicon.ANNOTATIONS).getNodes().nextNode(); assertThat(annotationNode.getName(), is("Deprecated")); assertThat(annotationNode.hasProperty(ClassFileSequencerLexicon.ANNOTATION_TYPE), is(true)); assertThat(annotationNode.getProperty(ClassFileSequencerLexicon.ANNOTATION_TYPE).getString(), is(ClassFileSequencerLexicon.AnnotationType.MARKER.toString())); assertThat(annotationNode.getNodes().getSize(), is(0L)); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.TYPE_PARAMETERS), is(true)); assertThat(methodNode.getNode(ClassFileSequencerLexicon.TYPE_PARAMETERS).getNodes().getSize(), is(1L)); final Node typeParamNode = methodNode.getNode(ClassFileSequencerLexicon.TYPE_PARAMETERS).getNodes().nextNode(); assertThat(typeParamNode.getName(), is("U")); assertThat(typeParamNode.hasNode(ClassFileSequencerLexicon.BOUNDS), is(true)); assertThat(typeParamNode.getNode(ClassFileSequencerLexicon.BOUNDS).getNodes().getSize(), is(1L)); final Node boundNode = typeParamNode.getNode(ClassFileSequencerLexicon.BOUNDS).getNodes().nextNode(); assertThat(boundNode.getName(), is("Number")); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(true)); final Node javadocNode = methodNode.getNode(ClassFileSequencerLexicon.JAVADOC); final String comment = "Performs a shutdown"; assertThat(javadocNode.getProperty(ClassFileSequencerLexicon.COMMENT).getString().contains(comment), is(true)); { // parameters assertThat(methodNode.hasNode(ClassFileSequencerLexicon.METHOD_PARAMETERS), is(true)); assertThat(methodNode.getNode(ClassFileSequencerLexicon.METHOD_PARAMETERS).getNodes().getSize(), is(1L)); final Node paramNode = methodNode.getNode(ClassFileSequencerLexicon.METHOD_PARAMETERS).getNodes().nextNode(); assertThat(paramNode.getName(), is("waitTime")); assertThat(paramNode.getPrimaryNodeType().getName(), is(ClassFileSequencerLexicon.PARAMETER)); assertThat(paramNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("U")); assertThat(paramNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(true)); assertThat(paramNode.getProperty(ClassFileSequencerLexicon.VARARGS).getBoolean(), is(false)); assertThat(paramNode.hasNode(ClassFileSequencerLexicon.ANNOTATIONS), is(false)); assertThat(paramNode.hasNode(ClassFileSequencerLexicon.INITIALIZER), is(false)); } { // return type assertThat(methodNode.getProperty(ClassFileSequencerLexicon.RETURN_TYPE_CLASS_NAME).getString(), is("void")); assertThat(methodNode.hasNode(ClassFileSequencerLexicon.RETURN_TYPE), is(true)); final Node returnTypeNode = methodNode.getNode(ClassFileSequencerLexicon.RETURN_TYPE); assertThat(returnTypeNode.isNodeType(ClassFileSequencerLexicon.PRIMITIVE_TYPE), is(true)); assertThat(returnTypeNode.getProperty(ClassFileSequencerLexicon.TYPE_CLASS_NAME).getString(), is("void")); } } } { // typeParameters assertThat(classNode.hasNode(ClassFileSequencerLexicon.TYPE_PARAMETERS), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.TYPE_PARAMETERS).getNodes().getSize(), is(1L)); assertThat(classNode.getNode(ClassFileSequencerLexicon.TYPE_PARAMETERS).getPrimaryNodeType().getName(), is(ClassFileSequencerLexicon.TYPE_PARAMETERS)); final Node typeParamNode = classNode.getNode(ClassFileSequencerLexicon.TYPE_PARAMETERS).getNode("T"); assertThat(typeParamNode.getPrimaryNodeType().getName(), is(ClassFileSequencerLexicon.TYPE_PARAMETER)); assertThat(typeParamNode.hasNode(ClassFileSequencerLexicon.BOUNDS), is(true)); final Node boundsNode = typeParamNode.getNode(ClassFileSequencerLexicon.BOUNDS); assertThat(boundsNode.getNodes().getSize(), is(1L)); assertThat(boundsNode.getNodes().nextNode().getName(), is("HashMap<String, ?>")); } { // implements assertThat(classNode.hasNode(ClassFileSequencerLexicon.IMPLEMENTS), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.IMPLEMENTS).getNodes().getSize(), is(1L)); final Node interfaceNode = classNode.getNode(ClassFileSequencerLexicon.IMPLEMENTS).getNode("Serializable"); assertThat(interfaceNode.getPrimaryNodeType().getName(), is(ClassFileSequencerLexicon.SIMPLE_TYPE)); } { // extends assertThat(classNode.hasNode(ClassFileSequencerLexicon.EXTENDS), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.EXTENDS).getNodes().getSize(), is(1L)); final Node superTypeNode = classNode.getNode(ClassFileSequencerLexicon.EXTENDS).getNode("ArrayList<T>"); assertThat(superTypeNode.getPrimaryNodeType().getName(), is(ClassFileSequencerLexicon.PARAMETERIZED_TYPE)); } { // javadoc assertThat(classNode.hasNode(ClassFileSequencerLexicon.JAVADOC), is(true)); final Node javadocNode = classNode.getNode(ClassFileSequencerLexicon.JAVADOC); final String comment = "This is a class type test class"; assertThat(javadocNode.getProperty(ClassFileSequencerLexicon.COMMENT).getString().contains(comment), is(true)); } { // nested types assertThat(classNode.hasNode(ClassFileSequencerLexicon.NESTED_TYPES), is(true)); assertThat(classNode.getNode(ClassFileSequencerLexicon.NESTED_TYPES).getNodes().getSize(), is(1L)); final Node nestedTypeNode = classNode.getNode(ClassFileSequencerLexicon.NESTED_TYPES).getNodes().nextNode(); assertThat(nestedTypeNode.getName(), is("Blah")); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.NAME).getString(), is(nestedTypeNode.getName())); assertThat(nestedTypeNode.hasProperty(ClassFileSequencerLexicon.SEQUENCED_DATE), is(true)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.SUPER_CLASS_NAME).getString(), is("java.lang.Object")); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.VISIBILITY).getString(), is("package")); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.ABSTRACT).getBoolean(), is(false)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.INTERFACE).getBoolean(), is(false)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.FINAL).getBoolean(), is(false)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.STRICT_FP).getBoolean(), is(false)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.STATIC).getBoolean(), is(false)); assertThat(nestedTypeNode.hasProperty(ClassFileSequencerLexicon.IMPORTS), is(false)); assertThat(nestedTypeNode.hasProperty(ClassFileSequencerLexicon.INTERFACES), is(true)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.INTERFACES).getValues().length, is(1)); assertThat(nestedTypeNode.getProperty(ClassFileSequencerLexicon.INTERFACES).getValues()[0].getString(), is("Comparable<T>")); assertThat(nestedTypeNode.hasNode(ClassFileSequencerLexicon.FIELDS), is(true)); assertThat(nestedTypeNode.getNode(ClassFileSequencerLexicon.FIELDS).getNodes().getSize(), is(1L)); assertThat(nestedTypeNode.hasNode(ClassFileSequencerLexicon.CONSTRUCTORS), is(true)); assertThat(nestedTypeNode.getNode(ClassFileSequencerLexicon.CONSTRUCTORS).getNodes().getSize(), is(1L)); assertThat(nestedTypeNode.hasNode(ClassFileSequencerLexicon.METHODS), is(true)); assertThat(nestedTypeNode.getNode(ClassFileSequencerLexicon.METHODS).getNodes().getSize(), is(2L)); } } } @Ignore @Test public void shouldSequenceTwoClassesFile() throws Exception { final String packagePath = ClassType.class.getName().replaceAll("\\.", "/"); createNodeWithContentFromFile("twoouterclasses.java", packagePath + ".java"); // expected by sequencer in a different location final String expectedOutputPath = "java/twoouterclasses.java"; final Node compilationUnitNode = getOutputNode(rootNode, expectedOutputPath); assertThat(compilationUnitNode, is(notNullValue())); assertThat(compilationUnitNode.isNodeType(ClassFileSequencerLexicon.COMPILATION_UNIT), is(true)); assertThat(compilationUnitNode.hasProperty(ClassFileSequencerLexicon.SEQUENCED_DATE), is(true)); assertThat(compilationUnitNode.hasNode(ClassFileSequencerLexicon.MESSAGES), is(false)); assertThat(compilationUnitNode.hasProperty(ClassFileSequencerLexicon.TYPES), is(true)); assertThat(compilationUnitNode.getProperty(ClassFileSequencerLexicon.TYPES).getValues().length, is(2)); } }