package junitparams.custom;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import org.junit.Test;
import org.junit.runner.RunWith;

import junitparams.JUnitParamsRunner;

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

@RunWith(JUnitParamsRunner.class)
public class CustomParametersProviderTest {

    @Test
    @CustomParameters(provider = SimpleHelloProvider.class)
    public void runWithParametersFromCustomProvider(String param) {
        assertThat(param).isEqualTo("hello");
    }

    @Test
    @HelloParameters(hello = "Hi")
    public void runWithParametersFromCustomAnnotation(String param) {
        assertThat(param).isEqualTo("Hi");
    }


    @Retention(RetentionPolicy.RUNTIME)
    @CustomParameters(provider = CustomHelloProvider.class)
    public @interface HelloParameters {
        String hello();
    }

    public static class SimpleHelloProvider implements ParametersProvider<CustomParameters> {
        @Override
        public void initialize(CustomParameters parametersAnnotation) {
        }

        @Override
        public Object[] getParameters() {
            return new Object[]{"hello", "hello"};
        }
    }

    public static class CustomHelloProvider implements ParametersProvider<HelloParameters> {

        private String hello;

        @Override
        public void initialize(HelloParameters parametersAnnotation) {
            hello = parametersAnnotation.hello();
        }

        @Override
        public Object[] getParameters() {
            return new Object[]{hello, hello};
        }
    }
}