blob: f7571df9a0db3db7db86241dbd0a04c25f64494b [file] [log] [blame]
/*******************************************************************************
* Copyright 2011 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* All rights reserved. This program and the accompanying materials
* are made available under the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
******************************************************************************/
package org.eclipse.emf.emfstore.client.test.changeTracking.notification.recording;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.List;
import org.eclipse.emf.emfstore.client.model.changeTracking.notification.NotificationInfo;
import org.eclipse.emf.emfstore.client.model.changeTracking.notification.recording.NotificationRecording;
import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.client.test.model.requirement.Actor;
import org.eclipse.emf.emfstore.client.test.model.requirement.RequirementFactory;
import org.eclipse.emf.emfstore.client.test.model.requirement.UseCase;
import org.junit.Ignore;
import org.junit.Test;
/**
* Tests the notification recording for attribute features.
*
* @author chodnick
*/
public class ReferenceNotificationTest extends NotificationTest {
/**
* Change an reference and check the generated notification.
*/
@Test
public void changeReference1toN() {
final Actor actor = RequirementFactory.eINSTANCE.createActor();
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
actor.setName("testActor");
useCase.setName("testUseCase");
// notifications from this operations are tested
useCase.setInitiatingActor(actor);
}
}.run(false);
NotificationRecording recording = getProjectSpaceImpl().getNotificationRecorder().getRecording();
List<NotificationInfo> rec = recording.asMutableList();
// exactly one SET notification is expected with attribute feature "initiatingActor" on our useCase and
// newValue
// actor
// due to refactoring and removing the bidirectional filter two notifications are expected.
assertEquals(2, rec.size());
NotificationInfo addNotification = rec.get(0);
NotificationInfo setNotification = rec.get(1);
assertSame(actor, addNotification.getNotifier());
assertTrue(addNotification.isReferenceNotification());
assertTrue(addNotification.isAddEvent());
assertSame(addNotification.getNewValue(), useCase);
assertEquals(addNotification.getReference().getName(), "initiatedUseCases");
assertNull(addNotification.getOldValue());
assertSame(useCase, setNotification.getNotifier());
assertTrue(setNotification.isReferenceNotification());
assertTrue(setNotification.isSetEvent());
assertSame(setNotification.getNewValue(), actor);
assertEquals(setNotification.getReference().getName(), "initiatingActor");
assertNull(setNotification.getOldValue());
}
/**
* Change an reference and check the generated notification.
*/
@Ignore
public void changeReference1to1() {
fail("FIXME: MK where do we have 1:1 non-containment references?");
}
/**
* Add an reference and check the generated notification.
*/
@Test
public void addReferenceNto1() {
final Actor actor = RequirementFactory.eINSTANCE.createActor();
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
actor.setName("testActor");
useCase.setName("testUseCase");
// notifications from this operations are tested
actor.getInitiatedUseCases().add(useCase);
}
}.run(false);
NotificationRecording recording = getProjectSpaceImpl().getNotificationRecorder().getRecording();
List<NotificationInfo> rec = recording.asMutableList();
// exactly one ADD notification is expected
// after refactoring: additional SET is expected
assertEquals(2, rec.size());
NotificationInfo setNotification = rec.get(0);
NotificationInfo addNotification = rec.get(1);
assertSame(useCase, setNotification.getNotifier());
assertTrue(setNotification.isReferenceNotification());
assertTrue(setNotification.isSetEvent());
assertSame(setNotification.getNewValue(), actor);
assertEquals(setNotification.getReference().getName(), "initiatingActor");
assertNull(setNotification.getOldValue());
assertSame(actor, addNotification.getNotifier());
assertTrue(addNotification.isReferenceNotification());
assertTrue(addNotification.isAddEvent());
assertSame(addNotification.getNewValue(), useCase);
assertEquals(addNotification.getReference().getName(), "initiatedUseCases");
}
/**
* Add a reference and check the generated notification.
*/
@Test
public void addReferenceNtoN() {
final Actor actor = RequirementFactory.eINSTANCE.createActor();
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
actor.setName("testActor");
useCase.setName("testUseCase");
// notifications from this operations are tested
useCase.getParticipatingActors().add(actor);
}
}.run(false);
NotificationRecording recording = getProjectSpaceImpl().getNotificationRecorder().getRecording();
List<NotificationInfo> rec = recording.asMutableList();
// exactly two ADD notification is expected
assertEquals(2, rec.size());
NotificationInfo actorAdd = rec.get(0);
NotificationInfo useCaseAdd = rec.get(1);
assertSame(actor, actorAdd.getNotifier());
assertTrue(actorAdd.isReferenceNotification());
assertTrue(actorAdd.isAddEvent());
assertSame(actorAdd.getNewValue(), useCase);
assertEquals(actorAdd.getReference().getName(), "participatedUseCases");
assertSame(useCase, useCaseAdd.getNotifier());
assertTrue(useCaseAdd.isReferenceNotification());
assertTrue(useCaseAdd.isAddEvent());
assertSame(useCaseAdd.getNewValue(), actor);
assertEquals(useCaseAdd.getReference().getName(), "participatingActors");
}
/**
* Remove a reference and check the generated notification.
*/
@Test
public void removeReferenceNto1() {
final Actor actor = RequirementFactory.eINSTANCE.createActor();
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
actor.setName("testActor");
useCase.setName("testUseCase");
// notifications from this operations are tested
actor.getInitiatedUseCases().add(useCase);
actor.getInitiatedUseCases().remove(useCase);
}
}.run(false);
NotificationRecording recording = getProjectSpaceImpl().getNotificationRecorder().getRecording();
List<NotificationInfo> rec = recording.asMutableList();
// exactly one REMOVE notification is expected from the actor
assertEquals(2, rec.size());
NotificationInfo n = rec.get(0);
assertSame(useCase, n.getNotifier());
assertTrue(n.isReferenceNotification());
assertTrue(n.isSetEvent());
assertSame(n.getOldValue(), actor);
assertSame(null, n.getNewValue());
assertEquals(n.getReference().getName(), "initiatingActor");
n = rec.get(1);
assertSame(actor, n.getNotifier());
assertTrue(n.isReferenceNotification());
assertTrue(n.isRemoveEvent());
assertSame(n.getOldValue(), useCase);
assertEquals(n.getReference().getName(), "initiatedUseCases");
}
/**
* Remove a reference and check the generated notification.
*/
@Test
public void removeReferenceNtoN() {
final Actor actor = RequirementFactory.eINSTANCE.createActor();
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
actor.setName("testActor");
useCase.setName("testUseCase");
// notifications from this operations are tested
useCase.getParticipatingActors().add(actor);
useCase.getParticipatingActors().remove(actor);
}
}.run(false);
NotificationRecording recording = getProjectSpaceImpl().getNotificationRecorder().getRecording();
List<NotificationInfo> rec = recording.asMutableList();
// exactly two REMOVE notifications are expected
// actor loses its useCase (message needed to retain index of useCase)
// useCase loses its actor (message needed to retain index of actor)
assertEquals(2, rec.size());
NotificationInfo n = rec.get(0);
assertSame(actor, n.getNotifier());
assertTrue(n.isReferenceNotification());
assertTrue(n.isRemoveEvent());
assertSame(n.getOldValue(), useCase);
assertEquals(n.getReference().getName(), "participatedUseCases");
assertEquals(n.getPosition(), 0);
n = rec.get(1);
assertSame(useCase, n.getNotifier());
assertTrue(n.isReferenceNotification());
assertTrue(n.isRemoveEvent());
assertSame(n.getOldValue(), actor);
assertEquals(n.getReference().getName(), "participatingActors");
assertEquals(n.getPosition(), 0);
}
}