package org.codefx.demo.junit5.injection;

import org.codefx.demo.junit5.RandomIntegerResolver;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;

public class CustomInjectionInVariousTests {

	@Test
	@ExtendWith(RandomIntegerResolver.class)
	void regular(int randomized) {
		System.out.println("Random integer: " + randomized);
	}

	@TestFactory
	@ExtendWith(RandomIntegerResolver.class)
	Stream<DynamicTest> dynamic(int randomized) {
		return Stream.of(
				dynamicTest("#1", () -> System.out.println("Random integer: " + randomized)),
				dynamicTest("#2", () -> System.out.println("Random integer: " + randomized))
		);
	}

	@ParameterizedTest
	@MethodSource
	@ExtendWith(RandomIntegerResolver.class)
	void parameterized(String param, int randomized) {
		System.out.println("Random integer: " + randomized);
		assertTrue(true);
	}

	private static Stream<String> parameterized() {
		return Stream.of("first", "second");
	}

	@RepeatedTest(5)
	@ExtendWith(RandomIntegerResolver.class)
	void repeated(int randomized) {
		System.out.println("Random integer: " + randomized);
		assertTrue(true);
	}

}