package junitparams;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.*;

import org.junit.*;
import org.junit.runner.*;

import junitparams.usage.person_example.*;

@RunWith(JUnitParamsRunner.class)
public class CastingParamsTest {

    @Test
    @Parameters
    public void wrapWithTypeBySingleArgConstructor(PersonTest.Person person) {
        assertThat(person.getAge()).isGreaterThan(0);
    }
    List<Integer> parametersForWrapWithTypeBySingleArgConstructor() {
        return Arrays.asList(1, 2);
    }

    @Test
    @Parameters
    public void wrapWithTypeByMultiArgConstructor(PersonTest.Person person) {
        assertThat(person.getAge()).isGreaterThan(0);
    }
    Object parametersForWrapWithTypeByMultiArgConstructor() {
        return new Object[]{new Object[]{"first", 1}, new Object[]{"second", 2}};
    }

    @Test
    @Parameters
    public void cartoonCharacters(PersonTest.Person character) {
        assertThat(character.getName()).isIn("Tarzan", "Jane");
        assertThat(character.getAge()).isIn(0, 20);
    }

    private List<?> parametersForCartoonCharacters() {
        return Arrays.asList(
                new Object[]{"Tarzan", 0},
                new Object[]{"Jane", 20}
            );
    }

    @Test
    @Parameters(method = "strings")
    public void stringArrayFromMethod(String... values) {
        assertThat(values).containsOnlyOnce("1", "2");
    }
    private Object strings() {
        return new Object[]{new Object[]{"1", "2"}, new Object[]{"2", "1"}};
    }

    @Test
    @Parameters({"a,b", "b,a"})
    public void stringArrayFromAnnotation(String... values) {
        assertThat(values).containsOnlyOnce("a","b");
    }

}