/**
 * <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.assertSame;
import static org.junit.Assert.assertTrue;

import java.util.HashMap;
import java.util.Map;

import javax.xml.xpath.XPathConstants;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.EMap;
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.emf.ecore.util.BasicExtendedMetaData;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.emf.ecore.xml.type.AnyType;
import org.eclipse.emf.ecore.xml.type.XMLTypeFactory;
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.junit.Test;
import org.w3c.dom.NodeList;

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

	@Test
	public void testEReference_WithTypeEObject_Contained0100Many_KnownNamespace_XMLResource() {
		try {
			String fileName = BASEDIR + "eReference_WithTypeEObject_Contained0100Many_KnownNamespace_XMLResource.xml";
			Node rootNode = createNodeModelWithForeignSubmodel_ContainedxxxxMany(NodesPackage.eINSTANCE
					.getNode_EReference_WithTypeEObject_Contained0100Many());
			Map<String, Object> options = new HashMap<String, Object>();
			options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
			saveWorkingFile(fileName, rootNode, new XMLResourceFactoryImpl(), options);
		} catch (Exception ex) {
			ex.printStackTrace();
			assertTrue(ex.getMessage(), false);
		}
	}

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

			// check for empty element on toplevel
			assertSame(0, ((NodeList) xpath.evaluate("/nodes:NODE[not(node())]", root, XPathConstants.NODESET)).getLength());

			// check for empty element on feature level
			assertSame(2, ((NodeList) xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI", root,
					XPathConstants.NODESET)).getLength());

			assertSame(2, ((NodeList) xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[1]/eClassifiers",
					root, XPathConstants.NODESET)).getLength());
			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));

			assertSame(2, ((NodeList) xpath.evaluate("/nodes:NODE/nodes:FEATURE-WITH-TYPE-EOBJECT-AND-SERIALIZATION-0100-MULTI[2]/eClassifiers",
					root, XPathConstants.NODESET)).getLength());
			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) {
			ex.printStackTrace();
			assertTrue(ex.getMessage(), false);
		}
	}

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

			// check for empty element on toplevel
			assertSame(0, ((NodeList) xpath.evaluate("/nodes:NODE[not(node())]", root, XPathConstants.NODESET)).getLength());

			// check for empty element on feature level
			assertSame(2, ((NodeList) xpath.evaluate("/nodes:NODE/ecore:EPackage", root, XPathConstants.NODESET)).getLength());

			assertSame(2, ((NodeList) xpath.evaluate("/nodes:NODE/ecore:EPackage[1]/eClassifiers", root, XPathConstants.NODESET)).getLength());
			assertEquals("EClass11", xpath.evaluate("/nodes:NODE/ecore:EPackage/eClassifiers[1]/@name", root, XPathConstants.STRING));
			assertEquals("EClass12", xpath.evaluate("/nodes:NODE/ecore:EPackage[1]/eClassifiers[2]/@name", root, XPathConstants.STRING));

			assertSame(2, ((NodeList) xpath.evaluate("/nodes:NODE/ecore:EPackage[2]/eClassifiers", root, XPathConstants.NODESET)).getLength());
			assertEquals("EClass21", xpath.evaluate("/nodes:NODE/ecore:EPackage[2]/eClassifiers[1]/@name", root, XPathConstants.STRING));
			assertEquals("EClass22", xpath.evaluate("/nodes:NODE/ecore:EPackage[2]/eClassifiers[2]/@name", root, XPathConstants.STRING));

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

	@Test
	public void testEReference_WithTypeEObject_Contained0100Many_UnknownNamespace() {
		try {
			String fileName = BASEDIR + "eReference_WithTypeEObject_Contained0100Many_UnknownNamespace.xml";
			Node rootNode = createNodeModelWithUnknownSubmodel_ContainedxxxxMany(NodesPackage.eINSTANCE
					.getNode_EReference_WithTypeEObject_Contained0100Many());
			getXMLRootNode(fileName, rootNode);
		} catch (Exception ex) {
			ex.printStackTrace();
			assertTrue(ex.getMessage(), false);
		}
	}

	/*
	 * @Test public void testEReference_WithTypeEObject_Contained0001Many_UnknownNamespace() { try { String fileName =
	 * BASEDIR + "eReference_WithTypeEObject_Contained0001Many_UnknownNamespace.xml"; Node rootNode =
	 * createNodeModelWithUnknownSubmodel_ContainedxxxxMany(NodesPackage.eINSTANCE
	 * .getNode_EReference_WithTypeEObject_Contained0001Many()); org.w3c.dom.Node root = getXMLRootNode(fileName,
	 * rootNode); } catch (Exception ex) { ex.printStackTrace(); assertTrue(ex.getMessage(), false); } }
	 */

	@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");

		EReference eReference11 = EcoreFactory.eINSTANCE.createEReference();
		eReference11.setName("myEClass22");
		eReference11.setEType(eClass22);
		eClass11.getEStructuralFeatures().add(eReference11);

		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 createNodeModelWithUnknownSubmodel_ContainedxxxxMany(EStructuralFeature feature) {
		assert null != feature;
		assert feature.isMany();
		Node rootNode = NodesFactory.eINSTANCE.createNode();

		String NAMESPACE_URI = "myAnyNamespaceURI";
		String NAMESPACE_PREFIX = "myPrefix";
		BasicExtendedMetaData extendedMetaData = new BasicExtendedMetaData();
		EStructuralFeature rootNodeFeature = extendedMetaData.demandFeature(NAMESPACE_URI, "rootNode", true);
		EClass documentRootClass = rootNodeFeature.getEContainingClass();
		EObject documentRoot = EcoreUtil.create(documentRootClass);
		EMap<String, String> xmlnsPrefixMap = (EMap<String, String>) documentRoot.eGet(extendedMetaData.getXMLNSPrefixMapFeature(documentRootClass));
		xmlnsPrefixMap.put(NAMESPACE_PREFIX, NAMESPACE_URI);

		AnyType rootTreeNode = XMLTypeFactory.eINSTANCE.createAnyType();
		documentRoot.eSet(rootNodeFeature, rootTreeNode);

		EStructuralFeature labelAttribute = extendedMetaData.demandFeature(null, "label", false);
		rootTreeNode.eSet(labelAttribute, "root");

		EStructuralFeature subNodeFeature = extendedMetaData.demandFeature(null, "subNode", true);
		subNodeFeature.setUpperBound(1);
		AnyType subNode = XMLTypeFactory.eINSTANCE.createAnyType();
		rootTreeNode.eSet(subNodeFeature, subNode);

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

		return rootNode;
	}
}
