/*****************************************************************************
* Copyright (c) 2013 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 fr.obeo.intent.specification.parser;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.emf.common.util.URI;
import com.google.common.base.CaseFormat;
import fr.obeo.intent.specification.Feature;
import fr.obeo.intent.specification.NamedElement;
import fr.obeo.intent.specification.Scenario;
import fr.obeo.intent.specification.Specification;
import fr.obeo.intent.specification.Story;
import fr.obeo.intent.specification.TestGenerationNote;
import fr.obeo.intent.specification.TestType;
/**
* Provides some utilities on specification models.
*
* @author <a href="mailto:melanie.bats@obeo.fr">Melanie Bats</a>
*/
public final class SpecificationUtils {
/**
* Utilities classes do not provide default constructor.
*/
private SpecificationUtils() {
// Nothing to do
}
/**
* Get the uri of the test file associated to a named element.
*
* @param namedElement
* Named element
* @return URI of the corresponding test file
*/
public static URI getTestURI(final NamedElement namedElement,
final TestType type, Specification specification) {
URI uri = URI.createURI("org.obeonetwork.dsl.uml2.design.tests/"
+ getPackagePath(namedElement, type, specification));
return uri;
}
private static String getPackagePath(NamedElement namedElement,
TestType type, Specification specification) {
String path = "src/" + getBasePackage(specification) + type.getName();
if (namedElement instanceof Story) {
path += "/stories/" + getCamelCaseName(namedElement)
+ Character.toUpperCase(type.getName().charAt(0))
+ type.getName().substring(1) + "Tests.java";
} else if (namedElement instanceof Scenario) {
path += "/stories/"
+ ((Story) namedElement.eContainer()).getName()
.replaceAll(" ", "").toLowerCase()
+ "/"
+ getCamelCaseName(((Scenario) namedElement).getGiven()
.get(0))
+ Character.toUpperCase(type.getName().charAt(0))
+ type.getName().substring(1)
+ "Tests.java#//@methods[name='"
+ Character.toLowerCase(getCamelCaseName(namedElement)
.charAt(0))
+ getCamelCaseName(namedElement).substring(1) + "()']";
} else if (namedElement instanceof Feature) {
path += "/features/" + getCamelCaseName(namedElement)
+ Character.toUpperCase(type.getName().charAt(0))
+ type.getName().substring(1) + "Tests.java";
}
return path;
}
private static String getBasePackage(Specification specification) {
return specification.getAutomationLayer().getBasePackage()
.replace(".", "/")
+ "/";
}
private static String getCamelCaseName(NamedElement namedElement) {
String name = namedElement.getName().replaceAll(" ", "_");
return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name);
}
public static Set<TestType> getTestTypes(NamedElement namedElement) {
Set<TestType> types = new HashSet<TestType>();
if (namedElement instanceof Feature) {
for (Story story : ((Feature) namedElement).getStories()) {
for (Scenario scenario : story.getScenarios()) {
if (scenario.getNotes() != null
&& scenario.getNotes().size() > 0) {
types.add(((TestGenerationNote) scenario.getNotes()
.get(0)).getType());
}
}
}
} else if (namedElement instanceof Story) {
for (Scenario scenario : ((Story) namedElement).getScenarios()) {
if (scenario.getNotes() != null
&& scenario.getNotes().size() > 0) {
types.add(((TestGenerationNote) scenario.getNotes().get(0))
.getType());
}
}
} else if (namedElement instanceof Scenario) {
if (namedElement.getNotes() != null
&& namedElement.getNotes().size() > 0) {
types.add(((TestGenerationNote) namedElement.getNotes().get(0))
.getType());
}
}
return types;
}
}