package org.jbehave.examples.trader.i18n;
import java.net.URL;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import org.jbehave.core.configuration.Configuration;
import org.jbehave.core.configuration.Keywords;
import org.jbehave.core.configuration.MostUsefulConfiguration;
import org.jbehave.core.i18n.LocalizedKeywords;
import org.jbehave.core.io.CodeLocations;
import org.jbehave.core.io.LoadFromClasspath;
import org.jbehave.core.io.StoryFinder;
import org.jbehave.core.junit.JUnitStories;
import org.jbehave.core.model.ExamplesTableFactory;
import org.jbehave.core.model.TableTransformers;
import org.jbehave.core.parsers.RegexStoryParser;
import org.jbehave.core.reporters.FilePrintStreamFactory.ResolveToSimpleName;
import org.jbehave.core.reporters.StoryReporterBuilder;
import org.jbehave.core.steps.CandidateSteps;
import org.jbehave.core.steps.InstanceStepsFactory;
import org.jbehave.core.steps.MarkUnmatchedStepsAsPending;
import org.jbehave.core.steps.ParameterConverters;
import org.jbehave.core.steps.ParameterConverters.ExamplesTableConverter;
import org.jbehave.core.steps.ParameterConverters.NumberConverter;
import org.jbehave.core.steps.ParameterConverters.ParameterConverter;
import org.jbehave.examples.core.steps.BeforeAfterSteps;
import static org.jbehave.core.io.CodeLocations.codeLocationFromClass;
import static org.jbehave.core.reporters.Format.CONSOLE;
import static org.jbehave.core.reporters.Format.HTML;
import static org.jbehave.core.reporters.Format.TXT;
import static org.jbehave.core.reporters.Format.XML;
/**
* Abstract base ConfigurableEmbedder allowing localization of multiple stories
* via JUnit. The concrete extension need only specify:
* <ul>
* <li>language: e.g. "fr", "it, "pt"</li>
* <li>story pattern to look up stories</li>
* <li>language-specific steps instance</li>
* </ul>
*/
public abstract class LocalizedStories extends JUnitStories {
@Override
public Configuration configuration() {
ClassLoader classLoader = this.getClass().getClassLoader();
URL codeLocation = CodeLocations.codeLocationFromClass(this.getClass());
Keywords keywords = new LocalizedKeywords(locale());
Properties properties = new Properties();
properties.setProperty("reports", "ftl/jbehave-reports.ftl");
properties.setProperty("encoding", "UTF-8");
TableTransformers tableTransformers = new TableTransformers();
ParameterConverters parameterConverters = new ParameterConverters(tableTransformers)
.addConverters(customConverters(keywords, tableTransformers));
return new MostUsefulConfiguration()
.useKeywords(keywords)
.useStepCollector(new MarkUnmatchedStepsAsPending(keywords))
.useStoryParser(new RegexStoryParser(keywords, tableTransformers))
.useStoryLoader(new LoadFromClasspath(classLoader))
.useStoryReporterBuilder(new StoryReporterBuilder()
.withCodeLocation(codeLocation)
.withPathResolver(new ResolveToSimpleName())
.withDefaultFormats()
.withFormats(CONSOLE, TXT, HTML, XML)
.withFailureTrace(false)
.withViewResources(properties)
.withKeywords(keywords))
.useParameterConverters(parameterConverters)
.useTableTransformers(tableTransformers);
}
private ParameterConverter[] customConverters(Keywords keywords, TableTransformers tableTransformers) {
List<ParameterConverter> converters = new ArrayList<ParameterConverter>();
converters.add(new NumberConverter(NumberFormat.getInstance(locale())));
converters.add(new ExamplesTableConverter(new ExamplesTableFactory(keywords, tableTransformers)));
return converters.toArray(new ParameterConverter[converters.size()]);
}
@Override
public List<CandidateSteps> candidateSteps() {
return new InstanceStepsFactory(configuration(), localizedSteps(), new BeforeAfterSteps())
.createCandidateSteps();
}
@Override
protected List<String> storyPaths() {
return new StoryFinder().findPaths(codeLocationFromClass(this.getClass()), storyPattern(), "");
}
protected abstract Locale locale();
protected abstract String storyPattern();
protected abstract Object localizedSteps();
}