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