/*****************************************************************************
 * Copyright (c) 2018 CEA and others.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *  Benoit Maggi (CEA LIST) benoit.maggi@cea.fr - Initial API and implementation
 *   
 *****************************************************************************/

package org.eclipse.papyrus.iotml.architecture.tests.resources;

import java.lang.reflect.Method;

import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.papyrus.infra.types.core.registries.ElementTypeSetConfigurationRegistry;
import org.eclipse.papyrus.iotml.architecture.Activator;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * Test the architecture model : - validate the model
 * 
 */
@SuppressWarnings("nls")
public class ArchitectureValidationTest {

	public static final String ARCHITECTURE_PATH = Activator.PLUGIN_ID+"/resources/iotml.architecture";

	@BeforeClass
	public static void loadElementTypeSet() {
		ElementTypeSetConfigurationRegistry.getInstance();
	}

	/**
	 * Check that if an element has a field id then xmi:id should be the same
	 */
	@Test
	public void checkXMIIds() {
		URI createPlatformPluginURI = URI.createPlatformPluginURI(ARCHITECTURE_PATH, true);
		ResourceSetImpl resourceSetImpl = new ResourceSetImpl();
		Resource resource = resourceSetImpl.getResource(createPlatformPluginURI, true);

		TreeIterator<EObject> allContents = resource.getAllContents();
		while (allContents.hasNext()) {
			EObject eObject = (EObject) allContents.next();

			String id = getId(eObject);
			String xmiId = ((XMIResource) resource).getID(eObject);
			if (id != null) {
				Assert.assertEquals("Xmi id and id field should be the same", id, xmiId);
			}
		}
	}

	// SMALL hack to get id if present
	public static String getId(Object obj) {
		try {
			Method method = obj.getClass().getMethod("getId");
			if (method != null) {
				return method.invoke(obj).toString();
			}
		} catch (Exception e) {
			// doesn't matter
		}
		return null;
	}

}
