/*******************************************************************************
 * Copyright (c) 2013 RCP Vision (http://www.rcp-vision.com) 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:
 * Lorenzo Bettini - Initial contribution and API
 *******************************************************************************/
package org.eclipse.emf.parsley.tests

import java.util.List
import org.eclipse.emf.parsley.examples.library.EXTLibraryPackage
import org.eclipse.emf.parsley.junit4.AbstractEmfParsleyTest
import org.eclipse.emf.parsley.tests.util.EmfParsleyFixturesAndUtilitiesTestRule
import org.eclipse.emf.parsley.util.EcoreUtil2
import org.junit.Rule
import org.junit.Test

import static extension org.junit.Assert.*
import org.eclipse.jface.viewers.ILabelProvider
import org.eclipse.emf.parsley.tests.models.testmodels.ClassWithName

class EcoreUtil2Test extends AbstractEmfParsleyTest {

	@Rule public extension EmfParsleyFixturesAndUtilitiesTestRule fixtures = new EmfParsleyFixturesAndUtilitiesTestRule()

	new() {
		// just to cover the protected constructor
		new EcoreUtil2() {
			
		}
	}

	@Test def void testCopyStateNull() {
		EcoreUtil2.copyState(null) => [
			assertEquals(0, size)
		]
	}

	@Test def void testCloneDoesNotCopyBidirectional() {
		writer.books.size.assertEquals(1)
		val copy = EcoreUtil2.clone(writer)
		copy.books.size.assertEquals(0)
	}

	@Test def void testManualESet() {
		val books = writer.booksByReflection
		books.size.assertEquals(1)
		val copy = EcoreUtil2.clone(writer)
		copy.addBooksByReflection(books)
		writer.books.size.assertEquals(0)
		copy.books.size.assertEquals(1)
		// manual eSet preserves bidirectionality
		book.author.assertSame(copy)
	}

	@Test def void testCopyState() {
		val state = EcoreUtil2.copyState(writer)

		writer.books.clear
		writer.assertBooks(0)
		book.author.assertNull

		// this brings the book back to the author
		state.copyStateTo(writer)
		writer.assertBooks(1)
		book.author.assertSame(writer)
	}

	@Test def void testReadOnlyCase() {
		1.assertEquals(library.books.size)
		val state = EcoreUtil2.copyState(library)
		state.get(EXTLibraryPackage.eINSTANCE.library_Books).assertNull
	}

	@Test def void testDerivedCase() {
		classForControlsInstance.derivedStringFeature = "test"
		val state = EcoreUtil2.copyState(classForControlsInstance)
		state.get(testPackage.classForControls_DerivedStringFeature).assertNull
	}

	@Test def void testFeatureMapCase() {
		1.assertEquals(library.people.size)
		val state = EcoreUtil2.copyState(library)
		state.copyStateTo(library)
		1.assertEquals(library.people.size)
		1.assertEquals(library.writers.size)
	}

	@Test def void testGetAllContentsOfTypeFromEObject() {
		testContainer.classesWithName += createClassWithName("1")
		testContainer.classesWithName += createClassWithName("2")
		testContainer.contained = createTestContainer => [
			classesWithName += createClassWithName("3")
			classesForControls += createClassForControls
			classesWithName += createClassWithName("4")
		]
		EcoreUtil2.getAllContentsOfType(testContainer, testPackage.classWithName).
			assertList("Class With Name 1, Class With Name 2, Class With Name 3, Class With Name 4")
		EcoreUtil2.getAllContentsOfType(testContainer.contained, ClassWithName).
			assertList("Class With Name 3, Class With Name 4")
	}

	@Test def void testGetAllContentsOfTypeFromEObjectWithNoMatching() {
		testContainer.classesForControls += createClassForControls
		EcoreUtil2.getAllContentsOfType(testContainer, testPackage.classWithName).
			assertList("")
	}

	@Test def void testGetAllContentsOfTypeFromResource() {
		testContainer.classesWithName += createClassWithName("1")
		testContainer.classesWithName += createClassWithName("2")
		testContainer.contained = createTestContainer => [
			classesWithName += createClassWithName("3")
			classesWithName += createClassWithName("4")
		]
		val resource = createResource
		resource.contents += testContainer
		resource.contents += createTestContainer => [
			classesWithName += createClassWithName("5")
			classesForControls += createClassForControls
			classesWithName += createClassWithName("6")
		]
		EcoreUtil2.getAllContentsOfType(resource, testPackage.classWithName).
			assertList("Class With Name 1, Class With Name 2, Class With Name 3, Class With Name 4, Class With Name 5, Class With Name 6")
	}

	@Test def void testGetAllContentsOfTypeFromEmptyResource() {
		val resource = createResource
		EcoreUtil2.getAllContentsOfType(resource, testPackage.classWithName).
			assertList("")
	}

	@Test def void testSafeEGetWithTheRightFeature() {
		classForControlsInstance.stringFeature = "test"
		"test".assertEquals(
			EcoreUtil2.safeEGet(classForControlsInstance, testPackage.classForControls_StringFeature)
		)
	}

	@Test def void testSafeEGetWithTheWrongFeature() {
		// the specified feature does not belong to the eclass
		EcoreUtil2.safeEGet(classForControlsInstance, testPackage.classWithName_Name).assertNull
	}

	def private assertList(List<?> list, CharSequence expected) {
		val labelProvider = getOrCreateInjector.getInstance(ILabelProvider)
		expected.toString.assertEquals(
			list.map[labelProvider.getText(it)].join(", ")
		)
	}
}