package net.time4j.tz.olson;
import net.time4j.Moment;
import net.time4j.format.Attributes;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.Iso8601Format;
import net.time4j.format.expert.PatternType;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Locale;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(Parameterized.class)
public class LocalizedGMTOffsetTest {
@Parameterized.Parameters
(name= "{index}: "
+ "(pattern={0},locale={1},timezone={2},value={3},text={4},noGMTPrefix={5})")
public static Iterable<Object[]> data() {
return Arrays.asList(
new Object[][] {
{"uuuu-MM-dd'T'HH:mm:ss.SSS OOOO",
"sq",
"UTC",
"2012-06-30T23:59:60,123000000Z",
"2012-06-30T23:59:60.123 Ora e Grinuiçit",
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSS OOOO",
"sq",
"Europe/Berlin",
"2012-06-30T23:59:60,123000000Z",
"2012-07-01T01:59:60.123 Ora e Grinuiçit: +02:00",
false},
{"uuuu-MM-dd HH:mm:ss OOOO",
"fa",
"Asia/Tehran", // +04:30
"2012-06-30T23:59:60Z",
"۲۰۱۲-۰۷-۰۱ ۰۴:۲۹:۶۰ \u200E+۰۴:۳۰ گرینویچ",
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSS OOOO",
"no",
"Europe/Oslo",
"2012-06-30T23:59:60,123000000Z",
"2012-07-01T01:59:60.123 GMT+02:00",
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSS OOOO",
"fr",
"Europe/Paris",
"2012-06-30T23:59:60,123000000Z",
"2012-07-01T01:59:60.123 UTC+02:00",
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSSOOOO",
"in",
"Asia/Kolkata",
"2012-06-30T23:59:60,123000000Z",
"2012-07-01T05:29:60.123GMT+05:30",
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSSOOOO",
"ar",
"Asia/Kolkata",
"2012-06-30T23:59:60,123000000Z",
"٢٠١٢-٠٧-٠١T٠٥:٢٩:٦٠.١٢٣جرينتش\u061C+٠٥:٣٠", // with ALM-marker
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSSOOOO",
"ar-DZ",
"Asia/Kolkata",
"2012-06-30T23:59:60,123000000Z",
"2012-07-01T05:29:60.123جرينتش\u061C+05:30", // with ALM-marker
false},
{"uuuu-MM-dd'T'HH:mm:ss.SSSOOOO",
"ar-DZ",
"Asia/Kolkata",
"2012-06-30T23:59:60,123000000Z",
"2012-07-01T05:29:60.123\u061C+05:30", // with ALM-marker
true},
{"uuuu-MM-dd'T'HH:mm:ssOOOO",
"en-ARABEXT", // language en makes sure not to use bidi chars for sign representation
"UTC",
"2015-11-02T18:44:34Z",
"۲۰۱۵-۱۱-۰۲T۱۸:۴۴:۳۴+۰۰:۰۰",
true},
}
);
}
private ChronoFormatter<Moment> formatter;
private Moment value;
private String text;
public LocalizedGMTOffsetTest(
String pattern,
String locale,
String tzid,
String value,
String text,
boolean noGMTPrefix
) throws ParseException {
super();
this.formatter =
ChronoFormatter.setUp(Moment.class, toLocale(locale))
.addPattern(pattern, PatternType.CLDR).build()
.withTimezone(tzid)
.with(Attributes.NO_GMT_PREFIX, noGMTPrefix);
if (locale.endsWith("-ARABEXT")) {
this.formatter = this.formatter.with(Attributes.ZERO_DIGIT, '۰');
}
this.value = Iso8601Format.EXTENDED_DATE_TIME_OFFSET.parse(value);
this.text = text;
}
@Test
public void print() {
assertThat(
this.formatter.format(this.value),
is(this.text));
}
@Test
public void parse() throws ParseException {
assertThat(
this.formatter.parse(this.text),
is(this.value));
}
private static Locale toLocale(String locale) {
if (locale.startsWith("en")) {
return Locale.UK;
} else if (locale.equals("in")) {
return new Locale("en", "IN");
} else if (locale.equals("ar")) {
return new Locale("ar");
} else if (locale.equals("ar-DZ")) {
return new Locale("ar", "DZ");
}
return new Locale(locale, locale.toUpperCase());
}
}