blob: c81a0a6c93d4c0fba9d623671fa671a59c648bdb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2015 Oakland Software Incorporated 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:
* Oakland Software Incorporated - initial API and implementation
*.....IBM Corporation - fixed dead code warning
* Fair Issac Corp - bug 287103 - NCSLabelProvider does not properly handle overrides
* Thibault Le Ouay <thibaultleouay@gmail.com> - Bug 457870
*******************************************************************************/
package org.eclipse.ui.tests.navigator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension;
import org.eclipse.ui.tests.harness.util.DisplayHelper;
import org.eclipse.ui.tests.navigator.extension.TestEmptyContentProvider;
import org.eclipse.ui.tests.navigator.extension.TestLabelProvider;
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderBlank;
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderCyan;
import org.eclipse.ui.tests.navigator.extension.TestLabelProviderStyledGreen;
import org.eclipse.ui.tests.navigator.extension.TrackingLabelProvider;
import org.junit.Test;
public class LabelProviderTest extends NavigatorTestBase {
private static final boolean PRINT_DEBUG_INFO = false;
private static final boolean SLEEP_LONG = false;
public LabelProviderTest() {
_navigatorInstanceId = "org.eclipse.ui.tests.navigator.OverrideTestView";
}
private static final int NONE = 0;
private static final int OVERRIDDEN = 1;
private static final int OVERRIDING = 2;
private static final int BOTH = 3;
private static final boolean BLANK = true;
private static final boolean NULL = false;
private static final String PLAIN = "Plain";
private void setBlank(String cpToGet, boolean blank) {
NavigatorContentExtension ext = (NavigatorContentExtension) _contentService
.getContentExtensionById(cpToGet);
TestLabelProvider tp = (TestLabelProvider) ext.getLabelProvider();
if (blank)
tp._blank = true;
else
tp._null = true;
}
// Bug 289090 label provider returning blank in getText() not properly
// skipped
// Bug 296253 blank label provider should be allowed if nothing better found
public void blankLabelProviderOverride(int nce, boolean blank, String suffix) throws Exception {
String overriddenCp = TEST_CONTENT_OVERRIDDEN1 + suffix; // Red
String overrideCp = TEST_CONTENT_OVERRIDE1 + suffix; // Green
String checkColor = "Green";
switch (nce) {
case NONE:
break;
case OVERRIDDEN:
setBlank(overriddenCp, blank);
break;
case OVERRIDING:
checkColor = "Red";
setBlank(overrideCp, blank);
break;
case BOTH:
setBlank(overriddenCp, blank);
setBlank(overrideCp, blank);
break;
}
_contentService.bindExtensions(new String[] { overriddenCp, overrideCp }, false);
_contentService.getActivationService().activateExtensions(
new String[] { overrideCp, overriddenCp }, true);
refreshViewer();
// This tests the getStyledText() method
TreeItem[] rootItems = _viewer.getTree().getItems();
// Also test the raw ILabelProvider which uses the getText() method
ILabelProvider lp = _contentService.createCommonLabelProvider();
String lpText = lp.getText(rootItems[0].getData());
if (nce == BOTH) {
if (!rootItems[0].getText().equals(""))
fail("Wrong text: " + rootItems[0].getText());
if (blank) {
if (!lpText.equals(""))
fail("Wrong text from ILabelProvider: " + lpText);
} else {
if (lpText != null)
fail("Wrong text from ILabelProvider: " + lpText);
}
} else {
if (!rootItems[0].getText().startsWith(checkColor))
fail("Wrong text: " + rootItems[0].getText());
if (!lpText.startsWith(checkColor))
fail("Wrong text from ILabelProvider: " + lpText);
}
}
@Test
public void testBlankLabelProviderOverrideNone() throws Exception {
blankLabelProviderOverride(NONE, BLANK, "");
}
@Test
public void testNullLabelProviderOverrideNone() throws Exception {
blankLabelProviderOverride(NONE, NULL, "");
}
@Test
public void testPlainBlankLabelProviderOverrideNone() throws Exception {
blankLabelProviderOverride(NONE, BLANK, PLAIN);
}
@Test
public void testPlainNullLabelProviderOverrideNone() throws Exception {
blankLabelProviderOverride(NONE, NULL, PLAIN);
}
@Test
public void testBlankLabelProviderOverride1() throws Exception {
blankLabelProviderOverride(OVERRIDDEN, BLANK, "");
}
@Test
public void testNullLabelProviderOverride1() throws Exception {
blankLabelProviderOverride(OVERRIDDEN, NULL, "");
}
@Test
public void testPlainBlankLabelProviderOverride1() throws Exception {
blankLabelProviderOverride(OVERRIDDEN, BLANK, PLAIN);
}
@Test
public void testPlainNullLabelProviderOverride1() throws Exception {
blankLabelProviderOverride(OVERRIDDEN, NULL, PLAIN);
}
@Test
public void testBlankLabelProviderOverride2() throws Exception {
blankLabelProviderOverride(OVERRIDING, BLANK, "");
}
@Test
public void testNullLabelProviderOverride2() throws Exception {
blankLabelProviderOverride(OVERRIDING, NULL, "");
}
@Test
public void testPlainBlankLabelProviderOverride2() throws Exception {
blankLabelProviderOverride(OVERRIDING, BLANK, PLAIN);
}
@Test
public void testPlainNullLabelProviderOverride2() throws Exception {
blankLabelProviderOverride(OVERRIDING, NULL, PLAIN);
}
@Test
public void testBlankLabelProviderBoth() throws Exception {
blankLabelProviderOverride(BOTH, BLANK, "");
}
@Test
public void testNullLabelProviderBoth() throws Exception {
blankLabelProviderOverride(BOTH, NULL, "");
}
@Test
public void testPlainBlankLabelProviderBoth() throws Exception {
blankLabelProviderOverride(BOTH, BLANK, PLAIN);
}
@Test
public void testPlainNullLabelProviderBoth() throws Exception {
blankLabelProviderOverride(BOTH, NULL, PLAIN);
}
// bug 252293 [CommonNavigator] LabelProviders do not obey override rules
@Test
public void testSimpleResFirst() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_OVERRIDDEN1,
TEST_CONTENT_OVERRIDE1 }, false);
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_OVERRIDE1, TEST_CONTENT_OVERRIDDEN1 }, true);
refreshViewer();
TreeItem[] rootItems = _viewer.getTree().getItems();
checkItems(rootItems, TestLabelProviderStyledGreen.instance);
}
/**
* E{low} overrides D{low} overrides B{normal} overrides A F{high} overrides
* C{low} overrides A G{normal} overrides C{low}.
*
* F is the highest priority and not overridden, so it's first.
* B is next, but is overridden by E and D. So we have FEDB. Then A is processed
* which is overridden by B and C which is overridden by B, so we have FEDBGCA.
*/
@Test
public void testOverrideChain() throws Exception {
final String[] EXTENSIONS = new String[] { TEST_CONTENT_TRACKING_LABEL + ".A",
TEST_CONTENT_TRACKING_LABEL + ".B", TEST_CONTENT_TRACKING_LABEL + ".C",
TEST_CONTENT_TRACKING_LABEL + ".D", TEST_CONTENT_TRACKING_LABEL + ".E",
TEST_CONTENT_TRACKING_LABEL + ".F", TEST_CONTENT_TRACKING_LABEL + ".G" };
_contentService.bindExtensions(EXTENSIONS, true);
_contentService.getActivationService().activateExtensions(EXTENSIONS, true);
refreshViewer();
_viewer.getTree().getItems();
TrackingLabelProvider.resetQueries();
// Time for the decorating label provider to settle down
DisplayHelper.sleep(200);
refreshViewer();
// The label provider (sync runs) and then the decorating label provider
// runs (in something like every 100ms)
// Give time for both and expect both to have happened.
DisplayHelper.sleep(200);
//final String EXPECTED = "FEDBGCA";
//final String EXPECTED = "FGEDBCA";
if (PRINT_DEBUG_INFO)
System.out.println("Map: " + TrackingLabelProvider.styledTextQueries);
String queries = (String) TrackingLabelProvider.styledTextQueries.get(_project);
// This can happen multiple times depending on when the decorating label
// provider runs, so just make sure the sequence is right
assertTrue("F has the highest priority", queries.startsWith("F"));
assertBefore(queries, 'C', 'A');
assertBefore(queries, 'B', 'A');
assertBefore(queries, 'D', 'B');
assertBefore(queries, 'E', 'D');
assertBefore(queries, 'F', 'C');
assertBefore(queries, 'G', 'C');
}
/**
* @param queries
* @param firstChar
* @param secondChar
*/
private void assertBefore(String queries, char firstChar, char secondChar) {
boolean first = false;
final int LEN = queries.length();
for (int i=0; i<LEN; i++) {
char cur = queries.charAt(i);
if (cur == firstChar) {
first = true;
}
if (cur == secondChar) {
assertTrue("Failed to find " + firstChar + " before " + secondChar + " in " + queries, first);
return;
}
}
}
// bug 252293 [CommonNavigator] LabelProviders do not obey override rules
@Test
public void testSimpleResLast() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_OVERRIDDEN2,
TEST_CONTENT_OVERRIDE2 }, false);
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_OVERRIDDEN2, TEST_CONTENT_OVERRIDE2 }, true);
refreshViewer();
if (SLEEP_LONG)
DisplayHelper.sleep(10000000);
TreeItem[] rootItems = _viewer.getTree().getItems();
checkItems(rootItems, TestLabelProviderCyan.instance);
}
@Test
public void testOverrideAdd() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_OVERRIDDEN2,
TEST_CONTENT_OVERRIDE2 }, false);
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_OVERRIDDEN2, TEST_CONTENT_OVERRIDE2 }, true);
refreshViewer();
// Try manually adding
_viewer.expandToLevel(_project, 3);
IFile f = _project.getFile("newfile");
_viewer.add(_project, new Object[] { f });
if (SLEEP_LONG)
DisplayHelper.sleep(10000000);
TreeItem[] rootItems = _viewer.getTree().getItems();
checkItems(rootItems, TestLabelProviderCyan.instance);
}
// Bug 299438 activating extensions does not properly refresh
@Test
public void testChangeActivation() throws Exception {
TreeItem[] rootItems = _viewer.getTree().getItems();
checkItems(rootItems, TestLabelProviderStyledGreen.instance);
_contentService.bindExtensions(new String[] { TEST_CONTENT_OVERRIDDEN2,
TEST_CONTENT_OVERRIDE2 }, false);
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_OVERRIDDEN2, TEST_CONTENT_OVERRIDE2 }, true);
_viewer.expandAll();
//System.out.println(System.currentTimeMillis() + " after expand");
// Let the label provider refresh - wait up to 60 seconds
for (int i = 0; i < 1200; i++) {
rootItems = _viewer.getTree().getItems();
//System.out.println("checking text: " + rootItems[0].getText());
if (rootItems[0].getBackground(0).equals(TestLabelProviderCyan.instance.backgroundColor))
break;
//System.out.println(System.currentTimeMillis() + " before sleep " + i);
DisplayHelper.sleep(50);
}
//System.out.println(System.currentTimeMillis() + " after sleep");
if (SLEEP_LONG)
DisplayHelper.sleep(10000000);
// Wait a little bit still to give the rest of the tree time to refresh
DisplayHelper.sleep(500);
rootItems = _viewer.getTree().getItems();
checkItems(rootItems, TestLabelProviderCyan.instance);
}
// Make sure that it finds label providers that are in overridden content
// extensions
// if none of the label providers from the desired content extensions return
// anything
@Test
public void testUsingOverriddenLabelProvider() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_OVERRIDDEN2,
TEST_CONTENT_OVERRIDE2_BLANK }, true);
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_OVERRIDDEN2, TEST_CONTENT_OVERRIDE2_BLANK }, true);
refreshViewer();
TreeItem[] rootItems = _viewer.getTree().getItems();
if (SLEEP_LONG)
DisplayHelper.sleep(10000000);
// But we get the text from the overridden label provider
if (!rootItems[0].getText().startsWith("Blue"))
fail("Wrong text: " + rootItems[0].getText());
// We get the everything else from the blank label provider
checkItems(rootItems, TestLabelProviderBlank.instance, ALL, !TEXT);
}
// Bug 295803 Source of contribution set to lowest priority NCE
@Test
public void testMultiNceSameObject() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_OVERRIDDEN1, COMMON_NAVIGATOR_RESOURCE_EXT }, true);
// Just two different ones, they don't override, the label provider
// should be associated with the higher priority extension that
// contributed the object.
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_OVERRIDDEN1, COMMON_NAVIGATOR_RESOURCE_EXT }, true);
refreshViewer();
TreeItem[] rootItems = _viewer.getTree().getItems();
// DisplayHelper.sleep(10000000);
// But we get the text from the overridden label provider
if (!rootItems[0].getText().equals("p1"))
fail("Wrong text: " + rootItems[0].getText());
}
// Bug 307132 label provider priority not respected
@Test
public void testLabelProviderPriority() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_EMPTY, COMMON_NAVIGATOR_RESOURCE_EXT }, true);
// Just two different ones, they don't override, the label provider
// should be associated with the higher priority extension that
// contributed the object.
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_EMPTY, COMMON_NAVIGATOR_RESOURCE_EXT }, true);
refreshViewer();
TreeItem[] rootItems = _viewer.getTree().getItems();
//DisplayHelper.sleep(10000000);
// The empty content provider provides the label at a higher priority
// than the resource content provider
assertEquals(TestLabelProviderCyan.instance.image, rootItems[0].getImage(0));
}
// Bug 189986 add SafeRunner for everything
@Test
public void testLabelProviderThrow() throws Exception {
_contentService.bindExtensions(new String[] { TEST_CONTENT_EMPTY, COMMON_NAVIGATOR_RESOURCE_EXT }, true);
_contentService.getActivationService().activateExtensions(
new String[] { TEST_CONTENT_EMPTY, COMMON_NAVIGATOR_RESOURCE_EXT }, true);
TestLabelProvider._throw = true;
TestEmptyContentProvider._throw = true;
refreshViewer();
// Have to look at the log to see a bunch of stuff thrown
}
}