package org.projectusus.core.proportions.rawdata.jdtdriver.publicfields; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.util.Collection; import java.util.Iterator; import org.eclipse.core.resources.IFile; import org.eclipse.jdt.core.dom.Modifier; import org.junit.Test; import org.projectusus.core.proportions.rawdata.jdtdriver.JavaFileDriver; import org.projectusus.core.statistics.test.PDETestForMetricsComputation; import com.google.common.collect.Multimap; public class PublicField_PDETest extends PDETestForMetricsComputation { @Test public void assumptionsAreValid() throws Exception { project.createFolder( "pde" ); IFile file = createJavaFile( "pde/PublicFields.java" ); PublicFieldInspector inspector = new PublicFieldInspector(); new JavaFileDriver( file ).compute( createSetWith( inspector ) ); Multimap<String, Integer> map = inspector.getMap(); validateEmptyClass( map.get( "EmptyClass" ) ); validateOneOfEachKind( map.get( "OneOfEachKind" ) ); validateOneOfEachKind( map.get( "OneOfEachKindTwice" ) ); validateOneOfEachKindExceptE( map.get( "AnotherClassWithFields" ) ); validateOneOfEachKind( map.get( "OneOfEachKindTwoClasses" ) ); validateEmptyClass( map.get( "AnotherClassWithoutFields" ) ); validateOnePublicField( map.get( "OnePublicField" ) ); validateOnlyPublicStaticFinal( map.get( "OnlyPublicStaticFinal" ) ); } private void validateEmptyClass( Collection<Integer> collection ) { assertThat( collection.size(), is( 0 ) ); } private void validateOnePublicField( Collection<Integer> collection ) { assertThat( collection.size(), is( 1 ) ); Iterator<Integer> iterator = collection.iterator(); assertIsPublicStaticFinal( iterator.next(), true, false, false ); } private void validateOnlyPublicStaticFinal( Collection<Integer> collection ) { assertThat( collection.size(), is( 4 ) ); Iterator<Integer> iterator = collection.iterator(); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), true, true, true ); } private void validateOneOfEachKind( Collection<Integer> collection ) { assertThat( collection.size(), is( 7 ) ); Iterator<Integer> iterator = collection.iterator(); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), true, false, false ); assertIsPublicStaticFinal( iterator.next(), true, true, false ); assertIsPublicStaticFinal( iterator.next(), true, false, true ); assertIsPublicStaticFinal( iterator.next(), true, true, true ); } private void validateOneOfEachKindExceptE( Collection<Integer> collection ) { assertThat( collection.size(), is( 6 ) ); Iterator<Integer> iterator = collection.iterator(); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), false, false, false ); assertIsPublicStaticFinal( iterator.next(), true, false, false ); assertIsPublicStaticFinal( iterator.next(), true, false, true ); assertIsPublicStaticFinal( iterator.next(), true, true, true ); } private void assertIsPublicStaticFinal( Integer field, boolean isPublic, boolean isStatic, boolean isFinal ) { assertThat( isPublic( field ), is( isPublic ) ); assertThat( isStatic( field ), is( isStatic ) ); assertThat( isFinal( field ), is( isFinal ) ); } private boolean isStatic( int fieldModifiers ) { return contains( fieldModifiers, Modifier.STATIC ); } private boolean isFinal( int fieldModifiers ) { return contains( fieldModifiers, Modifier.FINAL ); } private boolean isPublic( int fieldModifiers ) { return contains( fieldModifiers, Modifier.PUBLIC ); } private boolean contains( int fieldModifiers, int flag ) { return (fieldModifiers & flag) != 0; } }