/**
 * <copyright> Copyright (c) 2008-2009 Jonas Helming, Maximilian Koegel. 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 </copyright>
 */
package org.eclipse.emf.emfstore.client.test.changeTracking.operations;

import static org.junit.Assert.assertTrue;

import java.util.Arrays;

import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.client.test.WorkspaceTest;
import org.eclipse.emf.emfstore.client.test.testmodel.TestElement;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiReferenceSetOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.OperationsFactory;
import org.junit.Test;

/**
 * Tests for multireferenceset operations.
 * 
 * @author wesendon
 */
public class MultiReferenceSetOperationTest extends WorkspaceTest {

	/**
	 * Set reference to filled list.
	 */
	@Test
	public void setValueToFilledTest() {
		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				TestElement element = getTestElement();
				TestElement oldValue = getTestElement();
				TestElement newValue = getTestElement();

				element.getReferences().add(oldValue);
				clearOperations();

				assertTrue(element.getReferences().size() == 1);
				assertTrue(element.getReferences().get(0).equals(oldValue));

				element.getReferences().set(0, newValue);

				assertTrue(element.getReferences().size() == 1);
				assertTrue(element.getReferences().get(0).equals(newValue));

				assertTrue(getProjectSpace().getOperations().size() == 1);
				assertTrue(getProjectSpace().getOperations().get(0) instanceof MultiReferenceSetOperation);
			}
		}.run(false);
	}

	/**
	 * Apply setoperation.
	 */
	@Test
	public void applyValueToFilledTest() {
		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				TestElement testElement = getTestElement();
				TestElement oldValue = getTestElement();
				testElement.getReferences().add(oldValue);
				TestElement newValue = getTestElement();
				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(oldValue));

				MultiReferenceSetOperation operation = OperationsFactory.eINSTANCE.createMultiReferenceSetOperation();
				operation.setFeatureName("references");
				operation.setIndex(0);
				operation.setNewValue(ModelUtil.getProject(newValue).getModelElementId(newValue));
				operation.setOldValue(ModelUtil.getProject(oldValue).getModelElementId(oldValue));
				operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));

				operation.apply(getProject());

				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(newValue));
			}
		}.run(false);
	}

	/**
	 * Apply setoperation with wrong index. Note: The set function now operates with mainly the model element ids, the
	 * index is only used for soft conflict detection.
	 */
	@Test
	public void applyValueToFilledWrongIndexTest() {
		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				TestElement testElement = getTestElement();
				TestElement oldValue = getTestElement();
				testElement.getReferences().add(oldValue);
				TestElement newValue = getTestElement();

				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(oldValue));

				MultiReferenceSetOperation operation = OperationsFactory.eINSTANCE.createMultiReferenceSetOperation();
				operation.setFeatureName("references");
				operation.setIndex(42);
				operation.setNewValue(ModelUtil.getProject(newValue).getModelElementId(newValue));
				operation.setOldValue(ModelUtil.getProject(oldValue).getModelElementId(oldValue));
				operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));

				operation.apply(getProject());

				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(newValue));
			}
		}.run(false);
	}

	/**
	 * Set value to filled list.
	 */
	@Test
	public void applyValueToMultiFilledTest() {
		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				TestElement testElement = getTestElement();
				TestElement first = getTestElement();
				TestElement second = getTestElement();
				TestElement third = getTestElement();
				TestElement newValue = getTestElement();

				testElement.getReferences().addAll(Arrays.asList(first, second, third));
				assertTrue(testElement.getReferences().size() == 3);

				MultiReferenceSetOperation operation = OperationsFactory.eINSTANCE.createMultiReferenceSetOperation();
				operation.setFeatureName("references");
				operation.setIndex(1);
				operation.setNewValue(ModelUtil.getProject(newValue).getModelElementId(newValue));
				operation.setOldValue(ModelUtil.getProject(second).getModelElementId(second));
				operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));
				operation.apply(getProject());
				assertTrue(testElement.getReferences().size() == 3);
				assertTrue(testElement.getReferences().get(0).equals(first));
				assertTrue(testElement.getReferences().get(1).equals(newValue));
				assertTrue(testElement.getReferences().get(2).equals(third));
			}
		}.run(false);
	}

	/**
	 * Set and reverse operation.
	 */
	@Test
	public void setAndReverseTest() {
		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				TestElement testElement = getTestElement();
				TestElement oldValue = getTestElement();
				testElement.getReferences().add(oldValue);
				TestElement newValue = getTestElement();

				getProjectSpace().getOperations().clear();
				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(oldValue));

				testElement.getReferences().set(0, newValue);

				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(newValue));

				AbstractOperation operation = getProjectSpace().getOperations().get(0).reverse();
				operation.apply(getProject());

				assertTrue(testElement.getReferences().size() == 1);
				assertTrue(testElement.getReferences().get(0).equals(oldValue));
			}
		}.run(false);
	}
}
