package org.junit.tests.experimental.theories.runner;

import static org.junit.Assert.assertThat;
import static org.junit.experimental.results.PrintableResult.testResult;
import static org.junit.experimental.results.ResultMatchers.isSuccessful;

import org.junit.Test;
import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;

public class TypeMatchingBetweenMultiDataPointsMethod {

    @RunWith(Theories.class)
    public static class WithWrongfullyTypedDataPointsMethod {
        @DataPoint
        public static String[] correctlyTyped = {"Good", "Morning"};

        @DataPoints
        public static String[] wrongfullyTyped() {
            return new String[]{"Hello", "World"};
        }

        @Theory
        public void testTheory(String[] array) {
        }
    }

    @Test
    public void ignoreWrongTypedDataPointsMethod() {
        assertThat(testResult(WithWrongfullyTypedDataPointsMethod.class), isSuccessful());
    }

    @RunWith(Theories.class)
    public static class WithCorrectlyTypedDataPointsMethod {
        @DataPoint
        public static String[] correctlyTyped = {"Good", "Morning"};

        @DataPoints
        public static String[][] anotherCorrectlyTyped() {
            return new String[][]{
                    {"Hello", "World"}
            };
        }

        @Theory
        public void testTheory(String[] array) {
        }
    }

    @Test
    public void pickUpMultiPointDataPointMethods() throws Exception {
        assertThat(testResult(WithCorrectlyTypedDataPointsMethod.class), isSuccessful());
    }
}
