public Map<String, MethodNode> getDeclaredMethodsMap() { // Start off with the methods from the superclass. ClassNode parent = getSuperClass(); Map<String, MethodNode> result = null; if (parent != null) { result = parent.getDeclaredMethodsMap(); } else { result = new HashMap<String, MethodNode>(); } // add in unimplemented abstract methods from the interfaces for (ClassNode iface : getInterfaces()) { Map<String, MethodNode> ifaceMethodsMap = iface.getDeclaredMethodsMap(); for (String methSig : ifaceMethodsMap.keySet()) { if (!result.containsKey(methSig)) { MethodNode methNode = ifaceMethodsMap.get(methSig); result.put(methSig, methNode); } } } // And add in the methods implemented in this class. for (MethodNode method : getMethods()) { String sig = method.getTypeDescriptor(); result.put(sig, method); } return result; }
/** * Main entry point for the calling the TestForTransformation programmatically. * * @param classNode The class node that represents th test * @param ce The class expression that represents the class to test */ public void testFor(ClassNode classNode, ClassExpression ce) { boolean junit3Test = isJunit3Test(classNode); // make sure the 'log' property is not the one from GroovyTestCase FieldNode log = classNode.getField("log"); if (log == null || log.getDeclaringClass().equals(GROOVY_TEST_CASE_CLASS)) { LoggingTransformer.addLogField(classNode, classNode.getName()); } boolean isSpockTest = isSpockTest(classNode); if (!isSpockTest && !junit3Test) { // assume JUnit 4 Map<String, MethodNode> declaredMethodsMap = classNode.getDeclaredMethodsMap(); for (String methodName : declaredMethodsMap.keySet()) { MethodNode methodNode = declaredMethodsMap.get(methodName); if (isCandidateMethod(methodNode) && methodNode.getName().startsWith("test")) { if (methodNode.getAnnotations().size() == 0) { methodNode.addAnnotation(TEST_ANNOTATION); } } } } final MethodNode methodToAdd = weaveMock(classNode, ce, true); if (methodToAdd != null && junit3Test) { addMethodCallsToMethod(classNode, SET_UP_METHOD, Arrays.asList(methodToAdd)); } }
private void addToJunit4BeforeMethods( ClassNode classNode, String artefactType, ClassExpression targetClassExpression) { Map<String, MethodNode> declaredMethodsMap = classNode.getDeclaredMethodsMap(); boolean weavedIntoBeforeMethods = false; for (MethodNode methodNode : declaredMethodsMap.values()) { if (isDeclaredBeforeMethod(methodNode)) { Statement code = getMethodBody(methodNode); addMockCollaborator(artefactType, targetClassExpression, (BlockStatement) code); weavedIntoBeforeMethods = true; } } if (!weavedIntoBeforeMethods) { BlockStatement junit4Setup = getJunit4Setup(classNode); addMockCollaborator(artefactType, targetClassExpression, junit4Setup); } }
private Set<String> getPropertyNamesToIncludeInWhiteList( final SourceUnit sourceUnit, final ClassNode classNode) { if (CLASS_NAME_TO_WHITE_LIST_PROPERTY_NAMES.containsKey(classNode)) { return CLASS_NAME_TO_WHITE_LIST_PROPERTY_NAMES.get(classNode); } final Set<String> propertyNamesToIncludeInWhiteList = new HashSet<String>(); final Set<String> unbindablePropertyNames = new HashSet<String>(); final Set<String> bindablePropertyNames = new HashSet<String>(); if (!classNode.getSuperClass().equals(new ClassNode(Object.class))) { final Set<String> parentClassPropertyNames = getPropertyNamesToIncludeInWhiteList(sourceUnit, classNode.getSuperClass()); bindablePropertyNames.addAll(parentClassPropertyNames); } final FieldNode constraintsFieldNode = classNode.getDeclaredField(CONSTRAINTS_FIELD_NAME); if (constraintsFieldNode != null && constraintsFieldNode.hasInitialExpression()) { final Expression constraintsInitialExpression = constraintsFieldNode.getInitialExpression(); if (constraintsInitialExpression instanceof ClosureExpression) { final Map<String, Map<String, Expression>> constraintsInfo = GrailsASTUtils.getConstraintMetadata((ClosureExpression) constraintsInitialExpression); for (Entry<String, Map<String, Expression>> constraintConfig : constraintsInfo.entrySet()) { final String propertyName = constraintConfig.getKey(); final Map<String, Expression> mapEntryExpressions = constraintConfig.getValue(); for (Entry<String, Expression> entry : mapEntryExpressions.entrySet()) { final String constraintName = entry.getKey(); if (BINDABLE_CONSTRAINT_NAME.equals(constraintName)) { final Expression valueExpression = entry.getValue(); Boolean bindableValue = null; if (valueExpression instanceof ConstantExpression) { final Object constantValue = ((ConstantExpression) valueExpression).getValue(); if (constantValue instanceof Boolean) { bindableValue = (Boolean) constantValue; } } if (bindableValue != null) { if (Boolean.TRUE.equals(bindableValue)) { unbindablePropertyNames.remove(propertyName); bindablePropertyNames.add(propertyName); } else { bindablePropertyNames.remove(propertyName); unbindablePropertyNames.add(propertyName); } } else { final String message = "The bindable constraint for property [" + propertyName + "] in class [" + classNode.getName() + "] has a value which is not a boolean literal and will be ignored."; GrailsASTUtils.warning(sourceUnit, valueExpression, message); } } } } } } final Set<String> fieldsInTransientsList = getPropertyNamesExpressedInTransientsList(classNode); propertyNamesToIncludeInWhiteList.addAll(bindablePropertyNames); final List<FieldNode> fields = classNode.getFields(); for (FieldNode fieldNode : fields) { final String fieldName = fieldNode.getName(); if ((!unbindablePropertyNames.contains(fieldName)) && (bindablePropertyNames.contains(fieldName) || shouldFieldBeInWhiteList(fieldNode, fieldsInTransientsList))) { propertyNamesToIncludeInWhiteList.add(fieldName); } } final Map<String, MethodNode> declaredMethodsMap = classNode.getDeclaredMethodsMap(); for (Entry<String, MethodNode> methodEntry : declaredMethodsMap.entrySet()) { final MethodNode value = methodEntry.getValue(); if (value.getDeclaringClass() == classNode) { Parameter[] parameters = value.getParameters(); if (parameters != null && parameters.length == 1) { final String methodName = value.getName(); if (methodName.startsWith("set")) { final Parameter parameter = parameters[0]; final ClassNode paramType = parameter.getType(); if (!paramType.equals(new ClassNode(Object.class))) { final String restOfMethodName = methodName.substring(3); final String propertyName = GrailsNameUtils.getPropertyName(restOfMethodName); if (!unbindablePropertyNames.contains(propertyName)) { propertyNamesToIncludeInWhiteList.add(propertyName); } } } } } } CLASS_NAME_TO_WHITE_LIST_PROPERTY_NAMES.put(classNode, propertyNamesToIncludeInWhiteList); Map<String, ClassNode> allAssociationMap = GrailsASTUtils.getAllAssociationMap(classNode); for (String associationName : allAssociationMap.keySet()) { if (!propertyNamesToIncludeInWhiteList.contains(associationName)) { propertyNamesToIncludeInWhiteList.add(associationName); } } return propertyNamesToIncludeInWhiteList; }