/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.pmd.rules.junit; import java.util.List; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.java.ast.ASTBlock; import net.sourceforge.pmd.lang.java.ast.ASTCatchStatement; import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.lang.java.ast.ASTName; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.lang.java.ast.ASTStatementExpression; import net.sourceforge.pmd.lang.java.ast.ASTTryStatement; import net.sourceforge.pmd.lang.java.rule.junit.AbstractJUnitRule; /** * @author Cristina González */ public class AssertFailJUnitRule extends AbstractJUnitRule { @Override public Object visit( ASTClassOrInterfaceDeclaration astClassOrInterfaceDeclaration, Object data) { if (astClassOrInterfaceDeclaration.isInterface()) { return data; } return super.visit(astClassOrInterfaceDeclaration, data); } @Override public Object visit( ASTStatementExpression astStatementExpression, Object data) { if (!_isAssertFailStatement(astStatementExpression)) { return data; } ASTTryStatement astTryStatement = astStatementExpression.getFirstParentOfType(ASTTryStatement.class); if (astTryStatement == null) { addViolation(data, astStatementExpression); return data; } ASTCatchStatement astCatchStatement = astStatementExpression.getFirstParentOfType( ASTCatchStatement.class); if (astCatchStatement != null) { addViolation(data, astStatementExpression); return data; } ASTBlock astBlock = astTryStatement.getFirstChildOfType(ASTBlock.class); List<ASTStatementExpression> astStatementExpressions = astBlock.findDescendantsOfType(ASTStatementExpression.class); ASTStatementExpression lastASTStatementExpression = astStatementExpressions.get(astStatementExpressions.size() - 1); if (!lastASTStatementExpression.equals(astStatementExpression)) { addViolation(data, astStatementExpression); return data; } return data; } private boolean _isAssertFailStatement( ASTStatementExpression astStatementExpression) { if ((astStatementExpression == null) || (astStatementExpression.jjtGetNumChildren() == 0)) { return false; } Node node = astStatementExpression.jjtGetChild(0); if (!(node instanceof ASTPrimaryExpression)) { return false; } ASTPrimaryExpression astPrimaryExpression = (ASTPrimaryExpression)node; if (astPrimaryExpression.jjtGetNumChildren() == 0) { return false; } node = astPrimaryExpression.jjtGetChild(0); if (!(node instanceof ASTPrimaryPrefix)) { return false; } ASTPrimaryPrefix astPrimaryPrefix = (ASTPrimaryPrefix)node; if (astPrimaryPrefix.jjtGetNumChildren() == 0) { return false; } node = astPrimaryPrefix.jjtGetChild(0); if (!(node instanceof ASTName)) { return false; } ASTName astName = (ASTName)node; String image = astName.getImage(); if ((image != null) && (image.equals("fail") || image.equals("Assert.fail"))) { return true; } return false; } }