/*******************************************************************************
 * Copyright (c) 2012, 2014 Obeo.
 * 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:
 *     Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.emf.compare.diagram.ecoretools.tests.show;

import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.instanceOf;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertTrue;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.attributeValueMatch;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind;

import java.io.IOException;
import java.util.List;

import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.diagram.ecoretools.tests.AbstractTest;
import org.eclipse.emf.compare.diagram.ecoretools.tests.DiagramInputData;
import org.eclipse.emf.compare.diagram.ecoretools.tests.show.data.ShowInputData;
import org.eclipse.emf.compare.diagram.internal.extensions.Show;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.junit.Test;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;

@SuppressWarnings("nls")
public class ShowTest extends AbstractTest {

	private ShowInputData input = new ShowInputData();

	@Test
	public void testA1UseCase() throws IOException {
		final Resource left = input.getA1Left();
		final Resource right = input.getA1Right();

		final Comparison comparison = compare(left, right);

		final List<Diff> differences = comparison.getDifferences();

		// We should have no less and no more than 2 differences
		assertSame(Integer.valueOf(2), Integer.valueOf(differences.size()));

		Predicate<? super Diff> attributeChangeDescription = attributeValueMatch(
				NotationPackage.Literals.VIEW__VISIBLE.getName(), Boolean.TRUE, false);
		Predicate<? super Diff> showDescription = and(instanceOf(Show.class), ofKind(DifferenceKind.CHANGE));

		assertSame(Integer.valueOf(1), count(differences, instanceOf(Show.class)));

		final Diff attributeChange = Iterators.find(differences.iterator(), attributeChangeDescription);
		final Diff show = Iterators.find(differences.iterator(), showDescription);

		assertNotNull(attributeChange);
		assertNotNull(show);

		assertSame(Integer.valueOf(1), Integer.valueOf(show.getRefinedBy().size()));
		assertTrue(show.getRefinedBy().contains(attributeChange));

		testIntersections(comparison);
	}

	@Override
	protected DiagramInputData getInput() {
		return null;
	}

}
