/*******************************************************************************
* Copyright (c) 2010, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.e4.ui.tests.application;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.junit.Test;
public class ModelElementTest {
@Test
public void testForMApplicationInterface() {
List<EClass> failedClasses = new ArrayList<EClass>();
checkPackageForMApplicationInterface(failedClasses,
ApplicationPackageImpl.eINSTANCE);
if (failedClasses.size() > 0) {
StringBuilder b = new StringBuilder(
"The following concrete classes don't implement 'MApplicationElement':\n");
for (EClass c : failedClasses) {
b.append("* " + c.getName() + "\n");
}
System.err.println(b.toString());
fail(b.toString());
}
}
private void checkPackageForMApplicationInterface(
List<EClass> failedClasses, EPackage ePackage) {
for (EClassifier classifier : ePackage.getEClassifiers()) {
if (classifier instanceof EClass) {
EClass c = (EClass) classifier;
if (!c.isInterface()
&& c != ApplicationPackageImpl.Literals.STRING_TO_STRING_MAP
&& c != ApplicationPackageImpl.Literals.STRING_TO_OBJECT_MAP) {
if (!MApplicationElement.class.isAssignableFrom(c
.getInstanceClass())) {
failedClasses.add(c);
}
}
}
}
for (EPackage subPackage : ePackage.getESubpackages()) {
checkPackageForMApplicationInterface(failedClasses, subPackage);
}
}
@Test
public void testForOptimalBaseClass() {
List<EClass> failedClasses = new ArrayList<EClass>();
checkPackageForOptimalBaseClass(failedClasses,
ApplicationPackageImpl.eINSTANCE);
if (failedClasses.size() > 0) {
StringBuilder b = new StringBuilder(
"The following concrete classes have a mixin as base 'MApplicationElement':\n");
for (EClass c : failedClasses) {
b.append("* " + c.getName() + "\n");
}
System.err.println(b.toString());
fail(b.toString());
}
}
private void checkPackageForOptimalBaseClass(List<EClass> failedClasses,
EPackage ePackage) {
for (EClassifier classifier : ePackage.getEClassifiers()) {
if (classifier instanceof EClass) {
EClass c = (EClass) classifier;
if (c != ApplicationPackageImpl.Literals.STRING_TO_STRING_MAP
&& c != ApplicationPackageImpl.Literals.STRING_TO_OBJECT_MAP
&& c != ApplicationPackageImpl.Literals.APPLICATION_ELEMENT
&& !c.isInterface()) {
if (c.getESuperTypes().size() == 0
|| c.getESuperTypes().get(0).isInterface()) {
failedClasses.add(c);
}
}
}
}
for (EPackage subPackage : ePackage.getESubpackages()) {
checkPackageForOptimalBaseClass(failedClasses, subPackage);
}
}
}