package com.codeaffine.extras.workingset.internal; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.eclipse.core.resources.IProject; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkingSet; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import com.codeaffine.eclipse.swt.test.util.DisplayHelper; import com.codeaffine.eclipse.swt.test.util.SWTIgnoreConditions.NonWindowsPlatform; import com.codeaffine.test.util.junit.ConditionalIgnoreRule; import com.codeaffine.test.util.junit.ConditionalIgnoreRule.ConditionalIgnore; public class DynamicWorkingSetPagePDETest { @Rule public final DisplayHelper displayHelper = new DisplayHelper(); @Rule public final ConditionalIgnoreRule ignoreRule = new ConditionalIgnoreRule(); private TestProjectsProvider projectsProvider; private IWorkingSet initialWorkingSet; private WorkingSetFactory workingSetFactory; private TestableDynamicWorkingSetPage page; @Before public void setUp() { displayHelper.ensureDisplay(); projectsProvider = new TestProjectsProvider(); initialWorkingSet = createWorkingSet(); workingSetFactory = mock( WorkingSetFactory.class ); when( workingSetFactory.createWorkingSet() ).thenReturn( initialWorkingSet ); JdtFeature jdtFeature = mock( JdtFeature.class ); page = new TestableDynamicWorkingSetPage( projectsProvider, jdtFeature, workingSetFactory ); } @After public void tearDown() { page.dispose(); } @Test public void testGetTitle() { assertThat( page.getTitle() ).isNotEmpty(); } @Test public void testGetDescription() { assertThat( page.getDescription() ).isNotEmpty(); } @Test public void testSetSelection() { IWorkingSet workingSet = createWorkingSet(); page.setSelection( workingSet ); assertThat( page.getSelection() ).isEqualTo( workingSet ); } @Test public void testGetInitialSelection() { assertThat( page.getSelection() ).isEqualTo( initialWorkingSet ); } @ConditionalIgnore(condition=NonWindowsPlatform.class) @Test public void testSetVisibleFirstTime() { openPageInWizardDialog(); page.setVisible( true ); assertThat( page.nameText.isFocusControl() ).isTrue(); assertThat( page.getControl().getVisible() ).isTrue(); assertThat( page.getMessage() ).isNull(); assertThat( page.getMessageType() ).isEqualTo( IMessageProvider.NONE ); assertThat( page.isPageComplete() ).isFalse(); } @ConditionalIgnore(condition=NonWindowsPlatform.class) @Test public void testSetVisibleSecondTime() { openPageInWizardDialog(); page.patternText.setFocus(); page.setVisible( true ); assertThat( page.patternText.isFocusControl() ).isTrue(); assertThat( page.getControl().getVisible() ).isTrue(); } @Test public void testCreateControl() { IWorkingSet workingSet = createWorkingSet( "name", "pattern" ); projectsProvider.addProject( createProject( "project-name" ) ); page.setSelection( workingSet ); page.createControl( displayHelper.createShell() ); assertThat( page.nameText.getText() ).isEqualTo( workingSet.getLabel() ); assertThat( page.patternText.getText() ).isEqualTo( workingSet.getName() ); assertThat( page.previewViewer.getTable().getItemCount() ).isEqualTo( 1 ); } @Test public void testCreateControlDoesNotUpdateMessage() { IWorkingSet workingSet = createWorkingSet( "name", "pattern" ); page.setSelection( workingSet ); page.createControl( displayHelper.createShell() ); assertThat( page.getMessage() ).isNull(); assertThat( page.getErrorMessage() ).isNull(); } @Test public void testFinish() { IWorkingSet workingSet = createWorkingSet(); page.setSelection( workingSet ); page.createControl( displayHelper.createShell() ); page.nameText.setText( "name" ); page.patternText.setText( "pattern" ); page.finish(); verify( workingSet ).setLabel( "name" ); verify( workingSet ).setName( "pattern" ); } @Test // see https://github.com/rherrmann/eclipse-extras/issues/53 public void testFinishWithoutSelection() { page.createControl( displayHelper.createShell() ); page.nameText.setText( "name" ); page.patternText.setText( "pattern" ); page.finish(); verify( initialWorkingSet ).setLabel( "name" ); verify( initialWorkingSet ).setName( "pattern" ); } @Test public void testEnterName() { page.setSelection( createWorkingSet() ); page.createControl( displayHelper.createShell() ); page.setVisible( true ); page.nameText.setText( "name" ); assertThat( page.getMessage() ).isNotEmpty(); assertThat( page.getMessageType() ).isEqualTo( IMessageProvider.ERROR ); assertThat( page.isPageComplete() ).isFalse(); } @Test public void testEnterPattern() { page.setSelection( createWorkingSet() ); page.createControl( displayHelper.createShell() ); page.setVisible( true ); page.patternText.setText( "pattern" ); assertThat( page.getMessage() ).isNotEmpty(); assertThat( page.getMessageType() ).isEqualTo( IMessageProvider.ERROR ); assertThat( page.isPageComplete() ).isFalse(); } @Test public void testChangeExistingName() { IWorkingSet workingSet = createWorkingSet( "name", "pattern" ); projectsProvider.addProject( createProject( "project-name" ) ); page.setSelection( workingSet ); page.createControl( displayHelper.createShell() ); page.setVisible( true ); page.nameText.setText( "other name" ); assertThat( page.isPageComplete() ).isTrue(); } private static IWorkingSet createWorkingSet() { IWorkingSet result = mock( IWorkingSet.class ); when( result.getLabel() ).thenReturn( "" ); when( result.getName() ).thenReturn( "" ); return result; } private static IWorkingSet createWorkingSet( String name, String pattern ) { IWorkingSet result = createWorkingSet(); when( result.getLabel() ).thenReturn( name ); when( result.getName() ).thenReturn( pattern ); return result; } private static IProject createProject( String name ) { IProject result = mock( IProject.class ); when( result.getName() ).thenReturn( name ); return result; } private void openPageInWizardDialog() { Wizard wizard = new Wizard() { @Override public boolean performFinish() { return true; } }; WizardDialog wizardDialog = new WizardDialog( displayHelper.createShell(), wizard ); wizard.setContainer( wizardDialog ); wizard.addPage( page ); page.setWizard( wizard ); wizardDialog.setBlockOnOpen( false ); wizardDialog.open(); wizardDialog.showPage( page ); } private static class TestableDynamicWorkingSetPage extends DynamicWorkingSetPage { TestableDynamicWorkingSetPage( TestProjectsProvider projectsProvider, JdtFeature jdtFeature, WorkingSetFactory workingSetFactory ) { super( projectsProvider, jdtFeature, workingSetFactory ); } @Override public Shell getShell() { Shell result = super.getShell(); if( result == null ) { result = composite.getShell(); } return result; } } }