blob: 385431c002da9bb438ee3f3d9d8ef1deea585d0d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Tasktop Technologies and others.
* 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:
* Tasktop Technologies - initial API and implementation
* Red Hat Inc. - Bugs 474127, 474132
*******************************************************************************/
package org.eclipse.ui.tests.progress;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.Accessible;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.progress.FinishedJobs;
import org.eclipse.ui.internal.progress.ProgressAnimationItem;
import org.eclipse.ui.internal.progress.ProgressManager;
import org.eclipse.ui.internal.progress.ProgressRegion;
import org.eclipse.ui.progress.IProgressConstants;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ProgressAnimationItemTest {
private Shell shell;
private ProgressAnimationItem animationItem;
@Before
public void setUp() {
Display display = PlatformUI.getWorkbench().getDisplay();
shell = new Shell(display);
shell.setSize(400, 300);
shell.setLayout(new FillLayout());
shell.open();
Composite composite = new Composite(shell, SWT.V_SCROLL);
animationItem = createProgressAnimationItem(composite);
}
@After
public void tearDown() {
FinishedJobs.getInstance().clearAll();
shell.dispose();
}
@Test
public void testSingleJobRefreshOnce() throws Exception {
createAndScheduleJob();
ProgressManager.getInstance().notifyListeners();
refresh();
assertSingleAccessibleListener();
}
@Test
public void testTwoJobsRefreshOnce() throws Exception {
createAndScheduleJob();
createAndScheduleJob();
ProgressManager.getInstance().notifyListeners();
refresh();
assertSingleAccessibleListener();
}
@Test
public void testSingleJobRefreshTwice() throws Exception {
createAndScheduleJob();
ProgressManager.getInstance().notifyListeners();
refresh();
refresh();
assertSingleAccessibleListener();
}
private ProgressAnimationItem createProgressAnimationItem(Composite composite) {
ProgressRegion progressRegion = new ProgressRegion();
progressRegion.createContents(composite);
return (ProgressAnimationItem) progressRegion.getAnimationItem();
}
private static void createAndScheduleJob() throws InterruptedException {
DummyJob job = new DummyJob("Keep me", Status.OK_STATUS);
job.setProperty(IProgressConstants.KEEP_PROPERTY, true);
job.schedule();
job.join();
}
private void refresh() throws Exception {
Method m = ProgressAnimationItem.class.getDeclaredMethod("refresh");
m.setAccessible(true);
m.invoke(animationItem);
}
private void assertSingleAccessibleListener() throws Exception {
assertEquals(1, getAccessibleListenersSize(getToolBar(animationItem).getAccessible()));
}
private ToolBar getToolBar(ProgressAnimationItem animationItem) {
Composite top = (Composite) animationItem.getControl();
for (Control child : top.getChildren()) {
if (child instanceof ToolBar) {
return (ToolBar) child;
}
}
return null;
}
/**
* Loads, using reflection, the internal accessible listeners vector from
* inside the Accessible and returns its size. If the collection is null,
* returns 0.
*/
private static int getAccessibleListenersSize(Accessible accessible) throws Exception {
Field f = Accessible.class.getDeclaredField("accessibleListeners");
f.setAccessible(true);
Collection accessibleListeners = (Collection) f.get(accessible);
return accessibleListeners == null ? 0 : accessibleListeners.size();
}
}