parent
3709ddfdbe
commit
91cc7f7f54
@ -0,0 +1,74 @@ |
|||||||
|
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar; |
||||||
|
|
||||||
|
import java.time.DayOfWeek; |
||||||
|
import java.time.LocalDate; |
||||||
|
import java.time.Month; |
||||||
|
import java.time.YearMonth; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public class WeeksOfMonth { |
||||||
|
|
||||||
|
private static final List<DayOfWeek> ORDERED_WEEKDAY = Arrays.asList(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY); |
||||||
|
private final YearMonth yearMonth; |
||||||
|
private final List<Map<DayOfWeek, Integer>> weeks; |
||||||
|
|
||||||
|
public WeeksOfMonth(Month month, int year) { |
||||||
|
this(YearMonth.of(year, month)); |
||||||
|
} |
||||||
|
|
||||||
|
public WeeksOfMonth(YearMonth month) { |
||||||
|
this.yearMonth = month; |
||||||
|
weeks = Collections.unmodifiableList(createWeeks()); |
||||||
|
} |
||||||
|
|
||||||
|
private List<Map<DayOfWeek, Integer>> createWeeks() { |
||||||
|
LocalDate day = yearMonth.atDay(1); |
||||||
|
|
||||||
|
List<Map<DayOfWeek, Integer>> result = new ArrayList<>(); |
||||||
|
Map<DayOfWeek, Integer> currentWeek = new HashMap<>(); |
||||||
|
|
||||||
|
int monthValue = yearMonth.getMonthValue(); |
||||||
|
while (day.getMonthValue() == monthValue) { |
||||||
|
|
||||||
|
for (DayOfWeek d: ORDERED_WEEKDAY) { |
||||||
|
if (d.equals(day.getDayOfWeek()) && day.getMonthValue() == monthValue) { |
||||||
|
currentWeek.put(d, day.getDayOfMonth()); |
||||||
|
day = day.plusDays(1); |
||||||
|
} else { |
||||||
|
currentWeek.put(d, null); |
||||||
|
} |
||||||
|
} |
||||||
|
result.add(Collections.unmodifiableMap(currentWeek)); |
||||||
|
currentWeek = new HashMap<>(); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public int dayCount() { |
||||||
|
return yearMonth.lengthOfMonth(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Week in Month >=0 && < {@link #weekCount()} depending on day count and weekday order. |
||||||
|
* @param index |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public Map<DayOfWeek, Integer> getWeek(int index) { |
||||||
|
return weeks.get(index); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Count of week (parts) in this month. |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public int weekCount() { |
||||||
|
return weeks.size(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,54 @@ |
|||||||
|
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components.calendar; |
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals; |
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull; |
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull; |
||||||
|
|
||||||
|
import java.time.DayOfWeek; |
||||||
|
import java.time.Month; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
class WeeksOfMonthTest { |
||||||
|
|
||||||
|
@Test |
||||||
|
void test2018November() { |
||||||
|
WeeksOfMonth november = new WeeksOfMonth(Month.NOVEMBER, 2018); |
||||||
|
assertNotNull(november); |
||||||
|
assertEquals(30, november.dayCount()); |
||||||
|
assertEquals(5, november.weekCount()); |
||||||
|
Map<DayOfWeek, Integer> week = november.getWeek(0); |
||||||
|
assertNotNull(week); |
||||||
|
assertEquals(7, week.size()); |
||||||
|
assertNull(week.get(DayOfWeek.MONDAY)); |
||||||
|
assertNull(week.get(DayOfWeek.TUESDAY)); |
||||||
|
assertNull(week.get(DayOfWeek.WEDNESDAY)); |
||||||
|
assertEquals(1, week.get(DayOfWeek.THURSDAY).intValue()); |
||||||
|
assertEquals(2, week.get(DayOfWeek.FRIDAY).intValue()); |
||||||
|
assertEquals(4, week.get(DayOfWeek.SUNDAY).intValue()); |
||||||
|
|
||||||
|
week = november.getWeek(4); |
||||||
|
assertEquals(26, week.get(DayOfWeek.MONDAY).intValue()); |
||||||
|
assertEquals(27, week.get(DayOfWeek.TUESDAY).intValue()); |
||||||
|
assertEquals(28, week.get(DayOfWeek.WEDNESDAY).intValue()); |
||||||
|
assertEquals(29, week.get(DayOfWeek.THURSDAY).intValue()); |
||||||
|
assertEquals(30, week.get(DayOfWeek.FRIDAY).intValue()); |
||||||
|
assertNull(week.get(DayOfWeek.SATURDAY)); |
||||||
|
assertNull(week.get(DayOfWeek.SUNDAY)); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
void testLastDayOfMonthIsMonday() { |
||||||
|
WeeksOfMonth april = new WeeksOfMonth(Month.APRIL, 2018); |
||||||
|
assertEquals(6, april.weekCount()); |
||||||
|
|
||||||
|
Map<DayOfWeek, Integer> week = april.getWeek(0); |
||||||
|
assertNull(week.get(DayOfWeek.SATURDAY)); |
||||||
|
assertEquals(1, week.get(DayOfWeek.SUNDAY).intValue()); |
||||||
|
week = april.getWeek(5); |
||||||
|
assertEquals(30, week.get(DayOfWeek.MONDAY).intValue()); |
||||||
|
assertNull(week.get(DayOfWeek.TUESDAY)); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue