/*
* 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.facebook.presto.spi.type;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import org.testng.annotations.Test;
import java.nio.charset.StandardCharsets;
import java.util.Comparator;
import java.util.SortedSet;
import static com.facebook.presto.spi.type.TimeZoneKey.MAX_TIME_ZONE_KEY;
import static com.facebook.presto.spi.type.TimeZoneKey.UTC_KEY;
import static java.util.Locale.ENGLISH;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
public class TestTimeZoneKey
{
private static final TimeZoneKey PLUS_7_KEY = TimeZoneKey.getTimeZoneKeyForOffset(7 * 60);
private static final TimeZoneKey MINUS_7_KEY = TimeZoneKey.getTimeZoneKeyForOffset(-7 * 60);
@Test
public void testUTC()
throws Exception
{
assertEquals(UTC_KEY.getKey(), 0);
assertEquals(UTC_KEY.getId(), "UTC");
assertSame(TimeZoneKey.getTimeZoneKey((short) 0), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC"), UTC_KEY);
// verify UTC equivalent zones map to UTC
assertSame(TimeZoneKey.getTimeZoneKey("Z"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Zulu"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("zulu"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("ZULU"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UCT"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Universal"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT+00:00"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT-00:00"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("+00:00"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("-00:00"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/utc"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/gmt"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/gmt+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/gmt+00:00"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/gmt-00:00"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/ut"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/UT"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/UCT"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("etc/Universal"), UTC_KEY);
}
@Test
public void testHourOffsetZone()
throws Exception
{
assertSame(TimeZoneKey.getTimeZoneKey("GMT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("GMT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("UTC-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/GMT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UT-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC+0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC-0"), UTC_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC-7"), MINUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC+7"), PLUS_7_KEY);
assertSame(TimeZoneKey.getTimeZoneKey("Etc/UTC-7"), MINUS_7_KEY);
}
@Test
public void testZoneKeyLookup()
throws Exception
{
for (TimeZoneKey timeZoneKey : TimeZoneKey.getTimeZoneKeys()) {
assertSame(TimeZoneKey.getTimeZoneKey(timeZoneKey.getKey()), timeZoneKey);
assertSame(TimeZoneKey.getTimeZoneKey(timeZoneKey.getId()), timeZoneKey);
assertSame(TimeZoneKey.getTimeZoneKey(timeZoneKey.getId().toUpperCase(ENGLISH)), timeZoneKey);
assertSame(TimeZoneKey.getTimeZoneKey(timeZoneKey.getId().toLowerCase(ENGLISH)), timeZoneKey);
}
}
@Test
public void testMaxTimeZoneKey()
{
boolean foundMax = false;
for (TimeZoneKey timeZoneKey : TimeZoneKey.getTimeZoneKeys()) {
assertTrue(timeZoneKey.getKey() <= MAX_TIME_ZONE_KEY, timeZoneKey + " key is larger than max key " + MAX_TIME_ZONE_KEY);
foundMax = foundMax || (timeZoneKey.getKey() == MAX_TIME_ZONE_KEY);
}
assertTrue(foundMax, "Did not find a time zone with the MAX_TIME_ZONE_KEY");
}
@Test
public void testZoneKeyIdRange()
throws Exception
{
boolean[] hasValue = new boolean[MAX_TIME_ZONE_KEY + 1];
for (TimeZoneKey timeZoneKey : TimeZoneKey.getTimeZoneKeys()) {
short key = timeZoneKey.getKey();
assertTrue(key >= 0, timeZoneKey + " has a negative time zone key");
assertFalse(hasValue[key], "Another time zone has the same zone key as " + timeZoneKey);
hasValue[key] = true;
}
for (int i = 0; i < hasValue.length; i++) {
assertTrue(hasValue[i], "There is no time zone with key " + i);
}
}
@Test
public void testZoneKeyData()
throws Exception
{
Hasher hasher = Hashing.murmur3_128().newHasher();
SortedSet<TimeZoneKey> timeZoneKeysSortedByKey = ImmutableSortedSet.copyOf(new Comparator<TimeZoneKey>()
{
@Override
public int compare(TimeZoneKey left, TimeZoneKey right)
{
return Short.compare(left.getKey(), right.getKey());
}
}, TimeZoneKey.getTimeZoneKeys());
for (TimeZoneKey timeZoneKey : timeZoneKeysSortedByKey) {
hasher.putShort(timeZoneKey.getKey());
hasher.putString(timeZoneKey.getId(), StandardCharsets.UTF_8);
}
// Zone file should not (normally) be changed, so let's make is more difficult
assertEquals(hasher.hash().asLong(), 5498515770239515435L, "zone-index.properties file contents changed!");
}
}