import java.util.Set;
import java.util.NavigableMap;
import java.time.ZoneId;
import java.time.zone.ZoneRules;
import java.time.zone.ZoneRulesProvider;
import java.time.zone.ZoneRulesException;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;

class ZoneRulesProviderTest {
    private static final String ZONE = "MyZone";
    @Test void registerProviderTwice() {
        // setup
        ZoneRulesProvider zrp = new ZoneRulesProvider() {
            @Override protected Set<String> provideZoneIds() {
                return Set.of(ZONE);
            }
            @Override protected ZoneRules provideRules(String zoneId, boolean forCaching) {
                return null;
            }
            @Override protected NavigableMap<String, ZoneRules> provideVersions(String zoneId) {
                return null;
            }
        };
        assertFalse(ZoneId.getAvailableZoneIds().contains(ZONE));
        ZoneRulesProvider.registerProvider(zrp);
        assertTrue(ZoneId.getAvailableZoneIds().contains(ZONE));
        assertNotNull(ZoneId.of(ZONE));

        // exercise
        assertThrows(ZoneRulesException.class, () -> ZoneRulesProvider.registerProvider(zrp));

        // verify - these will fail
        assertTrue(ZoneId.getAvailableZoneIds().contains(ZONE));
        assertNotNull(ZoneId.of(ZONE));
    }
}
