/**
* Copyright (c) 2014 - 2017 Frank Appel
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Frank Appel - initial API and implementation
*/
package com.codeaffine.eclipse.ui.progress;
import static com.codeaffine.eclipse.swt.test.util.ShellHelper.createShell;
import static com.codeaffine.eclipse.ui.progress.StructuredViewerAdapterHelperAssert.assertThat;
import static com.codeaffine.eclipse.ui.progress.TestItems.populateTestItemTree;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import com.codeaffine.eclipse.swt.test.util.DisplayHelper;
public class DeferredContentManagerPDETest {
@Rule
public final DisplayHelper displayHelper = new DisplayHelper();
private Shell shell;
@Before
public void setUp() {
shell = createShell( displayHelper, SWT.SHELL_TRIM );
}
@Test
public void deferredChildFetchingWithTreeViewer() {
TreeViewerAdapterHelper adapterHelper = new TreeViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
adapterHelper.setInput( populateTestItemTree() );
assertThat( adapterHelper )
.hasPendingItem( expectedPendingText() )
.completesDeferredLoading()
.hasItemCount( TestItems.CHILD_COUNT );
}
@Test
public void deferredChildFetchingWithTableViewer() {
TableViewerAdapterHelper adapterHelper = new TableViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
adapterHelper.setInput( populateTestItemTree() );
assertThat( adapterHelper )
.hasPendingItem( expectedPendingText() )
.completesDeferredLoading()
.hasItemCount( TestItems.CHILD_COUNT );
}
@Test
public void cancelDeferredChildFetching() {
TableViewerAdapterHelper adapterHelper = new TableViewerAdapterHelper( shell );
adapterHelper.initializeViewer( stubProgressServiceForDelayedSchedule() );
adapterHelper.setInput( populateTestItemTree() );
adapterHelper.cancel();
assertThat( adapterHelper )
.completesDeferredLoading()
.hasItemCount( 0 );
}
@Test
public void isDeferredAdapterWithAdaptableParent() {
TreeViewerAdapterHelper adapterHelper = new TreeViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
DeferredContentManager manager = adapterHelper.getContentManager();
boolean actual = manager.isDeferredAdapter( populateTestItemTree() );
assertThat( actual ).isTrue();
}
@Test
public void isDeferredAdapterWithoutAdaptableParent() {
TreeViewerAdapterHelper adapterHelper = new TreeViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
DeferredContentManager manager = adapterHelper.getContentManager();
boolean actual = manager.isDeferredAdapter( new Object() );
assertThat( actual ).isFalse();
}
@Test
public void getChildrenWithoutAdaptableParent() {
TreeViewerAdapterHelper adapterHelper = new TreeViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
DeferredContentManager manager = adapterHelper.getContentManager();
Object[] actual = manager.getChildren( new Object() );
assertThat( actual ).isEmpty();
}
@Test
public void mayHaveChildrenWithoutAdaptableParent() {
TreeViewerAdapterHelper adapterHelper = new TreeViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
DeferredContentManager manager = adapterHelper.getContentManager();
boolean actual = manager.mayHaveChildren( new Object() );
assertThat( actual ).isFalse();
}
@Test
public void mayHaveChildrenWithoutContainerAdapter() {
TreeViewerAdapterHelper adapterHelper = new TreeViewerAdapterHelper( shell );
adapterHelper.initializeViewer();
DeferredContentManager manager = adapterHelper.getContentManager();
TestItem item = prepareNonContainerAdapter( manager );
boolean actual = manager.mayHaveChildren( item );
assertThat( actual ).isFalse();
}
private static String expectedPendingText() {
return new PendingUpdatePlaceHolder().toString();
}
static IWorkbenchPartSite stubProgressServiceForDelayedSchedule() {
IWorkbenchPartSite result = mock( IWorkbenchPartSite.class );
IWorkbenchSiteProgressService progressService = stubProgressService( TestItem.FETCH_CHILDREN_DELAY );
when( result.getAdapter( IWorkbenchSiteProgressService.class ) ).thenReturn( progressService );
return result;
}
private static IWorkbenchSiteProgressService stubProgressService( int schedulingDelay ) {
IWorkbenchSiteProgressService result = mock( IWorkbenchSiteProgressService.class );
doAnswer( delay( schedulingDelay ) ).when( result ).schedule( any( Job.class ) );
return result;
}
private static Answer<Object> delay( final int schedulingDelay ) {
return new Answer<Object>() {
@Override
public Object answer( InvocationOnMock invocation ) throws Throwable {
Job job = ( Job )invocation.getArguments()[ 0 ];
job.schedule( schedulingDelay );
return null;
}
};
}
private static TestItem prepareNonContainerAdapter( DeferredContentManager manager ) {
TestItem result = populateTestItemTree();
TestItemAdapter adapter = ( TestItemAdapter )manager.getAdapter( result );
adapter.unsetContainer();
return result;
}
}