/*******************************************************************************
* Copyright (c) 2010, 2014 BestSolution.at 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:
* Tom Schindl <tom.schindl@bestsolution.at> - adjustment to EObject
* Thibault Le Ouay <thibaultleouay@gmail.com> - Bug 450212
******************************************************************************/
package org.eclipse.e4.emf.xpath.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Iterator;
import org.apache.commons.jxpath.JXPathNotFoundException;
import org.eclipse.e4.emf.xpath.EcoreXPathContextFactory;
import org.eclipse.e4.emf.xpath.XPathContext;
import org.eclipse.e4.emf.xpath.XPathContextFactory;
import org.eclipse.e4.emf.xpath.test.model.xpathtest.XpathtestPackage;
import org.eclipse.e4.emf.xpath.test.model.xpathtest.impl.ExtendedNodeImpl;
import org.eclipse.e4.emf.xpath.test.model.xpathtest.impl.MenuImpl;
import org.eclipse.e4.emf.xpath.test.model.xpathtest.impl.NodeImpl;
import org.eclipse.e4.emf.xpath.test.model.xpathtest.impl.RootImpl;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ExampleQueriesTestCase {
private ResourceSet resourceSet;
private XPathContext xpathContext;
private Resource resource;
@Test
public void testSimpleQuery() {
Object application = xpathContext.getValue("/");
assertNotNull(application);
assertSame(RootImpl.class, application.getClass());
application = xpathContext.getValue(".");
assertNotNull(application);
assertSame(RootImpl.class, application.getClass());
try {
application = xpathContext.getValue(".[@id='nixda']");
fail("This query should fail with JXPathNotFoundException");
} catch (JXPathNotFoundException path) {
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
application = xpathContext.getValue(".[@id='root']");
assertNotNull(application);
assertSame(RootImpl.class, application.getClass());
assertEquals("element1",xpathContext.getValue("nodes[1]/@id"));
assertEquals(NodeImpl.class, xpathContext.getValue("//.[@id='element2.2']").getClass());
assertEquals(ExtendedNodeImpl.class,xpathContext.getValue("//.[ecore:eClassName(.)='ExtendedNode']").getClass());
}
@Test
public void testMenuQuery() {
Object application = xpathContext.getValue("/");
assertNotNull(application);
assertSame(RootImpl.class, application.getClass());
Object node = xpathContext.getValue("//.[@id='menuContainer.1']/menus[@id='menu.1']");
assertNotNull(node);
Iterator<Object> i = xpathContext.iterate("//.[@id='menu.1']");
assertTrue(i.hasNext());
assertSame(NodeImpl.class, i.next().getClass());
assertTrue(i.hasNext());
assertSame(MenuImpl.class, i.next().getClass());
// EMF model has a loop in it, it just goes back to the top
//assertFalse(i.hasNext());
}
@Before
public void setUp() {
resourceSet = new ResourceSetImpl();
resourceSet
.getResourceFactoryRegistry()
.getExtensionToFactoryMap()
.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
new XMIResourceFactoryImpl());
// Register the package to ensure it is available during loading.
resourceSet.getPackageRegistry().put(XpathtestPackage.eNS_URI,
XpathtestPackage.eINSTANCE);
URI uri = URI.createPlatformPluginURI(
"/org.eclipse.e4.emf.xpath.test/model/Test.xmi", true);
resource = resourceSet.getResource(uri, true);
XPathContextFactory<EObject> f = EcoreXPathContextFactory.newInstance();
xpathContext = f.newContext(resource.getContents().get(0));
}
@After
public void tearDown() {
xpathContext = null;
resource.unload();
resourceSet.getResources().remove(resource);
}
}