blob: 64ec0fd0de008e32e7b7e68e6ac0f9e21b6a467d [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.i18n.test.timezone;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import com.android.i18n.timezone.CountryTimeZones;
import com.android.i18n.timezone.CountryTimeZones.TimeZoneMapping;
import com.android.i18n.timezone.CountryZonesFinder;
import android.icu.testsharding.MainTestShard;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
@MainTestShard
public class CountryZonesFinderTest {
private static final CountryTimeZones GB_ZONES = CountryTimeZones.createValidated(
"gb", "Europe/London", false /* defaultTimeZoneBoost */, true /* everUsesUtc */,
timeZoneMappings("Europe/London"), "test");
private static final CountryTimeZones IM_ZONES = CountryTimeZones.createValidated(
"im", "Europe/London", false /* defaultTimeZoneBoost */, true /* everUsesUtc */,
timeZoneMappings("Europe/London"), "test");
private static final CountryTimeZones FR_ZONES = CountryTimeZones.createValidated(
"fr", "Europe/Paris", false /* defaultTimeZoneBoost */, true /* everUsesUtc */,
timeZoneMappings("Europe/Paris"), "test");
private static final CountryTimeZones US_ZONES = CountryTimeZones.createValidated(
"us", "America/New_York", false /* defaultTimeZoneBoost */, false /* everUsesUtc */,
timeZoneMappings("America/New_York", "America/Los_Angeles"), "test");
@Test
public void lookupAllCountryIsoCodes() throws Exception {
CountryZonesFinder countryZonesFinder =
CountryZonesFinder.createForTests(list(GB_ZONES, FR_ZONES));
List<String> isoList = countryZonesFinder.lookupAllCountryIsoCodes();
assertEqualsAndImmutable(list(GB_ZONES.getCountryIso(), FR_ZONES.getCountryIso()), isoList);
}
@Test
public void lookupAllCountryIsoCodes_empty() throws Exception {
CountryZonesFinder countryZonesFinder = CountryZonesFinder.createForTests(list());
List<String> isoList = countryZonesFinder.lookupAllCountryIsoCodes();
assertEqualsAndImmutable(list(), isoList);
}
@Test
public void lookupCountryCodesForZoneId() throws Exception {
CountryZonesFinder countryZonesFinder =
CountryZonesFinder.createForTests(list(GB_ZONES, IM_ZONES, FR_ZONES, US_ZONES));
assertEqualsAndImmutable(list(GB_ZONES, IM_ZONES),
countryZonesFinder.lookupCountryTimeZonesForZoneId("Europe/London"));
assertEqualsAndImmutable(list(US_ZONES),
countryZonesFinder.lookupCountryTimeZonesForZoneId("America/New_York"));
assertEqualsAndImmutable(list(US_ZONES),
countryZonesFinder.lookupCountryTimeZonesForZoneId("America/Los_Angeles"));
assertEqualsAndImmutable(list(),
countryZonesFinder.lookupCountryTimeZonesForZoneId("DOES_NOT_EXIST"));
}
@Test
public void lookupCountryCodesForZoneId_alternativeIds() throws Exception {
TimeZoneMapping usesNewZoneId = timeZoneMappingWithAlts("America/Detroit",
list("US/Michigan"));
TimeZoneMapping usesOldZoneId = timeZoneMappingWithAlts("US/Central",
list("America/Chicago"));
CountryTimeZones countryWithAlternativeZones = CountryTimeZones.createValidated(
"us", "America/Detroit" /* defaultTimeZoneId */, false /* defaultTimeZoneBoost */,
false /* everUsesUtc */,
list(usesNewZoneId, usesOldZoneId),
"debug info");
CountryZonesFinder countryZonesFinder = CountryZonesFinder.createForTests(
list(GB_ZONES, IM_ZONES, FR_ZONES, countryWithAlternativeZones));
assertEqualsAndImmutable(list(countryWithAlternativeZones),
countryZonesFinder.lookupCountryTimeZonesForZoneId("America/Detroit"));
assertEqualsAndImmutable(list(countryWithAlternativeZones),
countryZonesFinder.lookupCountryTimeZonesForZoneId("US/Michigan"));
assertEqualsAndImmutable(list(countryWithAlternativeZones),
countryZonesFinder.lookupCountryTimeZonesForZoneId("US/Central"));
assertEqualsAndImmutable(list(countryWithAlternativeZones),
countryZonesFinder.lookupCountryTimeZonesForZoneId("America/Chicago"));
assertEqualsAndImmutable(list(),
countryZonesFinder.lookupCountryTimeZonesForZoneId("DOES_NOT_EXIST"));
}
@Test
public void lookupCountryTimeZones() throws Exception {
CountryZonesFinder countryZonesFinder =
CountryZonesFinder.createForTests(list(GB_ZONES, IM_ZONES, FR_ZONES, US_ZONES));
assertSame(GB_ZONES, countryZonesFinder.lookupCountryTimeZones(GB_ZONES.getCountryIso()));
assertSame(IM_ZONES, countryZonesFinder.lookupCountryTimeZones(IM_ZONES.getCountryIso()));
assertNull(countryZonesFinder.lookupCountryTimeZones("DOES_NOT_EXIST"));
}
private static <X> void assertEqualsAndImmutable(List<X> expected, List<X> actual) {
assertEquals(expected, actual);
assertImmutableList(actual);
}
private static <X> void assertImmutableList(List<X> list) {
try {
list.add(null);
fail();
} catch (UnsupportedOperationException expected) {
}
}
private static <X> List<X> list(X... values) {
return Arrays.asList(values);
}
/**
* Creates a list of default {@link TimeZoneMapping} objects with the specified time zone IDs.
*/
private static List<TimeZoneMapping> timeZoneMappings(String... timeZoneIds) {
return Arrays.stream(timeZoneIds)
.map(x -> timeZoneMappingWithAlts(x, Collections.emptyList()))
.collect(Collectors.toList());
}
/**
* Creates a {@link TimeZoneMapping} object with the specified time zone ID and alternative IDs.
*/
private static TimeZoneMapping timeZoneMappingWithAlts(
String timeZoneId, List<String> alternativeIds) {
return TimeZoneMapping.createForTests(
timeZoneId, true /* picker */, null /* notUsedAfter */, alternativeIds);
}
}