import static org.junit.Assert.assertEquals;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class DateTest {

    private static final String DATE_PREFIX = "1582-10-";
    private static final String DATE_SUFFIX = "T00:00";

    private final ZoneId zoneId = ZoneId.of("UTC");
    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

    private final int day;

    public DateTest(int day) {
        this.day = day;
    }

    @Parameters(name = "{index} -> day: {0}")
    public static List<Integer> parameters() {
        return Arrays.asList(13, 14, 15, 16, 17);
    }

    @Test
    public void testDateFromInstant() {
        String dayString = Integer.toString(day);
        while (dayString.length() < 2) {
            dayString = "0" + dayString;
        }

        String dateString = DATE_PREFIX + dayString;
        String dateTimeString = dateString + DATE_SUFFIX;

        LocalDateTime localDateTime = LocalDateTime.parse(dateTimeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        Instant instant = localDateTime.atZone(zoneId).toInstant();
        Date date = Date.from(instant);
        String formattedDate = dateFormat.format(date);
        assertEquals(dateString + " != " + formattedDate, dateString, formattedDate);
    }
}