/*****************************************************************************
 * Copyright (c) 2013, 2017 CEA LIST and others.
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *   CEA LIST - Initial API and implementation
 *   Christian W. Damus (CEA) - bug 422257
 *   
 *****************************************************************************/
package org.eclipse.papyrus.cdo.internal.core.tests;

import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.net.URL;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EContentsEList.FeatureListIterator;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.papyrus.cdo.internal.core.CDOUtils;
import org.eclipse.papyrus.junit.utils.rules.HouseKeeper;
import org.junit.Rule;
import org.junit.Test;


/**
 * Selected unit tests for the {@link CDOUtils} class.
 */
public class CDOUtilsTest {

	@Rule
	public final HouseKeeper houseKeeper = new HouseKeeper();

	public CDOUtilsTest() {
		super();
	}

	@Test
	public void testIteratorScalarAttribute() throws Exception {
		FeatureListIterator<String> sIter = CDOUtils.iterator(EcorePackage.Literals.ECLASS, EcorePackage.Literals.ENAMED_ELEMENT__NAME, false);

		assertThat(sIter.hasNext(), is(true));
		assertThat(sIter.nextIndex(), is(-1));
		assertThat(sIter.next(), is(EcorePackage.Literals.ECLASS.getName()));

		assertThat(sIter.hasPrevious(), is(true));
		assertThat(sIter.previousIndex(), is(-1));
		assertThat(sIter.previous(), is(EcorePackage.Literals.ECLASS.getName()));
	}

	@Test
	public void testIteratorEmptyReference() throws Exception {
		FeatureListIterator<String> sIter = CDOUtils.iterator(EcorePackage.eINSTANCE, EcorePackage.Literals.EPACKAGE__ESUPER_PACKAGE, false);

		assertThat(sIter.hasNext(), is(false));
		assertThat(sIter.nextIndex(), is(-1));
		assertThat(sIter.hasPrevious(), is(false));
	}

	@Test
	public void testIteratorReferenceResolving() throws Exception {
		ResourceSet rset = houseKeeper.createResourceSet();
		Resource a = rset.getResource(getTestResourceURI("A.ecore"), true);

		EClass a1 = (EClass)((EPackage)a.getContents().get(0)).getEClassifier("A1");
		FeatureListIterator<EClass> sIter = CDOUtils.iterator(a1, EcorePackage.Literals.ECLASS__ESUPER_TYPES, true);

		assertThat(sIter.hasNext(), is(true));
		assertThat(sIter.nextIndex(), is(0));
		assertThat(sIter.next().getName(), is("B1"));

		assertThat(sIter.hasNext(), is(true));
		assertThat(sIter.nextIndex(), is(1));
		assertThat(sIter.next().getName(), is("B2"));

		assertThat(sIter.hasNext(), is(false));
		assertThat(sIter.nextIndex(), is(2));

		assertThat(sIter.hasPrevious(), is(true));
		assertThat(sIter.previousIndex(), is(1));
		assertThat(sIter.previous().getName(), is("B2"));

		assertThat(sIter.hasPrevious(), is(true));
		assertThat(sIter.previousIndex(), is(0));
		assertThat(sIter.previous().getName(), is("B1"));

		assertThat(sIter.hasPrevious(), is(false));
	}

	@Test
	public void testIteratorReferenceNonResolving() throws Exception {
		ResourceSet rset = houseKeeper.createResourceSet();

		Resource a = rset.getResource(getTestResourceURI("A.ecore"), true);

		EClass a1 = (EClass)((EPackage)a.getContents().get(0)).getEClassifier("A1");
		FeatureListIterator<EClass> sIter = CDOUtils.iterator(a1, EcorePackage.Literals.ECLASS__ESUPER_TYPES, false);

		assertThat(sIter.hasNext(), is(true));
		assertThat(sIter.nextIndex(), is(0));
		EClass next = sIter.next();
		assertThat(next.eIsProxy(), is(true));
		assertThat(EcoreUtil.getURI(next).fragment(), containsString("B1"));

		assertThat(sIter.hasNext(), is(true));
		next = sIter.next();
		assertThat(next.eIsProxy(), is(true));
		assertThat(EcoreUtil.getURI(next).fragment(), containsString("B2"));

		assertThat(sIter.hasNext(), is(false));
		assertThat(sIter.nextIndex(), is(2));

		assertThat(sIter.hasPrevious(), is(true));
		assertThat(sIter.previousIndex(), is(1));
		EClass previous = sIter.previous();
		assertThat(previous.eIsProxy(), is(true));
		assertThat(EcoreUtil.getURI(previous).fragment(), containsString("B2"));

		assertThat(sIter.hasPrevious(), is(true));
		assertThat(sIter.previousIndex(), is(0));
		previous = sIter.previous();
		assertThat(previous.eIsProxy(), is(true));
		assertThat(EcoreUtil.getURI(previous).fragment(), containsString("B1"));

		assertThat(sIter.hasPrevious(), is(false));
	}

	//
	// Test framework
	//

	URI getTestResourceURI(String name) {
		URL result = getClass().getClassLoader().getResource("resources/xmi/" + name);
		return URI.createURI(result.toExternalForm(), true);
	}
}
