All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.kidsoncoffee.cheesecakes.runner.domain.ExampleRunner Maven / Gradle / Ivy

package com.kidsoncoffee.cheesecakes.runner.domain;

import com.kidsoncoffee.cheesecakes.Example;
import com.kidsoncoffee.cheesecakes.runner.InvokeExampleMethod;
import com.kidsoncoffee.cheesecakes.runner.parameter.ParameterConvertibleCreator;
import com.kidsoncoffee.cheesecakes.runner.parameter.ExampleParametersResolver;
import com.kidsoncoffee.cheesecakes.runner.parameter.converter.CustomConverterExtractor;
import com.kidsoncoffee.cheesecakes.runner.parameter.converter.DefaultConverterExtractor;
import com.kidsoncoffee.cheesecakes.runner.parameter.converter.DefaultParameterConverters;
import com.kidsoncoffee.cheesecakes.runner.parameter.converter.ParameterConverterResolver;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.Description;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static java.lang.String.format;

/**
 * Provides a {@link BlockJUnit4ClassRunner}. In this case representing an example.
 *
 * @author fernando.chovich
 * @since 1.0
 */
public class ExampleRunner extends BlockJUnit4ClassRunner {

  /** The example. */
  private final Example.Builder example;

  /**
   * Constructs an example runner.
   *
   * @param featureClass The target feature class.
   * @param example The example.
   * @throws InitializationError If any error occurs while initializing the runner.
   */
  public ExampleRunner(final Class featureClass, final Example.Builder example)
      throws InitializationError {
    super(featureClass);
    this.example = example;
  }

  @Override
  protected String getName() {
    return this.example.getSchema().stream()
        .map(schema -> format("%s=%s", schema.getName(), this.example.getValue(schema.getName())))
        .collect(Collectors.joining(", "));
  }

  @Override
  protected Statement methodInvoker(FrameworkMethod method, Object test) {
    final CustomConverterExtractor customConverterExtractor = new CustomConverterExtractor();
    final DefaultConverterExtractor defaultConverterExtractor =
        new DefaultConverterExtractor(
            Arrays.stream(DefaultParameterConverters.values())
                .map(DefaultParameterConverters::getConverter)
                .collect(Collectors.toList()));

    final ParameterConverterResolver parameterConverterResolver =
        new ParameterConverterResolver(customConverterExtractor, defaultConverterExtractor);
    final ParameterConvertibleCreator parameterConvertibleCreator =
        new ParameterConvertibleCreator();

    final ExampleParametersResolver parametersResolver =
        new ExampleParametersResolver(parameterConverterResolver, parameterConvertibleCreator);

    return new InvokeExampleMethod(parametersResolver, method, test, this.example);
  }

  protected void validateInstanceMethods(List errors) {
    // SAME AS OVERRIDDEN
    validatePublicVoidNoArgMethods(After.class, false, errors);
    validatePublicVoidNoArgMethods(Before.class, false, errors);

    // TODO fchovich EXPAND VALIDATION
  }

  /**
   * Returns the methods that run the tests. The method has to:
   *
   * 
    *
  • Be annotated with @{@link Test} *
  • Match the name with the {@link Example.Builder#getScenarioMethodName()} *
* * @return All methods matching the criteria above. */ @Override protected List computeTestMethods() { return getTestClass().getAnnotatedMethods(Test.class).stream() .filter(t -> t.getName().equals(this.example.getScenarioMethodName())) .collect(Collectors.toList()); } @Override protected String testName(FrameworkMethod method) { return this.getName(); } @Override protected Description describeChild(FrameworkMethod method) { return Description.createTestDescription( this.getTestClass().getJavaClass().getName(), this.testName(method)); } /** * Returns the example. * * @return The example. */ public Example.Builder getExample() { return this.example; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy