package net.time4j.calendar;
import net.time4j.PlainDate;
import net.time4j.Weekday;
import net.time4j.Weekmodel;
import net.time4j.engine.ChronoElement;
import net.time4j.format.Leniency;
import net.time4j.format.NumericalElement;
import net.time4j.format.expert.ChronoFormatter;
import net.time4j.format.expert.PatternType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.util.Locale;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
@RunWith(JUnit4.class)
public class WeekCalculationTest {
@Test
public void name() {
assertThat(
CommonElements.weekOfYear(HijriCalendar.family(), Weekmodel.ISO).name(),
is("WEEK_OF_YEAR"));
assertThat(
CommonElements.weekOfMonth(HijriCalendar.family(), Weekmodel.ISO).name(),
is("WEEK_OF_MONTH"));
assertThat(
CommonElements.localDayOfWeek(HijriCalendar.family(), Weekmodel.ISO).name(),
is("LOCAL_DAY_OF_WEEK"));
}
@Test
public void type() {
assertThat(
CommonElements.weekOfYear(HijriCalendar.family(), Weekmodel.ISO).getType().equals(Integer.class),
is(true));
assertThat(
CommonElements.weekOfMonth(HijriCalendar.family(), Weekmodel.ISO).getType().equals(Integer.class),
is(true));
assertThat(
CommonElements.localDayOfWeek(HijriCalendar.family(), Weekmodel.ISO).getType().equals(Weekday.class),
is(true));
}
@Test
public void getWeekOfYearISO() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11);
ChronoElement<Integer> element = CommonElements.weekOfYear(HijriCalendar.family(), Weekmodel.ISO);
assertThat(
hijri.get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 10).get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 9).get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 8).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 7).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 6).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 5).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 4).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 3).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 2).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 1).get(element),
is(51));
}
@Test
public void getWeekOfYearIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
ChronoElement<Integer> element = CommonElements.weekOfYear(HijriCalendar.family(), model);
assertThat(
hijri.get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 10).get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 9).get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 8).get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 7).get(element),
is(2));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 6).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 5).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 4).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 3).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 2).get(element),
is(1));
assertThat(
hijri.with(HijriCalendar.DAY_OF_MONTH, 1).get(element),
is(1));
}
@Test
public void getWeekOfYearThai() {
ThaiSolarCalendar thai = PlainDate.of(1940, 4, 11).transform(ThaiSolarCalendar.class); // Thursday
Weekmodel model = ThaiSolarCalendar.getDefaultWeekmodel();
ChronoElement<Integer> element = CommonElements.weekOfYear(ThaiSolarCalendar.axis(), model);
assertThat(
thai.get(element),
is(2));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 10).get(element),
is(2));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 9).get(element),
is(2));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 8).get(element),
is(2));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 7).get(element), // Sunday
is(2));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 6).get(element),
is(1));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 5).get(element),
is(1));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 4).get(element),
is(1));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 3).get(element),
is(1));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 2).get(element),
is(1));
assertThat(
thai.with(ThaiSolarCalendar.DAY_OF_MONTH, 1).get(element),
is(1));
}
@Test
@SuppressWarnings("unchecked")
public void getLocalDayOfWeekIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
NumericalElement.class.cast(CommonElements.localDayOfWeek(HijriCalendar.family(), model))
.numerical(hijri.getDayOfWeek()),
is(5));
assertThat(
hijri.get(CommonElements.localDayOfWeek(HijriCalendar.family(), model)),
is(Weekday.WEDNESDAY));
}
@Test
public void minimizeLocalDayOfWeekIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.localDayOfWeek(HijriCalendar.family(), model).minimized()),
is(HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 7)));
}
@Test
public void maximizeLocalDayOfWeekIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.localDayOfWeek(HijriCalendar.family(), model).maximized()),
is(HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 13)));
}
@Test
public void minimizeWeekOfYearISO() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.ISO;
HijriCalendar expected = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 4);
assertThat(
hijri.with(CommonElements.weekOfYear(HijriCalendar.family(), model).minimized()),
is(expected));
assertThat(
hijri.getDayOfWeek(),
is(expected.getDayOfWeek()));
}
@Test
public void maximizeWeekOfYearISO() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1437, 1, 11); // Saturday
Weekmodel model = Weekmodel.ISO;
HijriCalendar expected = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1437, 12, 29);
assertThat(
hijri.with(CommonElements.weekOfYear(HijriCalendar.family(), model).maximized()),
is(expected));
assertThat(
hijri.getDayOfWeek(),
is(expected.getDayOfWeek()));
}
@Test
public void getMaximumWeekOfYearThai() {
ThaiSolarCalendar thai = PlainDate.of(1940, 4, 11).transform(ThaiSolarCalendar.class); // Thursday
Weekmodel model = ThaiSolarCalendar.getDefaultWeekmodel();
StdCalendarElement<Integer, ThaiSolarCalendar> element =
CommonElements.weekOfYear(ThaiSolarCalendar.axis(), model);
assertThat(
thai.getMaximum(element),
is(39));
assertThat(
thai.with(element.maximized()),
is(PlainDate.of(1940, 12, 26).transform(ThaiSolarCalendar.class)));
ThaiSolarCalendar thai2 = PlainDate.of(1940, 12, 31).transform(ThaiSolarCalendar.class); // Tuesday
assertThat(
thai2.get(element),
is(1));
assertThat(
thai2.with(ThaiSolarCalendar.DAY_OF_MONTH, 30).get(element),
is(1));
assertThat(
thai2.with(ThaiSolarCalendar.DAY_OF_MONTH, 29).get(element),
is(1));
assertThat(
thai2.with(ThaiSolarCalendar.DAY_OF_MONTH, 28).get(element),
is(39));
}
@Test
public void floorWeekOfYearISO() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
HijriCalendar expected = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 7);
assertThat(
hijri.with(CommonElements.weekOfYear(HijriCalendar.family(), model).atFloor()),
is(expected));
}
@Test
public void ceilingWeekOfYearISO() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
HijriCalendar expected = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 13);
assertThat(
hijri.with(CommonElements.weekOfYear(HijriCalendar.family(), model).atCeiling()),
is(expected));
}
@Test
public void incrementLocalDayOfWeekIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.localDayOfWeek(HijriCalendar.family(), model).incremented()),
is(hijri.nextDay()));
}
@Test
public void incrementWeekOfMonthIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.weekOfMonth(HijriCalendar.family(), model).incremented()),
is(hijri.with(HijriCalendar.DAY_OF_MONTH, 18)));
}
@Test
public void incrementWeekOfYearIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.weekOfYear(HijriCalendar.family(), model).incremented()),
is(hijri.with(HijriCalendar.DAY_OF_MONTH, 18)));
}
@Test
public void decrementLocalDayOfWeekIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.localDayOfWeek(HijriCalendar.family(), model).decremented()),
is(hijri.with(HijriCalendar.DAY_OF_MONTH, 10)));
}
@Test
public void decrementWeekOfMonthIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.weekOfMonth(HijriCalendar.family(), model).decremented()),
is(hijri.with(HijriCalendar.DAY_OF_MONTH, 4)));
}
@Test
public void decrementWeekOfYearIR() {
HijriCalendar hijri = HijriCalendar.of(HijriAlgorithm.WEST_ISLAMIC_ASTRO, 1438, 1, 11); // Wednesday
Weekmodel model = Weekmodel.of(Weekday.SATURDAY, 1);
assertThat(
hijri.with(CommonElements.weekOfYear(HijriCalendar.family(), model).decremented()),
is(hijri.with(HijriCalendar.DAY_OF_MONTH, 4)));
}
@Test
public void getDisplayNameOfWeekOfYear() {
assertThat(
CommonElements.weekOfYear(
HijriCalendar.family(),
Weekmodel.ISO
).getDisplayName(Locale.GERMAN),
is("Woche"));
}
@Test
public void getDisplayNameOfWeekOfMonth() {
assertThat(
CommonElements.weekOfMonth(
HijriCalendar.family(),
Weekmodel.ISO
).getDisplayName(Locale.GERMAN),
is("Woche"));
}
@Test
public void getDisplayNameOfLocalDayOfWeek() {
assertThat(
CommonElements.localDayOfWeek(
HijriCalendar.family(),
Weekmodel.ISO
).getDisplayName(Locale.GERMAN),
is("Wochentag"));
}
@Test
public void printWeekElementsThai() {
ThaiSolarCalendar thai = PlainDate.of(1940, 12, 28).transform(ThaiSolarCalendar.class); // Saturday
ChronoFormatter<ThaiSolarCalendar> cf =
ChronoFormatter.ofPattern("y w W ee c", PatternType.NON_ISO_DATE, Locale.ENGLISH, ThaiSolarCalendar.axis());
assertThat(cf.format(thai), is("2483 39 4 07 7"));
ChronoFormatter<ThaiSolarCalendar> cf2 =
ChronoFormatter.ofPattern("y ww W ee c", PatternType.CLDR, Locale.ENGLISH, ThaiSolarCalendar.axis());
assertThat(cf2.format(thai), is("2483 39 4 07 7"));
}
@Test
public void parseWeekElementsThai() throws ParseException {
ThaiSolarCalendar thai = PlainDate.of(1940, 12, 28).transform(ThaiSolarCalendar.class); // Saturday
ChronoFormatter<ThaiSolarCalendar> cf =
ChronoFormatter.ofPattern(
"G-yyyy-MM-dd w W ee c", PatternType.NON_ISO_DATE, Locale.ENGLISH, ThaiSolarCalendar.axis());
assertThat(
cf.with(Leniency.STRICT).parse("BE-2483-12-28 39 4 07 7"),
is(thai));
try {
cf.with(Leniency.STRICT).parse("BE-2483-12-28 39 4 07 6");
fail("Should fail due to parse exception because of ambivalent local-day-of-week.");
} catch (ParseException pe) {
// expected
}
}
@Test
public void serialization() throws IOException, ClassNotFoundException {
roundtrip(CommonElements.localDayOfWeek(HijriCalendar.family(), Weekmodel.ISO));
roundtrip(CommonElements.localDayOfWeek(PersianCalendar.axis(), Weekmodel.of(new Locale("fa", "IR"))));
roundtrip(CommonElements.weekOfMonth(HijriCalendar.family(), Weekmodel.ISO));
roundtrip(CommonElements.weekOfMonth(PersianCalendar.axis(), Weekmodel.of(new Locale("fa", "IR"))));
roundtrip(CommonElements.weekOfYear(HijriCalendar.family(), Weekmodel.ISO));
roundtrip(CommonElements.weekOfYear(PersianCalendar.axis(), Weekmodel.of(new Locale("fa", "IR"))));
}
private static void roundtrip(Object obj)
throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
byte[] data = baos.toByteArray();
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ObjectInputStream ois = new ObjectInputStream(bais);
assertThat(ois.readObject(), is(obj));
ois.close();
}
}