/**
 * <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.env.emf;

import static org.junit.Assert.assertTrue;

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

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.XMLSave;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.URIHandlerImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
import org.eclipse.emf.ecore.xml.namespace.XMLNamespacePackage;
import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.CORECONTENTType;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.DocumentRoot;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.MyreqifFactory;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.MyreqifPackage;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.REQIF;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.REQIFCONTENT;
import org.eclipse.sphinx.tests.emf.serialization.env.emf.myreqif.util.MyreqifResourceFactoryImpl;
import org.eclipse.sphinx.tests.emf.serialization.util.AbstractTestCase;
import org.junit.Test;

@SuppressWarnings("nls")
public class EMFSerializationTests extends AbstractTestCase {
	public static final String RELATIVE_WORK_DIR = "org.eclipse.sphinx.tests.emf.serialization.env.emf/EMFSerializationTests/";

	class EmptyPrefixResourceFactoryImpl extends EcoreResourceFactoryImpl {
		@Override
		public Resource createResource(URI uri) {
			XMLResource result = new XMIResourceImpl(uri) {
				@Override
				protected boolean useIDs() {

					return eObjectToIDMap != null || idToEObjectMap != null;
				}

				@Override
				protected XMLSave createXMLSave(Map<?, ?> options) {
					return new XMLSaveImpl(createXMLHelper()) {
						@Override
						protected void init(XMLResource resource, Map<?, ?> options) {
							super.init(resource, options);
							helper.getPrefixToNamespaceMap().put("", EcorePackage.eNS_URI);
						}
					};
				}
			};
			result.setEncoding("UTF-8");
			result.getDefaultSaveOptions().put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
			result.getDefaultSaveOptions().put(XMLResource.OPTION_LINE_WIDTH, 80);
			result.getDefaultSaveOptions().put(XMLResource.OPTION_URI_HANDLER, new URIHandlerImpl.PlatformSchemeAware());
			return result;
		}
	}

	@Test
	public void testReqIFLangSerialization() throws Exception {
		String fileName = RELATIVE_WORK_DIR + "testReqIFLangSerialization.xml"; //$NON-NLS-1$

		// create model
		DocumentRoot documentRoot = MyreqifFactory.eINSTANCE.createDocumentRoot();
		REQIF reqif = MyreqifFactory.eINSTANCE.createREQIF();
		CORECONTENTType coreContent = MyreqifFactory.eINSTANCE.createCORECONTENTType();
		REQIFCONTENT reqifContent = MyreqifFactory.eINSTANCE.createREQIFCONTENT();

		documentRoot.setREQIF(reqif);
		reqif.setCORECONTENT(coreContent);
		coreContent.setREQIFCONTENT(reqifContent);

		reqif.setLang("en");

		// save model
		EPackage.Registry.INSTANCE.put(XMLTypePackage.eNS_URI, XMLTypePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(XMLNamespacePackage.eNS_URI, XMLNamespacePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(MyreqifPackage.eNS_URI, MyreqifPackage.eINSTANCE);
		HashMap<String, Object> options = new HashMap<String, Object>();
		// extended metadata required in order to properly write the xml: prefix before the attribute
		options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
		saveWorkingFile(fileName, documentRoot, new MyreqifResourceFactoryImpl(), options);

		// validate
		String resourceAsString = loadWorkingFileAsString(fileName);
		assertTrue(resourceAsString.contains("xml:lang=\"en\""));
	}

	@Test
	public void testEcodingSerialization() throws Exception {
		String fileName = RELATIVE_WORK_DIR + "testEcodingSerialization.xml"; //$NON-NLS-1$

		// create model
		DocumentRoot documentRoot = MyreqifFactory.eINSTANCE.createDocumentRoot();
		REQIF reqif = MyreqifFactory.eINSTANCE.createREQIF();
		CORECONTENTType coreContent = MyreqifFactory.eINSTANCE.createCORECONTENTType();
		REQIFCONTENT reqifContent = MyreqifFactory.eINSTANCE.createREQIFCONTENT();

		documentRoot.setREQIF(reqif);
		reqif.setCORECONTENT(coreContent);
		coreContent.setREQIFCONTENT(reqifContent);

		// save model
		EPackage.Registry.INSTANCE.put(XMLTypePackage.eNS_URI, XMLTypePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(XMLNamespacePackage.eNS_URI, XMLNamespacePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(MyreqifPackage.eNS_URI, MyreqifPackage.eINSTANCE);

		HashMap<String, Object> options = new HashMap<String, Object>();
		options.put(XMLResource.OPTION_ENCODING, "UTF-8");
		saveWorkingFile(fileName, documentRoot, new MyreqifResourceFactoryImpl(), options);

		// validate
		String resourceAsString = loadWorkingFileAsString(fileName);
		assertTrue(resourceAsString.contains("encoding=\"UTF-8\""));
	}

	@Test
	public void testDefaultNamespacePrefixSerialization() throws Exception {
		String fileName = RELATIVE_WORK_DIR + "testDefaultNamespacePrefixSerialization.xml"; //$NON-NLS-1$

		// create model
		DocumentRoot documentRoot = MyreqifFactory.eINSTANCE.createDocumentRoot();
		REQIF reqif = MyreqifFactory.eINSTANCE.createREQIF();
		CORECONTENTType coreContent = MyreqifFactory.eINSTANCE.createCORECONTENTType();
		REQIFCONTENT reqifContent = MyreqifFactory.eINSTANCE.createREQIFCONTENT();

		documentRoot.setREQIF(reqif);
		reqif.setCORECONTENT(coreContent);
		coreContent.setREQIFCONTENT(reqifContent);

		// save model
		EPackage.Registry.INSTANCE.put(XMLTypePackage.eNS_URI, XMLTypePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(XMLNamespacePackage.eNS_URI, XMLNamespacePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(MyreqifPackage.eNS_URI, MyreqifPackage.eINSTANCE);

		saveWorkingFile(fileName, documentRoot, new MyreqifResourceFactoryImpl(), null);

		// validate
		String resourceAsString = loadWorkingFileAsString(fileName);
		assertTrue(resourceAsString.contains("<myreqif:REQ-IF "));
		assertTrue(resourceAsString.contains("<myreqif:CORE-CONTENT>"));
		assertTrue(resourceAsString.contains("<myreqif:REQ-IF-CONTENT/>"));
	}

	@Test
	public void testCustomNamespacePrefixSerialization() throws Exception {
		String fileName = RELATIVE_WORK_DIR + "testCustomNamespacePrefixSerialization.xml"; //$NON-NLS-1$

		// create model
		DocumentRoot documentRoot = MyreqifFactory.eINSTANCE.createDocumentRoot();
		documentRoot.getXMLNSPrefixMap().put("", MyreqifPackage.eNS_URI);
		REQIF reqif = MyreqifFactory.eINSTANCE.createREQIF();
		CORECONTENTType coreContent = MyreqifFactory.eINSTANCE.createCORECONTENTType();
		REQIFCONTENT reqifContent = MyreqifFactory.eINSTANCE.createREQIFCONTENT();

		documentRoot.setREQIF(reqif);
		reqif.setCORECONTENT(coreContent);
		coreContent.setREQIFCONTENT(reqifContent);

		// save model
		EPackage.Registry.INSTANCE.put(XMLTypePackage.eNS_URI, XMLTypePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(XMLNamespacePackage.eNS_URI, XMLNamespacePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(MyreqifPackage.eNS_URI, MyreqifPackage.eINSTANCE);

		saveWorkingFile(fileName, documentRoot, new MyreqifResourceFactoryImpl(), null);

		// validate
		String resourceAsString = loadWorkingFileAsString(fileName);
		assertTrue(resourceAsString.contains("<REQ-IF "));
	}

	@Test
	public void testDefaultNamespacePrefixWithoutDocumentRootSerialization_noMetadata() throws Exception {
		String fileName = RELATIVE_WORK_DIR + "testDefaultNamespacePrefixWithoutDocumentRootSerialization.xml"; //$NON-NLS-1$

		// create model
		EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
		EClass eClass = EcoreFactory.eINSTANCE.createEClass();
		ePackage.getEClassifiers().add(eClass);
		ePackage.setName("the Package");

		// save model
		EPackage.Registry.INSTANCE.put(XMLTypePackage.eNS_URI, XMLTypePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(XMLNamespacePackage.eNS_URI, XMLNamespacePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(MyreqifPackage.eNS_URI, MyreqifPackage.eINSTANCE);

		HashMap<String, Object> options = new HashMap<String, Object>();
		options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
		saveWorkingFile(fileName, ePackage, new EcoreResourceFactoryImpl(), options);

		// validate
		String resourceAsString = loadWorkingFileAsString(fileName);
		// check qualified XML elements
		assertTrue(resourceAsString.contains("<ecore:EPackage "));
		assertTrue(resourceAsString.contains("<eClassifiers "));
		// check unqualified XML attributes
		assertTrue(resourceAsString.contains(" name=\""));
	}

	@Test
	public void testCustomNamespacePrefixWithoutDocumentRootSerialization() throws Exception {
		String fileName = RELATIVE_WORK_DIR + "testCustomNamespacePrefixWithoutDocumentRootSerialization.xml"; //$NON-NLS-1$

		// create model
		EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
		EClass eClass = EcoreFactory.eINSTANCE.createEClass();
		ePackage.getEClassifiers().add(eClass);

		// save model
		EPackage.Registry.INSTANCE.put(XMLTypePackage.eNS_URI, XMLTypePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(XMLNamespacePackage.eNS_URI, XMLNamespacePackage.eINSTANCE);
		EPackage.Registry.INSTANCE.put(MyreqifPackage.eNS_URI, MyreqifPackage.eINSTANCE);

		saveWorkingFile(fileName, ePackage, new EmptyPrefixResourceFactoryImpl(), null);

		// validate
		String resourceAsString = loadWorkingFileAsString(fileName);
		assertTrue(resourceAsString.contains("<EPackage "));
	}

}
