package com.codeaffine.extras.workingset.internal; import static com.codeaffine.extras.workingset.internal.RegexPatterns.ANYTHING; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.ui.IWorkingSet; import org.junit.Before; import org.junit.Test; import com.codeaffine.extras.workingset.internal.WorkingSetContentUpdater; public class WorkingSetContentUpdaterTest { private IWorkingSet workingSet; private TestProjectsProvider projectsProvider; @Before public void setUp() { workingSet = mock( IWorkingSet.class ); projectsProvider = new TestProjectsProvider(); } @Test public void testCreateProject() { IProject project = createProject( "foo" ); setWorkingSetPattern( ANYTHING ); setWorkingSetElements( new IAdaptable[ 0 ] ); updateElements(); verify( workingSet ).setElements( new IAdaptable[] { project } ); } @Test public void testCreateNonMatchingProject() { createProject( "foo" ); setWorkingSetPattern( "bar.*" ); setWorkingSetElements( new IAdaptable[ 0 ] ); updateElements(); verify( workingSet, never() ).setElements( any( IAdaptable[].class ) ); } @Test public void testDeleteProject() { setWorkingSetPattern( ANYTHING ); IProject project = createProject( "foo" ); setWorkingSetElements( project ); deleteProject( project ); updateElements(); verify( workingSet ).setElements( new IAdaptable[ 0 ] ); } @Test public void testDeleteNonMatchingProject() { setWorkingSetPattern( "bar.*" ); IProject project = createProject( "foo" ); setWorkingSetElements( project ); deleteProject( project ); updateElements(); verify( workingSet ).setElements( new IAdaptable[ 0 ] ); } @Test public void testChangePatternToExcludeProject() { IProject project = createProject( "foo" ); setWorkingSetElements( project ); setWorkingSetPattern( "bar.*" ); updateElements(); verify( workingSet ).setElements( new IAdaptable[ 0 ] ); } @Test public void testChangePatternToIncludeProject() { IProject project = createProject( "foo-bar" ); setWorkingSetElements( new IAdaptable[ 0 ] ); setWorkingSetPattern( "foo.*" ); updateElements(); verify( workingSet ).setElements( new IAdaptable[] { project } ); } @Test public void testChangePatternToIncludeAndExcludeProject() { IProject fooProject = createProject( "foo" ); IProject barProject = createProject( "bar" ); setWorkingSetPattern( "foo.*" ); setWorkingSetElements( fooProject ); setWorkingSetPattern( "bar.*" ); updateElements(); verify( workingSet ).setElements( new IAdaptable[] { barProject } ); } private IProject createProject( String name ) { IProject result = mock( IProject.class ); when( result.getName() ).thenReturn( name ); projectsProvider.addProject( result ); return result; } private void deleteProject( IProject project ) { projectsProvider.removeProject( project ); } private void updateElements() { new WorkingSetContentUpdater( workingSet, projectsProvider ).updateElements(); } private void setWorkingSetPattern( String pattern ) { when( workingSet.getName() ).thenReturn( pattern ); } private void setWorkingSetElements( IAdaptable... elements ) { when( workingSet.getElements() ).thenReturn( elements ); } }