package org.jnario.suite.jvmmodel;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Collections.emptyList;
import static org.eclipse.xtext.EcoreUtil2.getContainerOfType;
import java.util.List;
import org.eclipse.xtend.core.xtend.XtendClass;
import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.jnario.Executable;
import org.jnario.jvmmodel.ExecutableProvider;
import org.jnario.suite.suite.Suite;
import org.jnario.suite.suite.SuiteFile;
import com.google.inject.Inject;
@SuppressWarnings("restriction")
public class SuiteExecutableProvider implements ExecutableProvider {
private SpecResolver specResolver;
private SuiteNodeBuilder suiteNodeBuilder;
@Inject
public SuiteExecutableProvider(SpecResolver specResolver, SuiteNodeBuilder suiteNodeBuilder) {
this.specResolver = specResolver;
this.suiteNodeBuilder = suiteNodeBuilder;
}
public List<Executable> getExecutables(Executable specification) {
if(!(specification instanceof Suite)){
return emptyList();
}
Suite suite = (Suite) specification;
List<Executable> result = getSubSuites(suite);
addResolvedSpecs(suite, result);
return result;
}
protected void addResolvedSpecs(Suite suite, List<Executable> result) {
result.addAll(specResolver.resolveSpecs(suite));
}
protected List<Executable> getSubSuites(Suite suite) {
SuiteFile file = getContainerOfType(suite, SuiteFile.class);
List<Executable> children = newArrayList();
if(file == null){
return children;
}
List<XtendTypeDeclaration> suites = file.getXtendTypes();
int index = suites.indexOf(suite) + 1;
int level = suiteNodeBuilder.level(suite);
while(index < suites.size()){
Suite current = (Suite) suites.get(index);
if(suiteNodeBuilder.level(current) == level + 1){
children.add(current);
}
index++;
}
return children;
}
}