/********************************************************************** * Copyright (c) 2004, 2016 Intel Corporation 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: * Intel Corporation - Initial API and implementation **********************************************************************/ package org.eclipse.cdt.ui.tests.chelp; import static org.eclipse.cdt.ui.tests.chelp.CHelpTest.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.help.IHelpResource; import org.junit.Assert; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.ICHelpBook; import org.eclipse.cdt.ui.ICHelpResourceDescriptor; import org.eclipse.cdt.ui.IFunctionSummary; import org.eclipse.cdt.ui.IRequiredInclude; import org.eclipse.cdt.ui.text.ICHelpInvocationContext; import org.eclipse.cdt.internal.ui.CHelpProviderManager; import org.eclipse.cdt.internal.ui.text.CHelpBookDescriptor; import org.eclipse.cdt.internal.ui.text.CHelpSettings; /** * */ public class CHelpProviderTester { private static final String KEY_PROVIDER_ID = "providerID"; private static final String KEY_REQUESTED_NAME = "requestedName"; private static final String KEY_BOOK_TITLE = "bookTitle"; private static final String KEY_BOOK_TYPE = "bookType"; private Properties fProperties; private static CHelpProviderTester fDefaultInstance; private CHelpProviderTester() { } public static CHelpProviderTester getDefault() { if (fDefaultInstance == null) fDefaultInstance = new CHelpProviderTester(); return fDefaultInstance; } private class CHelpBook implements ICHelpBook { private int fCHelpType; private String fTitle; public CHelpBook(String providerID, int type) { fCHelpType = type; fTitle = generateBookTitle(providerID, type); } @Override public String getTitle() { return fTitle; } @Override public int getCHelpType() { return fCHelpType; } } private class CHelpResourceDescriptor implements ICHelpResourceDescriptor { ICHelpBook fBook; String fString; String fLabel; String fHref; IHelpResource fResources[]; public CHelpResourceDescriptor(ICHelpBook helpBook, String string, String providerID) { fBook = helpBook; fString = string; fHref = string + helpBook.getTitle() + ".html"; fLabel = generateHelpString(helpBook, string, providerID); fResources = new IHelpResource[1]; fResources[0] = new IHelpResource() { @Override public String getHref() { return fHref; } @Override public String getLabel() { return fLabel; } }; } @Override public ICHelpBook getCHelpBook() { return fBook; } @Override public IHelpResource[] getHelpResources() { return fResources; } } private class FunctionSummary implements IFunctionSummary { private String fName = "Name"; private String fReturnType = "ReturnType"; private String fPrototype = "Prototype"; private String fSummary = "Summary"; private String fSynopsis = "Synopsis"; private IRequiredInclude[] incs = new IRequiredInclude[] { new RequiredInclude("dummy.h")}; private class RequiredInclude implements IRequiredInclude { private String include; public RequiredInclude (String file) { include = file; } @Override public String getIncludeName() { return include; } @Override public boolean isStandard() { return true; } } public FunctionSummary(ICHelpBook helpBook, String string, String providerID) { fName = string; fSummary = generateHelpString(helpBook, string, providerID); } public class FunctionPrototypeSummary implements IFunctionPrototypeSummary { @Override public String getName() { return fName; } @Override public String getReturnType() { return fReturnType; } @Override public String getArguments() { return fPrototype; } @Override public String getPrototypeString(boolean namefirst) { if (true == namefirst) { return fName + " (" + fPrototype + ") " + fReturnType; } else { return fReturnType + " " + fName + " (" + fPrototype + ")"; } } } @Override public String getName() { return fName; } @Override public String getNamespace() { return "dummy namespace"; } @Override public String getDescription() { return fSummary; } @Override public IFunctionPrototypeSummary getPrototype() { return new FunctionPrototypeSummary(); } @Override public IRequiredInclude[] getIncludes() { return incs; } } private static String generateHelpString(ICHelpBook helpBook, String name, String providerID) { Properties props = new Properties(); props.setProperty(KEY_PROVIDER_ID, providerID); props.setProperty(KEY_REQUESTED_NAME, name); props.setProperty(KEY_BOOK_TITLE, helpBook.getTitle()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { props.store(outputStream, null); } catch (IOException e) { fail(e); } return outputStream.toString(); } private static String generateBookTitle(String providerID, int bookType) { Properties props = new Properties(); props.setProperty(KEY_PROVIDER_ID, providerID); props.setProperty(KEY_BOOK_TYPE, String.valueOf(bookType)); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { props.store(outputStream, null); } catch (IOException e) { fail(e); } return outputStream.toString(); } private CHelpProviderTester(String string) { fProperties = new Properties(); ByteArrayInputStream stream = new ByteArrayInputStream(string.getBytes()); try { fProperties.load(stream); } catch (IOException e) { fail(e); } } private String getValueByKey(String key) { String val = fProperties.getProperty(key); if (val == null) val = ""; //$NON-NLS-1$ return val; } private String getHelpProviderID() { return getValueByKey(KEY_PROVIDER_ID); } private String getRequestedName() { return getValueByKey(KEY_REQUESTED_NAME); } private String getBookTitle() { return getValueByKey(KEY_BOOK_TITLE); } public boolean onlyTestInfoProvidersAvailable() { IConfigurationElement configElements[] = Platform.getExtensionRegistry().getConfigurationElementsFor( CUIPlugin.PLUGIN_ID, CHelpSettings.CONTRIBUTION_EXTENSION); int numExts = 0; for (int i = 0; i < configElements.length; i++) { String id = configElements[i].getAttribute("id"); if (!id.startsWith(CHelpTest.TEST_EXTENSION_ID_PREFIX)) return false; } return true; } public ICHelpResourceDescriptor[] generateHelpResources(ICHelpBook[] helpBooks, String name, String providerID) { ICHelpResourceDescriptor des[] = new ICHelpResourceDescriptor[helpBooks.length]; for (int i = 0; i < helpBooks.length; i++) { des[i] = new CHelpResourceDescriptor(helpBooks[i], name, providerID); } return des; } public IFunctionSummary generateFunctionInfo(ICHelpBook[] helpBooks, String name, String providerID) { if (helpBooks.length == 0) return null; return new FunctionSummary(helpBooks[0], name, providerID); } public IFunctionSummary[] generateMatchingFunctions(ICHelpBook[] helpBooks, String prefix, String providerID) { IFunctionSummary sum[] = new IFunctionSummary[helpBooks.length]; for (int i = 0; i < helpBooks.length; i++) { sum[i] = new FunctionSummary(helpBooks[i], prefix, providerID); } return sum; } public ICHelpBook[] generateCHelpBooks(final String providerID) { ICHelpBook books[] = new ICHelpBook[3]; books[0] = new CHelpBook(providerID, ICHelpBook.HELP_TYPE_C); books[1] = new CHelpBook(providerID, ICHelpBook.HELP_TYPE_CPP); books[2] = new CHelpBook(providerID, ICHelpBook.HELP_TYPE_ASM); return books; } private void checkResponse(CHelpProviderTester data[], ICHelpInvocationContext context, String name, boolean allBooksResponded) { CHelpBookDescriptor bookDes[] = CHelpProviderManager.getDefault().getCHelpBookDescriptors(context); for (int i = 0; i < data.length; i++) { CHelpProviderTester tester = data[i]; Assert.assertTrue("the name passed to CHelpProvider (" + tester.getRequestedName() + ") differs prom tha name passed to manager (" + name + ")", name.equals(tester.getRequestedName())); String bookTitle = tester.getBookTitle(); int j = 0; for (; j < bookDes.length; j++) { if (bookTitle.equals(bookDes[j].getCHelpBook().getTitle())) { Assert.assertTrue("provider was requested for help in disabled book", bookDes[j].isEnabled()); break; } } Assert.assertFalse("provider was requested for help in non-existent book", j == bookDes.length); } if (allBooksResponded) { for (int i = 0; i < bookDes.length; i++) { if (bookDes[i].isEnabled()) { String bookTitle = bookDes[i].getCHelpBook().getTitle(); int j = 0; for (; j < data.length; j++) { if (bookTitle.equals(data[j].getBookTitle())) break; } Assert.assertFalse("provider was not requested for help in enabled book", j == bookDes.length); } } } } public void checkHelpResources(ICHelpResourceDescriptor helpDescriptors[], ICHelpInvocationContext context, String name) { if (helpDescriptors == null || helpDescriptors.length == 0) return; List<CHelpProviderTester> dataList = new ArrayList<>(helpDescriptors.length); for (int i = 0; i < helpDescriptors.length; i++) { dataList.add(new CHelpProviderTester(helpDescriptors[i].getHelpResources()[0].getLabel())); } if (!dataList.isEmpty()) checkResponse(dataList.toArray(new CHelpProviderTester[dataList.size()]), context, name, true); } public void checkMatchingFunctions(IFunctionSummary summaries[], ICHelpInvocationContext context, String name) { if (summaries == null || summaries.length == 0) return; List<CHelpProviderTester> dataList = new ArrayList<>(summaries.length); for (int i = 0; i < summaries.length; i++) { dataList.add(new CHelpProviderTester(summaries[i].getDescription())); } if (!dataList.isEmpty()) checkResponse(dataList.toArray(new CHelpProviderTester[dataList.size()]), context, name, true); } public void checkFunctionInfo(IFunctionSummary summary, ICHelpInvocationContext context, String name) { if (summary == null) return; CHelpProviderTester data[] = new CHelpProviderTester[1]; data[0] = new CHelpProviderTester(summary.getDescription()); checkResponse(data, context, name, false); } }