| /******************************************************************************* |
| * 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 |
| } |
| |
| } |