/**
 * <copyright>
 *
 * Copyright (c) 2014 itemis and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
 *
 * Contributors:
 *     itemis - Initial API and implementation
 *
 * </copyright>
 */
package org.eclipse.sphinx.tests.emf.serialization.save;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.io.StringReader;

import javax.xml.namespace.QName;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.sphinx.tests.emf.serialization.model.nodes.Node;
import org.eclipse.sphinx.tests.emf.serialization.model.nodes.NodesFactory;
import org.eclipse.sphinx.tests.emf.serialization.model.nodes.NodesPackage;
import org.eclipse.sphinx.tests.emf.serialization.model.nodes.SubNode;
import org.junit.Test;
import org.xml.sax.InputSource;

@SuppressWarnings("nls")
public class BasicSaveTests extends AbstractSaveTestCase {

	@Test
	public void testEReference_Contained0000Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0000Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0000Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("leafNode11",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode12",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode22",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode31",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[5]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode32",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[6]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode41",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[7]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode42",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[8]/@name", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0001Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0001Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0001Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate("/nodes:NODE/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode11",
					xpath.evaluate("/nodes:NODE/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode12",
					xpath.evaluate("/nodes:NODE/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));

			assertEquals("intermediateNode2", xpath.evaluate("/nodes:NODE/nodes:NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21",
					xpath.evaluate("/nodes:NODE/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode22",
					xpath.evaluate("/nodes:NODE/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3", xpath.evaluate("/nodes:NODE/nodes:SUB-NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode31",
					xpath.evaluate("/nodes:NODE/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode32",
					xpath.evaluate("/nodes:NODE/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));

			assertEquals("intermediateSubNode4", xpath.evaluate("/nodes:NODE/nodes:SUB-NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode41",
					xpath.evaluate("/nodes:NODE/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode42",
					xpath.evaluate("/nodes:NODE/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0010Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0010Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0010Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("leafNode11",
					xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode12",
					xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21",
					xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode22",
					xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode31", xpath.evaluate("/nodes:NODE/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode32", xpath.evaluate("/nodes:NODE/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode41", xpath.evaluate("/nodes:NODE/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode42", xpath.evaluate("/nodes:NODE/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0011Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0011Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0011Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode11", xpath.evaluate(
					"/nodes:NODE/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode12", xpath.evaluate(
					"/nodes:NODE/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));

			assertEquals("intermediateNode2", xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21", xpath.evaluate(
					"/nodes:NODE/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode22", xpath.evaluate(
					"/nodes:NODE/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3",
					xpath.evaluate("/nodes:NODE/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode31", xpath.evaluate(
					"/nodes:NODE/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode32", xpath.evaluate(
					"/nodes:NODE/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));

			assertEquals("intermediateSubNode4",
					xpath.evaluate("/nodes:NODE/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode41", xpath.evaluate(
					"/nodes:NODE/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode42", xpath.evaluate(
					"/nodes:NODE/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0100Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0100Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode11", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode12", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));

			assertEquals("intermediateNode2",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode22", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));

			assertEquals("intermediateSubNode3",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name", root, XPathConstants.STRING));
			assertEquals("nodes:SUB-NODE",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@xsi:type", root, XPathConstants.STRING));
			assertEquals("leafNode31", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode32", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));

			assertEquals("intermediateSubNode4",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name", root, XPathConstants.STRING));
			assertEquals("nodes:SUB-NODE",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@xsi:type", root, XPathConstants.STRING));
			assertEquals("leafNode41", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("leafNode42", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0101Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0101Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0101Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[1]/nodes:NODE/@name", root, XPathConstants.STRING));
			assertEquals("leafNode11", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[1]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode12", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[1]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));

			assertEquals("intermediateNode2",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[2]/nodes:NODE/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[2]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode22", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[2]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[3]/nodes:SUB-NODE/@name", root, XPathConstants.STRING));
			assertEquals("leafNode31", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[3]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode32", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[3]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));

			assertEquals("intermediateSubNode4",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[4]/nodes:SUB-NODE/@name", root, XPathConstants.STRING));
			assertEquals("leafNode41", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[4]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode42", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0101-MULTI[4]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0110Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0110Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0110Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("leafNode11", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode12", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode21", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode22", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name",
					root, XPathConstants.STRING));
			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0111Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained0111Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained0111Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:NODES[1]/nodes:NODE[1]/@name", root, XPathConstants.STRING));

			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals("intermediateNode2", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:NODES[1]/nodes:NODE[2]/@name", root, XPathConstants.STRING));

			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/@name", root,
					XPathConstants.STRING));

			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals("intermediateSubNode4", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/@name", root,
					XPathConstants.STRING));

			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1001Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1001Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1001Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode11", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode12", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));

			assertEquals("intermediateNode2",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode21", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
					root, XPathConstants.STRING));
			assertEquals("leafNode22", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
					root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:SUB-NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateSubNode4", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:SUB-NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1001-MULTIS[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1010Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1010Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1010Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1010-MULTIS[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1011Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1011Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1011Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:NODES[1]/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateNode2", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:NODES[1]/nodes:NODE[2]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateSubNode4", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1011-MULTIS[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1100Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1100Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1100Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[1]/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateNode2", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[2]/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateSubNode3", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[3]/@name", root,
					XPathConstants.STRING));
			assertEquals("nodes:SUB-NODE", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[3]/@xsi:type", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[3]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[3]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateSubNode4", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[4]/@name", root,
					XPathConstants.STRING));
			assertEquals("nodes:SUB-NODE", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[4]/@xsi:type", root,
					XPathConstants.STRING));

			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[4]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1100-MULTI[4]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1101Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1101Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1101Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[1]/nodes:NODE/@name",
					root, XPathConstants.STRING));
			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[1]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[1]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals("intermediateNode2", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[2]/nodes:NODE/@name",
					root, XPathConstants.STRING));
			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[2]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[2]/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"intermediateSubNode3",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[3]/nodes:SUB-NODE/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[3]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[3]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"intermediateSubNode4",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[4]/nodes:SUB-NODE/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[4]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1101-MULTI[4]/nodes:SUB-NODE/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1110Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1110Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1110Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[3]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1110-MULTI[1]/nodes:SUB-NODES[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[4]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1111Many() {
		try {
			String fileName = BASEDIR + "EReference_Contained1111Many.xml";
			Node rootNode = createNodeModel_ContainedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Contained1111Many(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals(
					"intermediateNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:NODES[1]/nodes:NODE[1]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"leafNode11",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode12",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:NODES[1]/nodes:NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"intermediateNode2",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:NODES[1]/nodes:NODE[2]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"leafNode21",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode22",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:NODES[1]/nodes:NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"intermediateSubNode3",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"leafNode31",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode32",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"intermediateSubNode4",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/@name",
							root, XPathConstants.STRING));

			assertEquals(
					"leafNode41",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"leafNode42",
					xpath.evaluate(
							"/nodes:NODE/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTIS[1]/nodes:FEATURE-WITH-SERIALIZATION-1111-MULTI[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[2]/nodes:FEATURE-WITH-SERIALIZATION-0100-MULTI[2]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0000Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0000Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0000Single(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("leafNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:SUB-NODE/@name", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0001Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0001Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0001Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate("/nodes:NODE/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode1", xpath.evaluate("/nodes:NODE/nodes:NODE[1]/nodes:SUB-NODE[1]/@name", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0010Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0010Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0010Single(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate("/nodes:NODE/nodes:NODES[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode1", xpath.evaluate("/nodes:NODE/nodes:NODES[1]//nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:SUB-NODE[1]/@name",
					root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0011Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0011Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0011Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode1", xpath.evaluate("/nodes:NODE/nodes:NODES[1]/nodes:NODE[1]/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/@name", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0100Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0100Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0100Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-0100-SINGLE[1]/@name", root, XPathConstants.STRING));
			assertEquals("leafNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0100-SINGLE[1]/nodes:EREFERENCE-CONTAINED-0100-SINGLE[1]/@name", root,
					XPathConstants.STRING));
			assertEquals("nodes:SUB-NODE", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0100-SINGLE[1]/nodes:EREFERENCE-CONTAINED-0100-SINGLE[1]/@xsi:type", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0101Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0101Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:NODE/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:NODE/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:SUB-NODE/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:NODE/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:NODE/@xsi:type",
							root, XPathConstants.STRING));
		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0110Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0110Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0110Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-0110-SINGLE[1]/nodes:NODES/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0110-SINGLE[1]/nodes:NODES/nodes:EREFERENCE-CONTAINED-0110-SINGLE[1]/nodes:SUB-NODES/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0110-SINGLE[1]/nodes:NODES/nodes:EREFERENCE-CONTAINED-0110-SINGLE[1]/nodes:SUB-NODES/@xsi:type",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained0111Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained0111Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained0111Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-0111-SINGLE[1]/nodes:NODES/nodes:NODE/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0111-SINGLE[1]/nodes:NODES/nodes:NODE/nodes:EREFERENCE-CONTAINED-0111-SINGLE[1]/nodes:SUB-NODES/nodes:SUB-NODE/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-0111-SINGLE[1]/nodes:NODES/nodes:NODE/nodes:EREFERENCE-CONTAINED-0111-SINGLE[1]/nodes:SUB-NODES/nodes:SUB-NODE/@xsi:type",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1000Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1000Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1000Single(),
					NodesPackage.eINSTANCE.getNode_EReference_Contained0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("leafNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1000-SINGLES/nodes:EREFERENCE-CONTAINED-0101-SINGLE[1]/nodes:SUB-NODE/@name", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1001Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1001Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1001Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-1001-SINGLES/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1001-SINGLES/nodes:NODE[1]/nodes:EREFERENCE-CONTAINED-1001-SINGLES/nodes:SUB-NODE[1]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1010Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1010Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1010Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-CONTAINED-1010-SINGLES/nodes:NODES[1]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1010-SINGLES/nodes:NODES[1]/nodes:EREFERENCE-CONTAINED-1010-SINGLES[1]/nodes:SUB-NODES[1]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1011Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1011Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1011Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1011-SINGLES/nodes:NODES[1]/nodes:NODE[1]/@name", root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1011-SINGLES/nodes:NODES[1]/nodes:NODE[1]/nodes:EREFERENCE-CONTAINED-1011-SINGLES/nodes:SUB-NODES[1]/nodes:SUB-NODE[1]/@name",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1100Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1100Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1100Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1100-SINGLES/nodes:EREFERENCE-CONTAINED-1100-SINGLE[1]/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1100-SINGLES/nodes:EREFERENCE-CONTAINED-1100-SINGLE[1]/nodes:EREFERENCE-CONTAINED-1100-SINGLES/nodes:EREFERENCE-CONTAINED-1100-SINGLE[1]/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"nodes:SUB-NODE",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1100-SINGLES/nodes:EREFERENCE-CONTAINED-1100-SINGLE[1]/nodes:EREFERENCE-CONTAINED-1100-SINGLES/nodes:EREFERENCE-CONTAINED-1100-SINGLE[1]/@xsi:type",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1101Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1101Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1101-SINGLES/nodes:EREFERENCE-CONTAINED-1101-SINGLE[1]/nodes:NODE/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1101-SINGLES/nodes:EREFERENCE-CONTAINED-1101-SINGLE[1]/nodes:NODE/nodes:EREFERENCE-CONTAINED-1101-SINGLES/nodes:EREFERENCE-CONTAINED-1101-SINGLE[1]/nodes:SUB-NODE/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1101-SINGLES/nodes:EREFERENCE-CONTAINED-1101-SINGLE[1]/nodes:NODE/nodes:EREFERENCE-CONTAINED-1101-SINGLES/nodes:EREFERENCE-CONTAINED-1101-SINGLE[1]/nodes:SUB-NODE/@xsi:type",
							root, XPathConstants.STRING));
		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1110Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1110Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1110Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1110-SINGLES/nodes:EREFERENCE-CONTAINED-1110-SINGLE[1]/nodes:NODES/@name", root,
					XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1110-SINGLES/nodes:EREFERENCE-CONTAINED-1110-SINGLE[1]/nodes:NODES/nodes:EREFERENCE-CONTAINED-1110-SINGLES/nodes:EREFERENCE-CONTAINED-1110-SINGLE[1]/nodes:SUB-NODES/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1110-SINGLES/nodes:EREFERENCE-CONTAINED-1110-SINGLE[1]/nodes:NODES/nodes:EREFERENCE-CONTAINED-1110-SINGLES/nodes:EREFERENCE-CONTAINED-1110-SINGLE[1]/nodes:SUB-NODES/@xsi:type",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Contained1111Single() {
		try {
			String fileName = BASEDIR + "EReference_Contained1111Single.xml";
			Node rootNode = createNodeModel_ContainedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Contained1111Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("intermediateNode1", xpath.evaluate(
					"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1111-SINGLES/nodes:EREFERENCE-CONTAINED-1111-SINGLE[1]/nodes:NODES/nodes:NODE/@name",
					root, XPathConstants.STRING));
			assertEquals(
					"leafNode1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1111-SINGLES/nodes:EREFERENCE-CONTAINED-1111-SINGLE[1]/nodes:NODES/nodes:NODE/nodes:EREFERENCE-CONTAINED-1111-SINGLES/nodes:EREFERENCE-CONTAINED-1111-SINGLE[1]/nodes:SUB-NODES/nodes:SUB-NODE/@name",
							root, XPathConstants.STRING));
			assertEquals(
					"",
					xpath.evaluate(
							"/nodes:NODE/nodes:EREFERENCE-CONTAINED-1111-SINGLES/nodes:EREFERENCE-CONTAINED-1111-SINGLE[1]/nodes:NODES/nodes:NODE/nodes:EREFERENCE-CONTAINED-1111-SINGLES/nodes:EREFERENCE-CONTAINED-1111-SINGLE[1]/nodes:SUB-NODES/nodes:SUB-NODE/@xsi:type",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Referenced0100Single() {
		try {
			String fileName = BASEDIR + "EReference_Referenced0100Single.xml";
			Node rootNode = createNodeModel_ReferencedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Referenced0100Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("root", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-SINGLE-REF", root, XPathConstants.STRING));
		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Referenced0101Single() {
		try {
			String fileName = BASEDIR + "EReference_Referenced0101Single.xml";
			Node rootNode = createNodeModel_ReferencedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Referenced0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("root", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0101-SINGLE-REF/nodes:NODE", root, XPathConstants.STRING));
		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Referenced1001Single() {
		try {
			String fileName = BASEDIR + "EReference_Referenced1001Single.xml";
			Node rootNode = createNodeModel_ReferencedxxxxSingle(NodesPackage.eINSTANCE.getNode_EReference_Referenced1001Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("root", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-1001-SINGLE-REFS/nodes:NODE", root, XPathConstants.STRING));
		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Referenced0100Many() {
		try {
			String fileName = BASEDIR + "EReference_Referenced0100Many.xml";
			Node rootNode = createNodeModel_ReferencedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Referenced0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("node", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[1]", root, XPathConstants.STRING));
			assertEquals("", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[1]/@xsi:type", root, XPathConstants.STRING));
			assertEquals("subNode", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[2]", root, XPathConstants.STRING));
			assertEquals("SUB-NODE", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0100-MANY-REF[2]/@TYPE", root, XPathConstants.STRING));

		} catch (Exception ex) {
			ex.printStackTrace();
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Referenced0101Many() {
		try {
			String fileName = BASEDIR + "EReference_Referenced0101Many.xml";
			Node rootNode = createNodeModel_ReferencedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Referenced0101Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("node", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0101-MANY-REF/nodes:NODE[1]", root, XPathConstants.STRING));
			assertEquals("subNode",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-0101-MANY-REF/nodes:SUB-NODE[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEReference_Referenced1001Many() {
		try {
			String fileName = BASEDIR + "EReference_Referenced1001Many.xml";
			Node rootNode = createNodeModel_ReferencedxxxxMany(NodesPackage.eINSTANCE.getNode_EReference_Referenced1001Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("node", xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-1001-MANY-REFS/nodes:NODE[1]", root, XPathConstants.STRING));
			assertEquals("subNode",
					xpath.evaluate("/nodes:NODE/nodes:EREFERENCE-REFERENCED-1001-MANY-REFS/nodes:SUB-NODE[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testReqIF_EReference_Referenced0101Single() {
		try {
			String fileName = BASEDIR + "ReqIF_EReference_Referenced0101Single.xml";
			Node rootNode = createNodeModel_ReferencedxxxxSingle(NodesPackage.eINSTANCE.getNode_Reqif_eReference_Referenced0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("root",
					xpath.evaluate("/nodes:NODE/nodes:REQIF-EREFERENCE-REFERENCED-0101-SINGLE/nodes:NODE-REF", root, XPathConstants.STRING));
		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testReqIF_EReference_Referenced1001Many() {
		try {
			String fileName = BASEDIR + "ReqIF_EReference_Referenced1001Many.xml";
			Node rootNode = createNodeModel_ReferencedxxxxMany(NodesPackage.eINSTANCE.getNode_Reqif_eReference_Referenced1001Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("node",
					xpath.evaluate("/nodes:NODE/nodes:REQIF-EREFERENCE-REFERENCED-1001-MANIES/nodes:NODE-REF[1]", root, XPathConstants.STRING));
			assertEquals("subNode",
					xpath.evaluate("/nodes:NODE/nodes:REQIF-EREFERENCE-REFERENCED-1001-MANIES/nodes:SUB-NODE-REF[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0001Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0001Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0001Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/ecore:EString[1]", root, XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate("/nodes:NODE/ecore:EString[2]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0010Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0010Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0010Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1 value2", xpath.evaluate("/nodes:NODE/ecore:EStrings[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0011Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0011Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0011Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/ecore:EStrings[1]/ecore:EString[1]", root, XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate("/nodes:NODE/ecore:EStrings[1]/ecore:EString[2]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0100Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0100Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0100-MANY[1]", root, XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0100-MANY[2]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0101Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0101Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0101Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0101-MANY[1]/ecore:EString[1]", root, XPathConstants.STRING));
			assertEquals("value2",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0101-MANY[2]/ecore:EString[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0110Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0110Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0110Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1 value2",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0110-MANY[1]/ecore:EStrings[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0111Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0111Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0111Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0111-MANY[1]/ecore:EStrings[1]/ecore:EString[1]", root,
					XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0111-MANY[1]/ecore:EStrings[1]/ecore:EString[2]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1000Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1000Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1000Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1 value2", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1000-MANIES[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	public void testEAttribute_Attribute1001Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1001Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1001Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1001-MANIES[1]/ecore:EString[1]", root, XPathConstants.STRING));
			assertEquals("value2",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1001-MANIES[1]/ecore:EString[2]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1010Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1010Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1010Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1 value2",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1010-MANIES[1]/ecore:EStrings[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1011Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1011Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1011Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1011-MANIES[1]/ecore:EStrings[1]/ecore:EString[1]", root,
					XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1011-MANIES[1]/ecore:EStrings[1]/ecore:EString[2]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1100Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1100Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1100-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1100-MANY[1]",
					root, XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1100-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1100-MANY[2]",
					root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1101Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1101Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1101Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate(
					"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1101-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1101-MANY[1]/ecore:EString[1]", root,
					XPathConstants.STRING));
			assertEquals("value2", xpath.evaluate(
					"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1101-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1101-MANY[2]/ecore:EString[1]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1110Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1110Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1110Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1 value2", xpath.evaluate(
					"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1110-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1110-MANY[1]/ecore:EStrings[1]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1111Many() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1111Many.xml";
			Node rootNode = createNodeModel_AttributexxxxMany(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1111Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals(
					"value1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1111-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1111-MANY[1]/ecore:EStrings[1]/ecore:EString[1]",
							root, XPathConstants.STRING));
			assertEquals(
					"value2",
					xpath.evaluate(
							"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1111-MANIES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1111-MANY[1]/ecore:EStrings[1]/ecore:EString[2]",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			ex.printStackTrace();
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0001Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0001Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0001Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/ecore:EString[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0010Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0010Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0010Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/ecore:EStrings[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0011Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0011Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0011Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/ecore:EStrings[1]/ecore:EString[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0100Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0100Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0100Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0100-SINGLE[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0101Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0101Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0101-SINGLE[1]/ecore:EString[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0110Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0110Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0110Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0110-SINGLE[1]/ecore:EStrings[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute0111Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute0111Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute0111Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-0111-SINGLE[1]/ecore:EStrings[1]/ecore:EString[1]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1000Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1000Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1000Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1000-SINGLES[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	public void testEAttribute_Attribute1001Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1001Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1001Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1001-SINGLES[1]/ecore:EString[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1010Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1010Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1010Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1",
					xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1010-SINGLES[1]/ecore:EStrings[1]", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1011Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1011Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1011Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1011-SINGLES[1]/ecore:EStrings[1]/ecore:EString[1]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1100Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1100Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1100Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate("/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1100-SINGLES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1100-SINGLE[1]",
					root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1101Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1101Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1101Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate(
					"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1101-SINGLES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1101-SINGLE[1]/ecore:EString[1]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1110Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1110Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1110Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("value1", xpath.evaluate(
					"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1110-SINGLES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1110-SINGLE[1]/ecore:EStrings[1]", root,
					XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testEAttribute_Attribute1111Single() {
		try {
			String fileName = BASEDIR + "EAttribute_Attribute1111Single.xml";
			Node rootNode = createNodeModel_AttributexxxxSingle(NodesPackage.eINSTANCE.getNode_EAttribute_Attribute1111Single());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals(
					"value1",
					xpath.evaluate(
							"/nodes:NODE/nodes:EATTRIBUTE-ATTRIBUTE-1111-SINGLES[1]/nodes:EATTRIBUTE-ATTRIBUTE-1111-SINGLE[1]/ecore:EStrings[1]/ecore:EString[1]",
							root, XPathConstants.STRING));

		} catch (Exception ex) {
			ex.printStackTrace();
			assertTrue(ex.getMessage(), false);
		}
	}

	@Test
	public void testFeatureContainmentReferenceWithTypeEObjectAndSerialization0100Many() {
		try {
			String fileName = BASEDIR + "FeatureContainmentReferenceWithTypeEObjectAndSerialization0100ManyMany.xml";
			Node rootNode = createNodeModelWithForeignSubmodel_ContainedxxxxMany(NodesPackage.eINSTANCE
					.getNode_EReference_WithTypeEObject_Contained0100Many());
			org.w3c.dom.Node root = getXMLRootNode(fileName, rootNode);

			assertEquals("EPackage1",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[1]/@name", root, XPathConstants.STRING));
			assertEquals("EClass11", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[1]/eClassifiers[1]/@name", root, XPathConstants.STRING));
			assertEquals("EClass12", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[1]/eClassifiers[2]/@name", root, XPathConstants.STRING));

			assertEquals("EPackage2",
					xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[2]/@name", root, XPathConstants.STRING));
			assertEquals("EClass21", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[2]/eClassifiers[1]/@name", root, XPathConstants.STRING));
			assertEquals("EClass22", xpath.evaluate(
					"/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[2]/eClassifiers[2]/@name", root, XPathConstants.STRING));

		} catch (Exception ex) {
			assertTrue(ex.getMessage(), false);
		}
	}

	@SuppressWarnings("unchecked")
	protected Node createNodeModel_ContainedxxxxMany(EStructuralFeature topLevelfeature, EStructuralFeature subfeature) {
		assert null != subfeature;
		assert subfeature.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();
		rootNode.setName("root");

		Node intermediateNode1 = NodesFactory.eINSTANCE.createNode();
		intermediateNode1.setName("intermediateNode1");

		Node intermediateNode2 = NodesFactory.eINSTANCE.createNode();
		intermediateNode2.setName("intermediateNode2");

		Node intermediateSubNode3 = NodesFactory.eINSTANCE.createSubNode();
		intermediateSubNode3.setName("intermediateSubNode3");

		Node intermediateSubNode4 = NodesFactory.eINSTANCE.createSubNode();
		intermediateSubNode4.setName("intermediateSubNode4");

		Node leafNode11 = NodesFactory.eINSTANCE.createNode();
		leafNode11.setName("leafNode11");

		Node leafNode12 = NodesFactory.eINSTANCE.createNode();
		leafNode12.setName("leafNode12");

		Node leafNode21 = NodesFactory.eINSTANCE.createNode();
		leafNode21.setName("leafNode21");

		Node leafNode22 = NodesFactory.eINSTANCE.createNode();
		leafNode22.setName("leafNode22");

		Node leafNode31 = NodesFactory.eINSTANCE.createNode();
		leafNode31.setName("leafNode31");

		Node leafNode32 = NodesFactory.eINSTANCE.createNode();
		leafNode32.setName("leafNode32");

		Node leafNode41 = NodesFactory.eINSTANCE.createNode();
		leafNode41.setName("leafNode41");

		Node leafNode42 = NodesFactory.eINSTANCE.createNode();
		leafNode42.setName("leafNode42");

		((EList<Object>) intermediateNode1.eGet(subfeature)).add(leafNode11);
		((EList<Object>) intermediateNode1.eGet(subfeature)).add(leafNode12);
		((EList<Object>) intermediateNode2.eGet(subfeature)).add(leafNode21);
		((EList<Object>) intermediateNode2.eGet(subfeature)).add(leafNode22);
		((EList<Object>) intermediateSubNode3.eGet(subfeature)).add(leafNode31);
		((EList<Object>) intermediateSubNode3.eGet(subfeature)).add(leafNode32);
		((EList<Object>) intermediateSubNode4.eGet(subfeature)).add(leafNode41);
		((EList<Object>) intermediateSubNode4.eGet(subfeature)).add(leafNode42);

		((EList<Object>) rootNode.eGet(topLevelfeature)).add(intermediateNode1);
		((EList<Object>) rootNode.eGet(topLevelfeature)).add(intermediateNode2);
		((EList<Object>) rootNode.eGet(topLevelfeature)).add(intermediateSubNode3);
		((EList<Object>) rootNode.eGet(topLevelfeature)).add(intermediateSubNode4);

		return rootNode;
	}

	protected Node createNodeModel_ContainedxxxxSingle(EStructuralFeature feature) {
		return createNodeModel_ContainedxxxxSingle(feature, feature);
	}

	protected Node createNodeModel_ContainedxxxxSingle(EStructuralFeature topLevelfeature, EStructuralFeature subFeature) {
		assert !topLevelfeature.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();
		rootNode.setName("root");

		Node intermediateNode1 = NodesFactory.eINSTANCE.createNode();
		intermediateNode1.setName("intermediateNode1");

		SubNode leafNode1 = NodesFactory.eINSTANCE.createSubNode();
		leafNode1.setName("leafNode1");

		intermediateNode1.eSet(subFeature, leafNode1);
		rootNode.eSet(topLevelfeature, intermediateNode1);

		return rootNode;
	}

	protected Node createNodeModel_ReferencedxxxxSingle(EReference reference) {
		assert !reference.isContainment();
		assert !reference.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();
		rootNode.setName("root");

		rootNode.eSet(reference, rootNode);

		return rootNode;
	}

	@SuppressWarnings("unchecked")
	protected Node createNodeModel_ReferencedxxxxMany(EReference reference) {
		assert !reference.isContainment();
		assert reference.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();
		rootNode.setName("root");

		Node node = NodesFactory.eINSTANCE.createNode();
		node.setName("node");

		SubNode subNode = NodesFactory.eINSTANCE.createSubNode();
		subNode.setName("subNode");

		EList<EObject> containedValues = (EList<EObject>) rootNode.eGet(NodesPackage.eINSTANCE.getNode_EReference_Contained0100Many());
		containedValues.add(node);
		containedValues.add(subNode);

		EList<EObject> referencedNodes = (EList<EObject>) rootNode.eGet(reference);
		referencedNodes.add(node);
		referencedNodes.add(subNode);

		return rootNode;
	}

	protected Node createNodeModel(EStructuralFeature feature) {
		return createNodeModel_ContainedxxxxMany(feature, feature);
	}

	@SuppressWarnings("unchecked")
	protected Node createNodeModelWithForeignSubmodel_ContainedxxxxMany(EStructuralFeature feature) {
		assert null != feature;
		assert feature.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();

		EPackage ePackage1 = EcoreFactory.eINSTANCE.createEPackage();
		ePackage1.setName("EPackage1");

		EPackage ePackage2 = EcoreFactory.eINSTANCE.createEPackage();
		ePackage2.setName("EPackage2");

		EClass eClass11 = EcoreFactory.eINSTANCE.createEClass();
		eClass11.setName("EClass11");

		EClass eClass12 = EcoreFactory.eINSTANCE.createEClass();
		eClass12.setName("EClass12");

		EClass eClass21 = EcoreFactory.eINSTANCE.createEClass();
		eClass21.setName("EClass21");

		EClass eClass22 = EcoreFactory.eINSTANCE.createEClass();
		eClass22.setName("EClass22");

		ePackage1.getEClassifiers().add(eClass11);
		ePackage1.getEClassifiers().add(eClass12);
		ePackage2.getEClassifiers().add(eClass21);
		ePackage2.getEClassifiers().add(eClass22);

		((EList<Object>) rootNode.eGet(feature)).add(ePackage1);
		((EList<Object>) rootNode.eGet(feature)).add(ePackage2);

		return rootNode;
	}

	@SuppressWarnings("unchecked")
	protected Node createNodeModel_AttributexxxxMany(EAttribute feature) {
		assert null != feature;
		assert feature.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();
		EList<Object> values = (EList<Object>) rootNode.eGet(feature);
		values.add("value1");
		values.add("value2");

		return rootNode;
	}

	protected Node createNodeModel_AttributexxxxSingle(EAttribute feature) {
		assert null != feature;
		assert !feature.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();
		rootNode.eSet(feature, "value1");
		return rootNode;
	}

	protected void validateOutput(String xpathExpression, String output, String expectedResult, QName resultType) throws XPathExpressionException {
		Object result = xpath.evaluate(xpathExpression, new InputSource(new StringReader(output)), resultType);
		assertEquals(expectedResult, result);

	}

}
