/** * 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.tests.fullcomparison; import static com.google.common.base.Predicates.and; import static org.eclipse.emf.compare.utils.EMFComparePredicates.addedToReference; import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedAttribute; import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedReference; import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide; import static org.eclipse.emf.compare.utils.EMFComparePredicates.removed; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import com.google.common.base.Predicate; import com.google.common.collect.Iterators; import java.io.IOException; import java.util.List; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Conflict; import org.eclipse.emf.compare.ConflictKind; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.DifferenceSource; import org.eclipse.emf.compare.EMFCompare; import org.eclipse.emf.compare.scope.DefaultComparisonScope; import org.eclipse.emf.compare.scope.IComparisonScope; import org.eclipse.emf.compare.tests.fullcomparison.data.identifier.IdentifierMatchInputData; import org.eclipse.emf.ecore.resource.Resource; import org.junit.Test; /** * Note that part of this is tested in IdentifierComparisonTest, but that class is run with * EMFCompareTestRunner. We need more generic tests for the conflicts. */ @SuppressWarnings("nls") public class ExtLibraryTest { private IdentifierMatchInputData inputData = new IdentifierMatchInputData(); @Test public void testConflicts() throws IOException { final Resource left = inputData.getExtlibraryLeft(); final Resource origin = inputData.getExtlibraryOrigin(); final Resource right = inputData.getExtlibraryRight(); final IComparisonScope scope = new DefaultComparisonScope(left, right, origin); final Comparison comparison = EMFCompare.builder().build().compare(scope); final List<Diff> differences = comparison.getDifferences(); final Predicate<? super Diff> rightAudiovisualName = and(fromSide(DifferenceSource.RIGHT), changedAttribute("extlibrary.AudioVisualItem.length", "name", "minutesLength", "minutes")); final Predicate<? super Diff> leftAudiovisualName = and(fromSide(DifferenceSource.LEFT), changedAttribute("extlibrary.AudioVisualItem.length", "name", "minutesLength", "length")); final Diff rightAudiovisualNameDiff = Iterators.find(differences.iterator(), rightAudiovisualName); final Diff leftAudiovisualNameDiff = Iterators.find(differences.iterator(), leftAudiovisualName); final Conflict audiovisualNameConflict = rightAudiovisualNameDiff.getConflict(); assertNotNull(audiovisualNameConflict); assertEquals(2, audiovisualNameConflict.getDifferences().size()); assertTrue(audiovisualNameConflict.getDifferences().contains(rightAudiovisualNameDiff)); assertTrue(audiovisualNameConflict.getDifferences().contains(leftAudiovisualNameDiff)); assertSame(audiovisualNameConflict, leftAudiovisualNameDiff.getConflict()); assertSame(ConflictKind.REAL, audiovisualNameConflict.getKind()); final Predicate<? super Diff> rightRemovedReader = and(fromSide(DifferenceSource.RIGHT), removed("extlibrary.BookOnTape.reader")); final Predicate<? super Diff> rightUnsetReaderType = and(fromSide(DifferenceSource.RIGHT), changedReference("extlibrary.BookOnTape.reader", "eType", "extlibrary.Person", null)); final Predicate<? super Diff> leftRemovedReader = and(fromSide(DifferenceSource.LEFT), removed("extlibrary.BookOnTape.reader")); final Predicate<? super Diff> leftUnsetReaderType = and(fromSide(DifferenceSource.LEFT), changedReference("extlibrary.BookOnTape.reader", "eType", "extlibrary.Person", null)); final Diff rightRemovedReaderDiff = Iterators.find(differences.iterator(), rightRemovedReader); final Diff rightUnsetReaderTypeDiff = Iterators.find(differences.iterator(), rightUnsetReaderType); final Diff leftRemovedReaderDiff = Iterators.find(differences.iterator(), leftRemovedReader); final Diff leftUnsetReaderTypeDiff = Iterators.find(differences.iterator(), leftUnsetReaderType); final Conflict readerConflict = rightRemovedReaderDiff.getConflict(); assertNotNull(readerConflict); assertEquals(2, readerConflict.getDifferences().size()); assertTrue(readerConflict.getDifferences().contains(rightRemovedReaderDiff)); assertTrue(readerConflict.getDifferences().contains(leftRemovedReaderDiff)); assertSame(readerConflict, leftRemovedReaderDiff.getConflict()); assertSame(ConflictKind.PSEUDO, readerConflict.getKind()); final Conflict readerETypeConflict = rightUnsetReaderTypeDiff.getConflict(); assertNotNull(readerETypeConflict); assertEquals(2, readerETypeConflict.getDifferences().size()); assertTrue(readerETypeConflict.getDifferences().contains(rightUnsetReaderTypeDiff)); assertTrue(readerETypeConflict.getDifferences().contains(leftUnsetReaderTypeDiff)); assertSame(readerETypeConflict, leftUnsetReaderTypeDiff.getConflict()); assertSame(ConflictKind.PSEUDO, readerETypeConflict.getKind()); final Predicate<? super Diff> rightRenamedFamilyname = and(fromSide(DifferenceSource.RIGHT), changedAttribute("extlibrary.Person.familyName", "name", "lastName", "familyName")); final Predicate<? super Diff> leftRemovedLastname = and(fromSide(DifferenceSource.LEFT), removed("extlibrary.Person.lastName")); final Diff rightRenamedFamilyNameDiff = Iterators.find(differences.iterator(), rightRenamedFamilyname); final Diff leftRemovedLastNameDiff = Iterators.find(differences.iterator(), leftRemovedLastname); final Conflict familyNameConflict = leftRemovedLastNameDiff.getConflict(); assertNotNull(familyNameConflict); assertEquals(2, familyNameConflict.getDifferences().size()); assertTrue(familyNameConflict.getDifferences().contains(leftRemovedLastNameDiff)); assertTrue(familyNameConflict.getDifferences().contains(rightRenamedFamilyNameDiff)); assertSame(familyNameConflict, rightRenamedFamilyNameDiff.getConflict()); assertSame(ConflictKind.REAL, familyNameConflict.getKind()); final Predicate<? super Diff> rightSetPeriodicalSupertype = and(fromSide(DifferenceSource.RIGHT), addedToReference("extlibrary.Magazine", "eSuperTypes", "extlibrary.Periodical")); final Predicate<? super Diff> rightSetTitledItemSupertype = and(fromSide(DifferenceSource.RIGHT), addedToReference("extlibrary.Periodical", "eSuperTypes", "extlibrary.TitledItem")); final Predicate<? super Diff> leftRemovedPeriodical = and(fromSide(DifferenceSource.LEFT), removed("extlibrary.Periodical")); final Diff rightSetPeriodicalSupertypeDiff = Iterators.find(differences.iterator(), rightSetPeriodicalSupertype); final Diff rightSetTitledItemSupertypeDiff = Iterators.find(differences.iterator(), rightSetTitledItemSupertype); final Diff leftRemovedPeriodicalDiff = Iterators.find(differences.iterator(), leftRemovedPeriodical); final Conflict periodicalConflict = rightSetPeriodicalSupertypeDiff.getConflict(); assertNotNull(periodicalConflict); assertEquals(3, periodicalConflict.getDifferences().size()); assertTrue(periodicalConflict.getDifferences().contains(leftRemovedPeriodicalDiff)); assertTrue(periodicalConflict.getDifferences().contains(rightSetPeriodicalSupertypeDiff)); assertTrue(periodicalConflict.getDifferences().contains(rightSetTitledItemSupertypeDiff)); assertSame(ConflictKind.REAL, periodicalConflict.getKind()); final Predicate<? super Diff> leftRemovedTitle = and(fromSide(DifferenceSource.LEFT), removed("extlibrary.Periodical.title")); final Predicate<? super Diff> leftUnsetTitleType = and(fromSide(DifferenceSource.LEFT), changedReference("extlibrary.Periodical.title", "eType", "ecore.EString", null)); final Predicate<? super Diff> rightRemovedTitle = and(fromSide(DifferenceSource.RIGHT), removed("extlibrary.Periodical.title")); final Predicate<? super Diff> rightUnsetTitleType = and(fromSide(DifferenceSource.RIGHT), changedReference("extlibrary.Periodical.title", "eType", "ecore.EString", null)); final Diff leftRemovedTitleDiff = Iterators.find(differences.iterator(), leftRemovedTitle); final Diff leftUnsetTitleTypeDiff = Iterators.find(differences.iterator(), leftUnsetTitleType); final Diff rightRemovedTitleDiff = Iterators.find(differences.iterator(), rightRemovedTitle); final Diff rightUnsetTitleTypeDiff = Iterators.find(differences.iterator(), rightUnsetTitleType); final Conflict titleConflict = leftRemovedTitleDiff.getConflict(); assertNotNull(titleConflict); assertEquals(2, titleConflict.getDifferences().size()); assertTrue(titleConflict.getDifferences().contains(leftRemovedTitleDiff)); assertTrue(titleConflict.getDifferences().contains(rightRemovedTitleDiff)); assertSame(ConflictKind.PSEUDO, titleConflict.getKind()); final Conflict titleETypeConflict = leftUnsetTitleTypeDiff.getConflict(); assertNotNull(titleETypeConflict); assertEquals(2, titleETypeConflict.getDifferences().size()); assertTrue(titleETypeConflict.getDifferences().contains(leftUnsetTitleTypeDiff)); assertTrue(titleETypeConflict.getDifferences().contains(rightUnsetTitleTypeDiff)); assertSame(ConflictKind.PSEUDO, titleETypeConflict.getKind()); assertEquals(7, comparison.getConflicts().size()); } }