/********************************************************************** * Copyright (c) 2004, 2008 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 java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import junit.framework.Assert; import org.eclipse.cdt.internal.ui.CHelpProviderManager; import org.eclipse.cdt.internal.ui.text.CHelpBookDescriptor; import org.eclipse.cdt.internal.ui.text.CHelpSettings; 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.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.help.IHelpResource; /** * */ 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 = null; 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); } public String getTitle(){ return fTitle; } 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(){ public String getHref(){ return fHref; } public String getLabel(){ return fLabel; } }; } public ICHelpBook getCHelpBook(){ return fBook; } 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; } public String getIncludeName() { return include; } 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 { public String getName() { return fName; } public String getReturnType() { return fReturnType; } public String getArguments() { return fPrototype; } public String getPrototypeString(boolean namefirst) { if (true == namefirst) { return fName + " (" + fPrototype + ") " + fReturnType; } else { return fReturnType + " " + fName + " (" + fPrototype + ")"; } } } public String getName() { return fName; } public String getNamespace() { return "dummy namespace"; } public String getDescription() { return fSummary; } public IFunctionPrototypeSummary getPrototype() { return new FunctionPrototypeSummary(); } 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(Exception 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(Exception e){ } return outputStream.toString(); } private CHelpProviderTester(String string) throws IOException{ fProperties = new Properties(); ByteArrayInputStream stream = new ByteArrayInputStream(string.getBytes()); try{ fProperties.load(stream); }catch(IOException e){ //TODO: handle throw e; } } private String getValueByKey(String key){ String val = fProperties.getProperty(key); if(val == null) val = new String(); 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 dataList = new ArrayList(helpDescriptors.length); for(int i = 0; i < helpDescriptors.length; i++){ try{ dataList.add(new CHelpProviderTester(helpDescriptors[i].getHelpResources()[0].getLabel())); }catch(IOException e){ Assert.fail("checkHelpResources failed to instantiate CHelpProviderTester, IOException occured: " + e.getMessage()); } } if(dataList.size() > 0) checkResponse((CHelpProviderTester[])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 dataList = new ArrayList(summaries.length); for(int i = 0; i < summaries.length; i++){ try{ dataList.add(new CHelpProviderTester(summaries[i].getDescription())); }catch(IOException e){ Assert.fail("checkMatchingFunctions failed to instantiate CHelpProviderTester, IOException occured: " + e.getMessage()); } } if(dataList.size() > 0) checkResponse((CHelpProviderTester[])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]; try{ data[0] = new CHelpProviderTester(summary.getDescription()); checkResponse(data, context, name, false); }catch(IOException e){ Assert.fail("checkFunctionInfo failed to instantiate CHelpProviderTester, IOException occured: " + e.getMessage()); } } }