/*******************************************************************************
 * Copyright (c) 2009 Standard for Technology in Automotive Retail 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:
 *     David Carver (STAR) - bug 271784 - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.dtd.ui.tests.plugin;

import java.io.IOException;
import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import junit.framework.TestCase;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.wst.dtd.ui.internal.DTDUIPlugin;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class TestPluginXMLRequirements extends TestCase{

	private static final String PLUGIN_XML = "plugin.xml";
	
	Document pluginDoc = null;
	XPath xpath = null;

	public TestPluginXMLRequirements() {
		super();
	}
	
	protected void setUp() throws Exception {
		super.setUp();
		
		loadPluginXML();
		initXPath();
	}
	
	protected void tearDown() throws Exception {
		super.tearDown();
		pluginDoc = null;
		xpath = null;
	}

	private void initXPath() {
		XPathFactory xpathFactory = XPathFactory.newInstance();
		xpath = xpathFactory.newXPath();
	}

	private void loadPluginXML() throws Exception {
		URL url = getTestFile(PLUGIN_XML);
		url.openStream();
		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
		pluginDoc = domBuilder.parse(url.openStream());
	}
	
	protected URL getInstallLocation(String path) {
		URL installLocation = DTDUIPlugin.getDefault().getBundle().getEntry(path);
		URL resolvedLocation = null;
		try {
			resolvedLocation = FileLocator.resolve(installLocation);
		}
		catch (IOException e) {
			// impossible
			throw new Error(e);
		}
		return resolvedLocation;
	}

	protected URL getTestFile(String filepath) {
		URL installURL = getInstallLocation("/" + filepath);
		return installURL;
	}
	
	
	public void testDTDToolTipExists() throws Exception {
		String xpathString = "//menuContribution[@locationURI = 'toolbar:org.eclipse.wst.xml.ui.perspective.NewFileToolBar']/command[@id = 'org.eclipse.wst.dtd.ui.newDTDFile']";
		XPathExpression xpathExpr = xpath.compile(xpathString);
		Element element = (Element) xpathExpr.evaluate(pluginDoc.getDocumentElement(), XPathConstants.NODE);
		String toolTip = element.getAttribute("tooltip");
		assertEquals("Unexpected value for DTD tooltip", "%DTD_New_context_type_Extension_Element.name", toolTip);
	}

}
