package com.simpligility.maven.plugins.android;
import java.util.Collection;
import java.util.LinkedHashSet;
import org.apache.maven.artifact.Artifact;
import org.junit.Test;
import static java.util.Arrays.asList;
import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
import static com.simpligility.maven.plugins.android.InclusionExclusionResolver.filterArtifacts;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
public class InclusionExclusionResolverTest
{
private static final Artifact A1 = artifact( "jar", "G1", "A1", "1.0" );
private static final Artifact A2 = artifact( "jar", "G2", "A1", "1.0" );
private static final Artifact A3 = artifact( "aar", "G1", "A2", "1.0" );
private static final Artifact A4 = artifact( "jar", "G1", "A3", "2.0-rc" );
private static final Artifact A5 = artifact( "aar", "G2", "A2", "2.0-rc" );
private static final Collection< Artifact > ALL = collect( A1, A2, A3, A4, A5 );
private static final Collection< Artifact > NONE = emptySet();
@Test
public void testSkipDependenciesFalse()
{
assertEquals(
"No artifacts must be skiped",
ALL,
filterArtifacts( ALL, false, null, null, null, null )
);
}
@Test
public void testSkipDependenciesTrue()
{
assertEquals(
"All artifacts must be skipped",
NONE,
filterArtifacts( ALL, true, null, null, null, null )
);
}
@Test
public void testSkipDependenciesIncludeTypes()
{
assertEquals(
"All artifacts must be skipped, but AAR artifacts have higher priority",
collect( A3, A5 ),
filterArtifacts( ALL, true, singleton( "aar" ), null, null, null )
);
assertEquals(
"All artifacts must be skipped, but JAR artifacts have higher priority",
collect( A1, A2, A4 ),
filterArtifacts( ALL, true, singleton( "jar" ), null, null, null )
);
assertEquals(
"No artifacts must be skipped",
ALL,
filterArtifacts( ALL, false, singleton( "aar" ), null, null, null )
);
assertEquals(
"No artifacts must be skipped",
ALL,
filterArtifacts( ALL, false, singleton( "jar" ), null, null, null )
);
}
@Test
public void testSkipDependenciesExcludeTypes()
{
assertEquals(
"All artifacts must be skipped, especially AAR artifacts",
NONE,
filterArtifacts(ALL, true, null, singleton( "aar" ), null, null )
);
assertEquals(
"All artifacts must be skipped, especially JAR artifacts",
NONE,
filterArtifacts( ALL, true, null, singleton( "jar" ), null, null )
);
assertEquals(
"AAR artifacts must be skipped",
collect( A1, A2, A4 ),
filterArtifacts( ALL, false, null, singleton( "aar" ), null, null )
);
assertEquals(
"JAR artifacts must be skipped",
collect( A3, A5 ),
filterArtifacts( ALL, false, null, singleton( "jar" ), null, null )
);
assertEquals(
"All artifacts must be skipped, especially both JAR and AAR artifacts",
NONE,
filterArtifacts( ALL, false, null, asList( "aar", "jar" ), null, null )
);
}
@Test
public void testMatchingArtifactTypesIncludeExcludePriority()
{
assertEquals(
"Include must have higher priority",
ALL,
filterArtifacts( ALL, false, singleton( "jar" ), singleton( "jar" ), null, null )
);
assertEquals(
"Include must have higher priority",
collect( A1, A2, A4 ),
filterArtifacts( ALL, false, singleton( "jar" ), asList("aar", "jar"), null, null )
);
assertEquals(
"Include must have higher priority",
collect( A1, A2, A4 ),
filterArtifacts( ALL, true, singleton( "jar" ), singleton( "jar" ), null, null )
);
assertEquals(
"Include must have higher priority",
collect( A1, A2, A4 ),
filterArtifacts( ALL, true, singleton( "jar" ), asList( "aar", "jar" ), null, null )
);
}
@Test
public void testIncludeExcludeByQualifiers()
{
assertEquals(
"Empty exclude must do nothing",
ALL,
filterArtifacts( ALL, false, null, null, null, singleton( "" ) )
);
assertEquals(
"Empty include must do nothing",
NONE,
filterArtifacts( ALL, true, null, null, singleton( "" ), null )
);
assertEquals(
"Skip all and must include all of group G2",
collect( A2, A5 ),
filterArtifacts( ALL, true, null, null, singleton( "G2" ), null )
);
assertEquals(
"Skip all and must include all of group G2 and artifact A2",
collect( A5 ),
filterArtifacts( ALL, true, null, null, singleton( "G2:A2" ), null )
);
assertEquals(
"Do not skip and must exclude group G2",
collect( A1, A3, A4 ),
filterArtifacts( ALL, false, null, null, null, singleton( "G2" ) )
);
assertEquals(
"Do not skip and must exclude group G2 and artifact A2",
collect( A1, A2, A3, A4 ),
filterArtifacts(ALL, false, null, null, null, singleton( "G2:A2" ) )
);
assertEquals(
"Do not skip and must exclude group G2 and artifact A2 with invalid version",
ALL,
filterArtifacts( ALL, false, null, null, null, singleton( "G2:A2:-" ) )
);
assertEquals(
"Do not skip and must exclude group G2 and artifact A2 with valid version",
collect( A1, A2, A3, A4 ),
filterArtifacts( ALL, false, null, null, null, singleton( "G2:A2:2.0-rc" ) )
);
}
@Test
public void testIncludeExcludeTypeQualifierIntersections()
{
assertEquals(
"Exclude all JARs but include by artifact qualifiers",
collect( A2, A3, A4, A5 ),
filterArtifacts( ALL, false, null, singleton( "jar" ), asList( "G2:A1", "G1:A3" ), null )
);
assertEquals(
"Exclude all JARs but include by artifact qualifiers",
collect(A2, A3, A4, A5),
filterArtifacts( ALL, false, null, singleton( "jar" ), asList( "G2:A1", "G1:A3" ), asList( "G2:A1", "G1:A3" ) )
);
assertEquals(
"Skip all but must include all AAR files despite the concrete artifact exclusion",
collect( A3, A5 ),
filterArtifacts( ALL, true, singleton("aar"), null, null, singleton("G2:A2:2.0-rc"))
);
}
@Test( expected = IllegalArgumentException.class )
public void testIllegalQualifier()
{
filterArtifacts( ALL, false, null, null, singleton( "G1:A1:V:X" ), null );
}
private static Collection<Artifact> collect( Artifact... artifacts )
{
return new LinkedHashSet< Artifact >( asList( artifacts ) );
}
private static Artifact artifact( String type, String groupId, String artifactId, String version )
{
final Artifact artifact = createMock( Artifact.class );
expect( artifact.getType() ).andReturn( type ).anyTimes();
expect( artifact.getGroupId() ).andReturn( groupId ).anyTimes();
expect( artifact.getArtifactId() ).andReturn( artifactId ).anyTimes();
expect( artifact.getVersion() ).andReturn(version).anyTimes();
replay(artifact);
return artifact;
}
}