package com.codeaffine.extras.jdt.internal.junitstatus;
import static com.codeaffine.extras.jdt.internal.JDTExtrasPlugin.PLUGIN_ID;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Collection;
import java.util.function.Predicate;
import org.junit.Before;
import org.junit.Test;
import com.codeaffine.eclipse.core.runtime.Extension;
import com.codeaffine.eclipse.core.runtime.RegistryAdapter;
import com.codeaffine.extras.test.util.ImageAssert;
public class JUnitStatusContributionItemPDETest {
private static final String JUNIT_STATUS_VISIBLE_EXPRESSION
= "com.codeaffine.extras.jdt.internal.JUnitStatusVisibleExpression";
private static final String LOCATION = "toolbar:org.eclipse.ui.trim.status";
private static final String TOOL_BAR_ID = "com.codeaffine.extras.jdt.internal.JUnitStatusToolBar";
private Extension extension;
@Before
public void setUp() {
extension = new RegistryAdapter()
.readExtension( "org.eclipse.ui.menus" )
.thatMatches( new JUnitStatusBarPredicate() )
.process();
}
@Test
public void testExtension() {
assertThat( extension ).isNotNull();
Extension toolbarElement = getToolBarElement();
Extension controlElement = getControlElement();
VisibleWhenElement visibleWhen = getControlVisibleWhenElement();
assertThat( extension.getChildren( "toolbar" ) ).hasSize( 1 );
assertThat( toolbarElement.getChildren( "control" ) ).hasSize( 1 );
assertThat( toolbarElement.getAttribute( "label" ) ).isEqualTo( "JUnit" );
assertThat( controlElement.getAttribute( "id" ) ).isNotNull();
assertThat( controlElement.createExecutableExtension( JUnitStatusContributionItem.class ) ).isNotNull();
assertThat( visibleWhen.isCheckEnabled() ).isFalse();
assertThat( visibleWhen.referencedExpression() ).isEqualTo( JUNIT_STATUS_VISIBLE_EXPRESSION );
}
@Test
public void testShowJUnitViewCommand() {
assertThat( extension ).isNotNull();
Extension command = getCommandElement();
Extension parameter = getCommandParameterElement();
VisibleWhenElement visibleWhen = getCommandVisibleWhenElement();
assertThat( command.getAttribute( "id" ) ).isEqualTo( "com.codeaffine.extras.jdt.internal.OpenJUnitViewToolItem" );
assertThat( command.getAttribute( "commandId" ) ).isEqualTo( "org.eclipse.ui.views.showView" );
assertThat( command.getAttribute( "icon" ) ).isEqualTo( "$nl$/icons/etool16/junit.gif" );
ImageAssert.assertThat( PLUGIN_ID, command.getAttribute( "icon" ) ).exists();
assertThat( command.getAttribute( "style" ) ).isEqualTo( "push" );
assertThat( parameter.getAttribute( "name" ) ).isEqualTo( "org.eclipse.ui.views.showView.viewId" );
assertThat( parameter.getAttribute( "value" ) ).isEqualTo( "org.eclipse.jdt.junit.ResultView" );
assertThat( visibleWhen.isCheckEnabled() ).isFalse();
assertThat( visibleWhen.referencedExpression() ).isEqualTo( JUNIT_STATUS_VISIBLE_EXPRESSION );
}
private Extension getCommandElement() {
return getFirst( getToolBarElement().getChildren( "command" ) );
}
private Extension getCommandParameterElement() {
return getFirst( getCommandElement().getChildren( "parameter" ) );
}
private VisibleWhenElement getCommandVisibleWhenElement() {
return new VisibleWhenElement( getVisibleWhenElement( getCommandElement() ) );
}
private Extension getControlElement() {
return getFirst( getToolBarElement().getChildren( "control" ) );
}
private Extension getToolBarElement() {
return getFirst( extension.getChildren( "toolbar" ) );
}
private VisibleWhenElement getControlVisibleWhenElement() {
return new VisibleWhenElement( getVisibleWhenElement( getControlElement() ) );
}
private static Extension getVisibleWhenElement( Extension extension ) {
return getFirst( extension.getChildren( "visibleWhen" ) );
}
private static <T> T getFirst( Collection<T> collection ) {
return collection.stream().findFirst().orElse( null );
}
private static class VisibleWhenElement {
private final Extension extension;
VisibleWhenElement( Extension extension ) {
this.extension = extension;
}
boolean isCheckEnabled() {
return "true".equals( extension.getAttribute( "checkEnabled" ) );
}
String referencedExpression() {
return getFirst( extension.getChildren( "reference" ) ).getAttribute( "definitionId" );
}
}
private static class JUnitStatusBarPredicate implements Predicate<Extension> {
@Override
public boolean test( Extension input ) {
return isToolBarContribution( input ) && containsJUnitSttausBar( input );
}
private static boolean isToolBarContribution( Extension extension ) {
return LOCATION.equals( extension.getAttribute( "locationURI" ) );
}
private static boolean containsJUnitSttausBar( Extension extension ) {
Collection<Extension> toolBars = extension.getChildren( "toolbar" );
return toolBars.stream().anyMatch( element -> TOOL_BAR_ID.equals( getId( element ) ) );
}
private static String getId( Extension element ) {
return element.getAttribute( "id" );
}
}
}