package io.github.sskorol.testcases;

import io.github.sskorol.core.DataSupplier;
import io.github.sskorol.datasuppliers.ExternalDataSuppliers;
import io.github.sskorol.entities.User;
import one.util.streamex.IntStreamEx;
import one.util.streamex.StreamEx;
import org.testng.annotations.Test;

import java.util.stream.IntStream;
import java.util.stream.Stream;

import static java.util.Arrays.asList;
import static java.util.Comparator.comparing;

public class StreamsDataSupplierTests {

    @DataSupplier
    public Stream<Integer> getPrimitiveStreamData() {
        return IntStream.range(0, 10)
            .filter(d -> d % 2 == 0)
            .boxed();
    }

    @DataSupplier(transpose = true)
    public Stream<User> extractCustomStreamData() {
        return Stream.of(
            new User("Petya", "password2"),
            new User("Virus Petya", "password3"),
            new User("Mark", "password1"))
            .filter(u -> !u.getName().contains("Virus"))
            .sorted(comparing(User::getPassword));
    }

    @DataSupplier
    public StreamEx<String> getCustomStreamData() {
        return StreamEx.of(
            new User("user2", "password2"),
            new User("user3", "password3"),
            new User("user1", "password1"))
            .map(User::getName)
            .sorted()
            .skip(1);
    }

    @DataSupplier(flatMap = true)
    public StreamEx getInternallyExtractedStreamData() {
        return StreamEx.of(asList("name1", "password1"), asList("name2", "password2"));
    }

    @DataSupplier(indices = {-1, 0, 2, 4, 6, 8, 10})
    public StreamEx getFilteredByIndicesData() {
        return IntStreamEx.range(0, 10).boxed();
    }

    @Test(dataProvider = "getPrimitiveStreamData")
    public void supplyPrimitiveStreamData(final int ob) {
        // not implemented
    }

    @Test(dataProvider = "extractCustomStreamData")
    public void supplyExtractedCustomStreamData(final User user1, final User user2) {
        // not implemented
    }

    @Test(dataProvider = "getCustomStreamData")
    public void supplyCustomStreamData(final String ob) {
        // not implemented
    }

    @Test(dataProviderClass = ExternalDataSuppliers.class, dataProvider = "getExternalStreamData")
    public void supplyExternalStreamData(final long ob) {
        // not implemented
    }

    @Test(dataProvider = "getInternallyExtractedStreamData")
    public void supplyInternallyExtractedStreamData(final String ob1, String ob2) {
        // not implemented
    }

    @Test(dataProvider = "getFilteredByIndicesData")
    public void supplyFilteredByIndicesData(final int ob) {
        // not implemented
    }
}