blob: 74c7374d0a4a8854a9995cc5284b809afcc90c67 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 EclipseSource Muenchen GmbH 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:
* Johannes Faltermeier - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.ui.common;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Callable;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.emfstore.client.test.common.cases.ESTest;
import org.eclipse.emf.emfstore.client.test.common.dsl.Add;
import org.eclipse.emf.emfstore.client.test.common.dsl.Create;
import org.eclipse.emf.emfstore.client.ui.ESClassFilter;
import org.eclipse.emf.emfstore.client.ui.ESWhitelistFilter;
import org.eclipse.emf.emfstore.client.util.RunESCommand;
import org.eclipse.emf.emfstore.internal.client.model.CompositeOperationHandle;
import org.eclipse.emf.emfstore.internal.client.model.exceptions.InvalidHandleException;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.eclipse.emf.emfstore.test.model.TestType;
import org.eclipse.emf.emfstore.test.model.TestmodelPackage;
import org.junit.Before;
import org.junit.Test;
public class EClassFilterTest extends ESTest {
private static final String DESC = "desc"; //$NON-NLS-1$
private static final String NAME = "name"; //$NON-NLS-1$
protected static final String LABEL = "foo"; //$NON-NLS-1$
private EClassFilter eClassFilter;
@Override
@Before
public void before() {
super.before();
eClassFilter = new EClassFilter();
}
@Test
public void testCreateDeleteOperationNoFilter() {
final TestElement element = Create.testElement();
Add.toProject(getLocalProject(), element);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCreateDeleteOperationEClassFiltered() {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final TestElement element = Create.testElement();
Add.toProject(getLocalProject(), element);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertTrue(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCreateDeleteOperationEClassNotFiltered() {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final TestType element = Create.testType();
Add.toProject(getLocalProject(), element);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCompositeOperationNoFilter() throws InvalidHandleException {
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
Add.toProject(getLocalProject(), Create.testElement());
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCompositeOperationNotFiltered1() throws InvalidHandleException {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
Add.toProject(getLocalProject(), Create.testType());
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCompositeOperationNotFiltered2() throws InvalidHandleException {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
final TestType testElement = Create.testType();
Add.toProject(getLocalProject(), testElement);
Add.toProject(getLocalProject(), Create.testElement());
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCompositeOperationNotFiltered3() throws InvalidHandleException {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
final TestType testElement = Create.testType();
Add.toProject(getLocalProject(), testElement);
Add.toProject(getLocalProject(), Create.testType());
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testCompositeOperationFiltered() throws InvalidHandleException {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
Add.toProject(getLocalProject(), Create.testElement());
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertTrue(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testFeatureOperationNoFilter() {
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
clearOperations();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setName(NAME);
return null;
}
});
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testFeatureOperationNotFiltered() {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final TestType testType = Create.testType();
Add.toProject(getLocalProject(), testType);
clearOperations();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testType.setName(NAME);
return null;
}
});
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testFeatureOperationFiltered() {
final ESClassFilter filter = createTestElementESClassFilter();
eClassFilter.registerFilter(filter);
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
clearOperations();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setName(NAME);
return null;
}
});
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertTrue(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testWhitelistFeatureOperationNotFiltered() {
final ESClassFilter filter = createTestElementNameWhitelistFilter();
eClassFilter.registerFilter(filter);
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
clearOperations();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setName(NAME);
return null;
}
});
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testWhitelistFeatureOperationFiltered() {
final ESClassFilter filter = createTestElementNameWhitelistFilter();
eClassFilter.registerFilter(filter);
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
clearOperations();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setDescription(DESC);
return null;
}
});
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertTrue(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testWhitelistCompositeOperationNotFiltered() throws InvalidHandleException {
final ESClassFilter filter = createTestElementNameWhitelistFilter();
eClassFilter.registerFilter(filter);
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
clearOperations();
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setDescription(DESC);
testElement.setName(NAME);
return null;
}
});
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertFalse(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
@Test
public void testWhitelistCompositeOperationFiltered() throws InvalidHandleException {
final ESClassFilter filter = createTestElementNameWhitelistFilter();
eClassFilter.registerFilter(filter);
final TestElement testElement = Create.testElement();
Add.toProject(getLocalProject(), testElement);
clearOperations();
final CompositeOperationHandle operationHandle = getProjectSpace().beginCompositeOperation();
RunESCommand.run(new Callable<Void>() {
public Void call() throws Exception {
testElement.setDescription(DESC);
testElement.setDescription(NAME);
return null;
}
});
operationHandle.end(NAME, DESC, getProject().getModelElementId(testElement));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertTrue(eClassFilter.involvesOnlyFilteredEClasses(getProject(), operations.get(0)));
}
private static ESClassFilter createTestElementNameWhitelistFilter() {
final ESClassFilter filter = new ESWhitelistFilter() {
public String getLabel() {
return LABEL;
}
public Set<EClass> getFilteredEClasses() {
return Collections.singleton(TestmodelPackage.eINSTANCE.getTestElement());
}
public Map<EClass, Collection<EStructuralFeature>> getNonFilteredFeaturesForEClass() {
final Map<EClass, Collection<EStructuralFeature>> whitelist = new LinkedHashMap<EClass, Collection<EStructuralFeature>>();
whitelist.put(TestmodelPackage.eINSTANCE.getTestElement(),
Collections.<EStructuralFeature> singleton(TestmodelPackage.eINSTANCE.getTestElement_Name()));
return whitelist;
}
};
return filter;
}
private static ESClassFilter createTestElementESClassFilter() {
final ESClassFilter esClassFilter = new ESClassFilter() {
public String getLabel() {
return LABEL;
}
public Set<EClass> getFilteredEClasses() {
return Collections.singleton(TestmodelPackage.eINSTANCE.getTestElement());
}
};
return esClassFilter;
}
}