/** * Copyright (c) 2012 committers of YAKINDU 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: * committers of YAKINDU - initial API and implementation */ package org.yakindu.sct.generator.genmodel.test; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.junit4.InjectWith; import org.eclipse.xtext.junit4.XtextRunner; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.XtextResourceSet; import org.junit.Test; import org.junit.runner.RunWith; import org.yakindu.sct.generator.core.extensions.GeneratorExtensions; import org.yakindu.sct.generator.core.extensions.IGeneratorDescriptor; import org.yakindu.sct.generator.core.extensions.ILibraryDescriptor; import org.yakindu.sct.generator.core.extensions.LibraryExtensions; import org.yakindu.sct.generator.genmodel.resource.FeatureResourceDescription; import org.yakindu.sct.generator.genmodel.test.util.SGenInjectorProvider; import org.yakindu.sct.generator.genmodel.ui.help.SGenUserHelpDocumentationProvider; import org.yakindu.sct.model.sgen.FeatureConfiguration; import org.yakindu.sct.model.sgen.FeatureParameter; import org.yakindu.sct.model.sgen.FeatureType; import org.yakindu.sct.model.sgen.SGenPackage; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Injector; /** * Checks if all Generator Features have a corresponding documentation section * in the user guide. * * @author andreas muelder - Initial contribution and API * */ @RunWith(XtextRunner.class) @InjectWith(SGenInjectorProvider.class) public class HelpIntegrationTest { private static final String YAKINDU_JAVA = "yakindu::java"; private static final String YAKINDU_C = "yakindu::c"; private static final String YAKINDU_CPP = "yakindu::cpp"; private static final String YAKINDU_GENERIC = "yakindu::generic"; @Inject private SGenUserHelpDocumentationProvider documentationProvider; @Inject private XtextResourceSet resourceSet; @Inject private Injector injector; @Test public void checkJavaGeneratorFeatureDocumentation() { checkGeneratorFeatureDocumentation(YAKINDU_JAVA); } @Test public void checkCGeneratorFeatureDocumentation() { checkGeneratorFeatureDocumentation(YAKINDU_C); } @Test public void checkCppGeneratorFeatureDocumentation() { checkGeneratorFeatureDocumentation(YAKINDU_CPP); } @Test public void checkGenericGeneratorFeatureDocumentation() { checkGeneratorFeatureDocumentation(YAKINDU_GENERIC); } @Test public void checkDocumentedFeaturesExist() { List<String> features = getDocumentedFeatures(); ArrayList<String> generators = new ArrayList<String>( Arrays.asList(YAKINDU_JAVA, YAKINDU_C, YAKINDU_CPP, YAKINDU_GENERIC)); for (String generator : generators) { Iterable<IEObjectDescription> allElements = getAllElements(generator); for (IEObjectDescription desc : allElements) { if (desc.getEClass() != SGenPackage.Literals.FEATURE_TYPE) continue; EObject o = desc.getEObjectOrProxy(); String name = null; if (o instanceof FeatureConfiguration) { FeatureType type = ((FeatureConfiguration) o).getType(); if (type != null) { name = type.getName(); } } else if (o instanceof FeatureType) { FeatureType type = (FeatureType) o; if (type != null) { name = type.getName(); } } else if (o instanceof FeatureParameter) { FeatureType type = ((FeatureParameter) o).getFeatureType(); if (type != null) { name = type.getName(); } } if (name != null) name = name.toLowerCase(); if (name != null && features.contains(name)) { features.remove(name); } } } if (features.size() > 0) { fail("There are documented features that are not implemented: " + Arrays.toString(features.toArray())); } } private void checkGeneratorFeatureDocumentation(String generator) { List<String> missingDocumentation = getFeaturesWithoutDocumentation(generator); if (missingDocumentation.size() > 0) { fail("Missing generator feature(s) documentation for generator " + generator + ": " + missingDocumentation); } } private List<String> getDocumentedFeatures() { return documentationProvider.getDocumentedFeatures(); } private Iterable<IEObjectDescription> getAllElements(String generatorId) { IGeneratorDescriptor generatorDescriptor = GeneratorExtensions .getGeneratorDescriptor(generatorId); Iterable<ILibraryDescriptor> libraryDescriptor = LibraryExtensions .getLibraryDescriptors(generatorDescriptor.getLibraryIDs()); Iterable<IEObjectDescription> allElements = Lists.newArrayList(); for (ILibraryDescriptor desc : libraryDescriptor) { Resource library = resourceSet.getResource(desc.getURI(), true); FeatureResourceDescription description = new FeatureResourceDescription( library); injector.injectMembers(description); allElements = Iterables.concat(allElements, description.getExportedObjects()); } return allElements; } private List<String> getFeaturesWithoutDocumentation(String generatorId) { Iterable<IEObjectDescription> allElements = getAllElements(generatorId); List<String> missingDocumentation = Lists.newArrayList(); for (IEObjectDescription desc : allElements) { if (desc.getEClass() != SGenPackage.Literals.FEATURE_TYPE) continue; EObject eObjectOrProxy = desc.getEObjectOrProxy(); String documentation = documentationProvider .getDocumentation(eObjectOrProxy); if (documentation == null || SGenUserHelpDocumentationProvider.EMPTY_DOCUMENTATION .equals(documentation)) { missingDocumentation.add(desc.getName().toString()); } } return missingDocumentation; } }