Repository: focus-shift/jollyday (java)

Issue:
Zurich: Easter Monday is no longer considered a holiday
### Affected country

Switzerland

### Affected public holiday

Easter Monday

### Source of the information

https://de.wikipedia.org/wiki/Feiertage_in_der_Schweiz#Nationale_und_allgemeine_Feiertage

### More information

In https://github.com/focus-shift/jollyday/pull/680, Easter Monday was wrongly removed from Zurich.

Pull request:
switzerland: adjust easter monday
closes #754

<!--

Thanks for contributing.
Please review the following notes before submitting you pull request.

Please look for other issues or pull requests which already work on this topic. Is somebody already on it? Do you need to synchronize?

# Security Vulnerabilities

🛑 STOP! 🛑 If your contribution fixes a security vulnerability, please do not submit it.
Instead, please write an E-Mail to to one of the maintainer with all the information
to recreate the security vulnerability.

# Describing Your Changes

If, having reviewed the notes above, you're ready to submit your pull request, please
provide a brief description of the proposed changes.

If they:
 🐞 fix a bug, please describe the broken behaviour and how the changes fix it.
    Please label with 'type: bug' and 'status: new'
    
 🎁 make an enhancement, please describe the new functionality and why you believe it's useful.
    Please label with 'type: enhancement' and 'status: new'
 
If your pull request relates to any existing issues,
please reference them by using the issue number prefixed with #.

-->


Patch:
diff --git a/jollyday-core/src/main/resources/holidays/Holidays_ch.xml b/jollyday-core/src/main/resources/holidays/Holidays_ch.xml
index 4a76eea2..149c6921 100644
--- a/jollyday-core/src/main/resources/holidays/Holidays_ch.xml
+++ b/jollyday-core/src/main/resources/holidays/Holidays_ch.xml
@@ -41,7 +41,7 @@
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION" localizedType="OBSERVANCE"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
@@ -51,6 +51,7 @@
     <Holidays>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -60,6 +61,7 @@
       <Fixed month="JANUARY" day="2" descriptionPropertiesKey="ST_BERCHTHOLD"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -69,6 +71,7 @@
       <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -78,6 +81,7 @@
       <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -90,7 +94,7 @@
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
@@ -103,6 +107,7 @@
         <FixedWeekday which="FIRST" weekday="SUNDAY" month="SEPTEMBER"/>
       </RelativeToWeekdayInMonth>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -113,6 +118,7 @@
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <FixedWeekday which="FIRST" weekday="THURSDAY" month="APRIL" descriptionPropertiesKey="NAEFELS_TRIP"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -121,6 +127,7 @@
     <Holidays>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -133,7 +140,7 @@
       <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS" localizedType="OBSERVANCE"/>
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
@@ -157,6 +164,7 @@
       <Fixed month="MARCH" day="1" descriptionPropertiesKey="REPUBLIC_DAY"/>
       <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
     </Holidays>
   </SubConfigurations>
 
@@ -168,7 +176,7 @@
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
   </SubConfigurations>
@@ -181,7 +189,7 @@
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
@@ -192,6 +200,7 @@
       <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -202,6 +211,7 @@
       <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -213,6 +223,7 @@
       <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
   </SubConfigurations>
@@ -226,7 +237,7 @@
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
@@ -238,6 +249,7 @@
       <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY" localizedType="OBSERVANCE"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>
@@ -253,7 +265,7 @@
       <Fixed month="NOVEMBER" day="1" descriptionPropertiesKey="ALL_SAINTS"/>
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI" localizedType="OBSERVANCE"/>
     </Holidays>
@@ -303,7 +315,7 @@
       <Fixed month="DECEMBER" day="8" descriptionPropertiesKey="IMMACULATE_CONCEPTION"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
-      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY" localizedType="OBSERVANCE"/>
       <ChristianHoliday type="CORPUS_CHRISTI" descriptionPropertiesKey="christian.CORPUS_CHRISTI"/>
     </Holidays>
   </SubConfigurations>
@@ -313,6 +325,7 @@
       <Fixed month="MAY" day="1" descriptionPropertiesKey="LABOUR_DAY"/>
       <Fixed month="DECEMBER" day="26" descriptionPropertiesKey="STEPHENS"/>
       <ChristianHoliday type="GOOD_FRIDAY" descriptionPropertiesKey="christian.GOOD_FRIDAY"/>
+      <ChristianHoliday type="EASTER_MONDAY" descriptionPropertiesKey="christian.EASTER_MONDAY"/>
       <ChristianHoliday type="WHIT_MONDAY" descriptionPropertiesKey="christian.WHIT_MONDAY"/>
     </Holidays>
   </SubConfigurations>


Test patch:
diff --git a/jollyday-tests/pom.xml b/jollyday-tests/pom.xml
index 785e940b..b090b156 100644
--- a/jollyday-tests/pom.xml
+++ b/jollyday-tests/pom.xml
@@ -112,6 +112,18 @@
           </execution>
         </executions>
       </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <release>${java.version}</release>
+          <fork>true</fork>
+          <compilerArgs>
+            <arg>-J-Xss4m</arg>
+          </compilerArgs>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/CalendarChecker.java b/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/CalendarChecker.java
index 4e977acd..21712845 100644
--- a/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/CalendarChecker.java
+++ b/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/CalendarChecker.java
@@ -256,7 +256,7 @@ public class CalendarChecker implements CalendarCheckerApi.Holiday, CalendarChec
               .isNotEmpty()
               .filteredOn(holiday -> holiday.getPropertiesKey().equals(check.getPropertiesKey()))
               .extracting(Holiday::getType)
-              .withFailMessage("Holiday '" + check.getPropertiesKey() + "' with holiday type '" + check.holidayType + "' in year '" + year + "' not found.")
+              .withFailMessage("Holiday '" + check.getPropertiesKey() + "' with holiday type '" + check.holidayType + "' in year '" + year + "' and in subdivision '" + Arrays.toString(check.getSubdivisions()) +  "' not found.")
               .contains(check.getHolidayType());
           }
         );
diff --git a/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayCHTest.java b/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayCHTest.java
index 147b4877..734a0592 100644
--- a/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayCHTest.java
+++ b/jollyday-tests/src/test/java/de/focus_shift/jollyday/tests/country/HolidayCHTest.java
@@ -2,6 +2,8 @@ package de.focus_shift.jollyday.tests.country;
 
 import org.junit.jupiter.api.Test;
 
+import java.time.Year;
+
 import static de.focus_shift.jollyday.core.HolidayCalendar.SWITZERLAND;
 import static de.focus_shift.jollyday.core.HolidayType.BANK_HOLIDAY;
 import static de.focus_shift.jollyday.core.HolidayType.OBSERVANCE;
@@ -9,9 +11,11 @@ import static de.focus_shift.jollyday.tests.CalendarCheckerApi.assertFor;
 import static java.time.Month.AUGUST;
 import static java.time.Month.DECEMBER;
 import static java.time.Month.JANUARY;
+import static java.time.Month.JUNE;
 import static java.time.Month.MARCH;
 import static java.time.Month.MAY;
 import static java.time.Month.NOVEMBER;
+import static java.time.Month.SEPTEMBER;
 
 
 class HolidayCHTest {
@@ -50,70 +54,217 @@ class HolidayCHTest {
       .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("vs").and()
       .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("vs").and()
 
+      /* Innerrhoden */
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15, OBSERVANCE).inSubdivision("ai").and()
+      .hasFixedHoliday("MAURITIUS_DAY", SEPTEMBER, 22).inSubdivision("ai").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1, OBSERVANCE).inSubdivision("ai").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8, OBSERVANCE).inSubdivision("ai").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("ai").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ai").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("ai").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("ai").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("ai").and()
 
-      /*Aargau*/
-      /*Innerrhoden*/
-      /*Ausserrhoden*/
+      /* Ausserrhoden */
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("ar").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ar").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("ar").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("ar").and()
 
-      /*Bern*/
+      /* Bern */
       .hasFixedHoliday("ST_BERCHTHOLD", JANUARY, 2).inSubdivision("be").and()
       .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("be").and()
       .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("be").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("be").and()
       .hasChristianHoliday("WHIT_MONDAY").inSubdivision("be").and()
 
-      /*Basel-Landschaft*/
-      /*Basel-Stadt*/
+      /* Basel -Landschaft*/
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("bl").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("bl").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("bl").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("bl").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("bl").and()
+
+      /* Basel -Stadt*/
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("bs").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("bs").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("bs").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("bs").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("bs").and()
 
-      /*Freiburg*/
+      /* Freiburg */
       .hasFixedHoliday("ST_BERCHTHOLD", JANUARY, 2).inSubdivision("fr").and()
       .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("fr").and()
       .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("fr").and()
       .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("fr").and()
       .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("fr").and()
       .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("fr").and()
-      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("fr").and()
+      .hasChristianHoliday("EASTER_MONDAY", OBSERVANCE).inSubdivision("fr").and()
       .hasChristianHoliday("WHIT_MONDAY").inSubdivision("fr").and()
       .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("fr").and()
 
-      /*Genève*/
-      /*Glarus*/
-      /*Graubünden*/
-      /*Jura*/
-      /*Luzern*/
-      /*Neuchâtel*/
-      /*Nidwalden*/
-      /*Obwalden*/
-      /*Gallen*/
-
-      /*Schaffhausen*/
+      /* Genève */
+      .hasFixedHoliday("RESTORATION_OF_THE_REPUBLIC", DECEMBER, 31).inSubdivision("ge").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ge").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("ge").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("ge").and()
+
+      /* Glarus */
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("gl").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("gl").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("gl").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("gl").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("gl").and()
+
+      /* Graubünden */
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("gr").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("gr").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("gr").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("gr").and()
+
+      /* Jura */
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("ju").and()
+      .hasFixedHoliday("INDEPENDENCE_DAY", JUNE, 23).inSubdivision("ju").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15, OBSERVANCE).inSubdivision("ju").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1, OBSERVANCE).inSubdivision("ju").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8, OBSERVANCE).inSubdivision("ju").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ju").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("ju").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("ju").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("ju").and()
+
+      /* Luzern */
+      .hasFixedHoliday("ST_JOSEPH", MARCH, 19, OBSERVANCE).inSubdivision("lu").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("lu").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("lu").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("lu").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("lu").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("lu").and()
+      .hasChristianHoliday("EASTER_MONDAY", OBSERVANCE).inSubdivision("lu").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("lu").and()
+
+      /* Neuchâtel */
+      .hasFixedHoliday("REPUBLIC_DAY", MARCH, 1).inSubdivision("ne").and()
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("ne").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ne").and()
+      .hasChristianHoliday("EASTER_MONDAY", OBSERVANCE).inSubdivision("ne").and()
+
+      /* Nidwalden */
+      .hasFixedHoliday("ST_JOSEPH", MARCH, 19, OBSERVANCE).inSubdivision("nw").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("nw").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("nw").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("nw").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("nw").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("nw").and()
+      .hasChristianHoliday("EASTER_MONDAY", OBSERVANCE).inSubdivision("nw").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("nw").and()
+
+      /* Obwalden */
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("ow").and()
+      .hasFixedHoliday("ST_NICHOLAS", SEPTEMBER, 25).between(Year.of(1947), Year.of(2500)).inSubdivision("ow").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("ow").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("ow").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("ow").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ow").and()
+      .hasChristianHoliday("EASTER_MONDAY", OBSERVANCE).inSubdivision("ow").and()
+      .hasChristianHoliday("WHIT_MONDAY", OBSERVANCE).inSubdivision("ow").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("ow").and()
+
+      /* Gallen */
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("sg").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("sg").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("sg").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("sg").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("sg").and()
+
+      /* Schaffhausen */
       .hasFixedHoliday("ST_BERCHTHOLD", JANUARY, 2).inSubdivision("sh").and()
       .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("sh").and()
       .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("sh").and()
       .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("sh").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("sh").and()
       .hasChristianHoliday("WHIT_MONDAY").inSubdivision("sh").and()
 
-      /*Solothurn*/
-      /*Schwyz*/
+      /* Solothurn */
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("so").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("so").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("so").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("so").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("so").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("so").and()
+
+      /* Schwyz */
+      .hasFixedHoliday("EPIPHANY", JANUARY, 6, OBSERVANCE).inSubdivision("sz").and()
+      .hasFixedHoliday("ST_JOSEPH", MARCH, 19).inSubdivision("sz").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("sz").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("sz").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("sz").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("sz").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("sz").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("sz").and()
+      .hasChristianHoliday("WHIT_MONDAY", OBSERVANCE).inSubdivision("sz").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("sz").and()
 
-      /*Thurgau*/
+      /* Thurgau */
       .hasFixedHoliday("ST_BERCHTHOLD", JANUARY, 2).inSubdivision("tg").and()
       .hasFixedHoliday("LABOUR_DAY", MAY, 1, OBSERVANCE).inSubdivision("tg").and()
       .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("tg").and()
       .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("tg").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("tg").and()
       .hasChristianHoliday("WHIT_MONDAY").inSubdivision("tg").and()
 
-      /*Ticino*/
-      /*Uri*/
+      /* Ticino */
+      .hasFixedHoliday("EPIPHANY", JANUARY, 6).inSubdivision("ti").and()
+      .hasFixedHoliday("ST_JOSEPH", MARCH, 19, OBSERVANCE).inSubdivision("ti").and()
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1, OBSERVANCE).inSubdivision("ti").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("ti").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("ti").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("ti").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("ti").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("ti").and()
+      .hasChristianHoliday("WHIT_MONDAY", OBSERVANCE).inSubdivision("ti").and()
+      .hasChristianHoliday("CORPUS_CHRISTI", OBSERVANCE).inSubdivision("ti").and()
 
-      /*Vaud*/
+      /* Uri */
+      .hasFixedHoliday("EPIPHANY", JANUARY, 6, OBSERVANCE).inSubdivision("ur").and()
+      .hasFixedHoliday("ST_JOSEPH", MARCH, 19, OBSERVANCE).inSubdivision("ur").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("ur").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("ur").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("ur").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("ur").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("ur").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("ur").and()
+      .hasChristianHoliday("WHIT_MONDAY", OBSERVANCE).inSubdivision("ur").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("ur").and()
+
+      /* Vaud */
       .hasFixedHoliday("ST_BERCHTHOLD", JANUARY, 2).inSubdivision("vd").and()
       .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("vd").and()
       .hasChristianHoliday("EASTER_MONDAY").inSubdivision("vd").and()
-      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("vd")
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("vd").and()
+
+      /* Valais */
+      .hasFixedHoliday("ST_JOSEPH", MARCH, 19).inSubdivision("vs").and()
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("vs").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("vs").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("vs").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("vs").and()
+
+      /* Zug */
+      .hasFixedHoliday("ASSUMPTION_DAY", AUGUST, 15).inSubdivision("zg").and()
+      .hasFixedHoliday("ALL_SAINTS", NOVEMBER, 1).inSubdivision("zg").and()
+      .hasFixedHoliday("IMMACULATE_CONCEPTION", DECEMBER, 8).inSubdivision("zg").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("zg").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("zg").and()
+      .hasChristianHoliday("EASTER_MONDAY", OBSERVANCE).inSubdivision("zg").and()
+      .hasChristianHoliday("CORPUS_CHRISTI").inSubdivision("zg").and()
 
-      /*Valais*/
-      /*Zug*/
-      /*Zürich*/
+      /* Zürich */
+      .hasFixedHoliday("LABOUR_DAY", MAY, 1).inSubdivision("zh").and()
+      .hasFixedHoliday("STEPHENS", DECEMBER, 26).inSubdivision("zh").and()
+      .hasChristianHoliday("GOOD_FRIDAY").inSubdivision("zh").and()
+      .hasChristianHoliday("EASTER_MONDAY").inSubdivision("zh").and()
+      .hasChristianHoliday("WHIT_MONDAY").inSubdivision("zh")
 
       .check();
   }