blob: ac44b0cb6b040a7233593d50a8a15532c1ef8a9c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 com.adobe.ac.pmd.rules.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.adobe.ac.pmd.FlexPmdTestBase;
import com.adobe.ac.pmd.IFlexViolation;
import com.adobe.ac.pmd.files.IFlexFile;
import com.adobe.ac.pmd.parser.exceptions.TokenException;
public abstract class AbstractFlexRuleTest extends FlexPmdTestBase
{
final static class AssertPosition
{
public static AssertPosition create( final String message,
final int expectedLine,
final int actualLine )
{
return new AssertPosition( message, expectedLine, actualLine );
}
public int actualLine;
public int expectedLine;
public String message;
private AssertPosition( final String messageToBeSet,
final int expectedLineToBeSet,
final int actualLineToBeSet )
{
super();
message = messageToBeSet;
expectedLine = expectedLineToBeSet;
actualLine = actualLineToBeSet;
}
}
protected final static class ExpectedViolation
{
protected String file;
protected ViolationPosition[] positions;
public ExpectedViolation( final String fileToBeSet,
final ViolationPosition[] positionsToBeSet )
{
super();
file = fileToBeSet;
positions = positionsToBeSet;
}
}
protected static StringBuffer buildFailuresMessage( final List< AssertPosition > failures )
{
final StringBuffer message = new StringBuffer( 42 );
for ( final AssertPosition assertPosition : failures )
{
message.append( assertPosition.message
+ ": expected <" + assertPosition.expectedLine + "> but actually <"
+ assertPosition.actualLine + ">\n" );
}
return message;
}
protected static List< AssertPosition > buildFailureViolations( final String resourcePath,
final ViolationPosition[] expectedPositions,
final List< IFlexViolation > violations )
{
List< AssertPosition > failures;
failures = new ArrayList< AssertPosition >();
for ( int i = 0; i < expectedPositions.length; i++ )
{
final IFlexViolation violation = violations.get( i );
final ViolationPosition expectedPosition = expectedPositions[ i ];
if ( expectedPosition.getBeginLine() != violation.getBeginLine() )
{
failures.add( AssertPosition.create( BEGIN_LINE_NOT_CORRECT
+ " at " + i + "th violation on " + resourcePath,
expectedPosition.getBeginLine(),
violation.getBeginLine() ) );
}
if ( expectedPosition.getEndLine() != violation.getEndLine() )
{
failures.add( AssertPosition.create( END_LINE_NOT_CORRECT
+ " at " + i + "th violation on " + resourcePath,
expectedPosition.getEndLine(),
violation.getEndLine() ) );
}
}
return failures;
}
protected static StringBuffer buildMessageName( final Map< String, List< IFlexViolation >> violatedFiles )
{
final StringBuffer buffer = new StringBuffer( 100 );
for ( final String violatedFileName : violatedFiles.keySet() )
{
final List< IFlexViolation > violations = violatedFiles.get( violatedFileName );
buffer.append( violatedFileName
+ " should not contain any violations " + " (" + violations.size() + " found" );
if ( violations.size() == 1 )
{
buffer.append( " at "
+ violations.get( 0 ).getBeginLine() + ":" + violations.get( 0 ).getEndLine() );
}
buffer.append( ")\n" );
}
return buffer;
}
/**
* Test case which contains non-concerned files by the given rule
*
* @throws TokenException
* @throws IOException
*/
@Test
public final void testProcessNonViolatingFiles() throws IOException,
TokenException
{
final Map< String, List< IFlexViolation >> violatedFiles = extractActualViolatedFiles();
final StringBuffer buffer = buildMessageName( violatedFiles );
if ( !violatedFiles.isEmpty() )
{
fail( buffer.toString() );
}
}
/**
* Test case which contains violating files
*/
@Test
public final void testProcessViolatingFiles()
{
final Map< String, ViolationPosition[] > expectedPositions = computeExpectedViolations( getExpectedViolatingFiles() );
for ( final String fileName : expectedPositions.keySet() )
{
assertViolations( fileName,
expectedPositions.get( fileName ) );
}
}
protected abstract ExpectedViolation[] getExpectedViolatingFiles();
protected List< String > getIgnoreFiles()
{
return new ArrayList< String >();
}
protected abstract AbstractFlexRule getRule();
protected List< IFlexViolation > processFile( final String resourcePath ) throws IOException,
TokenException
{
if ( !getIgnoreFiles().contains( resourcePath ) )
{
return getRule().processFile( getTestFiles().get( resourcePath ),
null,
getTestFiles() );
}
return new ArrayList< IFlexViolation >();
}
private void assertViolations( final String resourcePath,
final ViolationPosition[] expectedPositions )
{
try
{
final List< IFlexViolation > violations = processFile( resourcePath );
assertEquals( VIOLATIONS_NUMBER_NOT_CORRECT
+ " for " + resourcePath,
expectedPositions.length,
violations.size() );
if ( expectedPositions.length != 0 )
{
printFailures( buildFailureViolations( resourcePath,
expectedPositions,
violations ) );
}
}
catch ( final IOException e )
{
fail( e.getMessage() );
}
catch ( final TokenException e )
{
fail( e.getMessage() );
}
}
private Map< String, ViolationPosition[] > computeExpectedViolations( final ExpectedViolation[] expectedViolatingFiles )
{
final Map< String, ViolationPosition[] > expectedViolations = new LinkedHashMap< String, ViolationPosition[] >();
for ( final ExpectedViolation expectedViolatingFile : expectedViolatingFiles )
{
expectedViolations.put( expectedViolatingFile.file,
expectedViolatingFile.positions );
}
return expectedViolations;
}
private Map< String, List< IFlexViolation >> extractActualViolatedFiles() throws IOException,
TokenException
{
final Map< String, List< IFlexViolation > > violatedFiles = new LinkedHashMap< String, List< IFlexViolation > >();
final Map< String, ViolationPosition[] > expectedPositions = computeExpectedViolations( getExpectedViolatingFiles() );
for ( final Map.Entry< String, IFlexFile > fileNameEntry : getTestFiles().entrySet() )
{
if ( !expectedPositions.containsKey( fileNameEntry.getKey() ) )
{
final List< IFlexViolation > violations = processFile( fileNameEntry.getKey() );
if ( !violations.isEmpty() )
{
violatedFiles.put( fileNameEntry.getKey(),
violations );
}
}
}
return violatedFiles;
}
private void printFailures( final List< AssertPosition > failures )
{
if ( !failures.isEmpty() )
{
fail( buildFailuresMessage( failures ).toString() );
}
}
}