Repository: dr-prodigy/python-holidays

Issue:
Some holidays of Uruguay are incorrect.
Hello.
Some holidays for Uruguay are incorrect.

- The Battle of stones was in May, 18.
- The Respect for Cultural Diversity Day or Columbus day is October, 12.

In Uruguay are 2 categories of holidays (laborables and not laborables). In the not laborable holidays nobody works while in the laborable holidays the work is optional.

The not laborables holidays are:
- 01/01
- 01/05
- 18/07
- 25/08
- 25/12

The rest of holidays are laborables, and depending of the day of the week, some of them are moved to earlier monday or to the next friday. The rule is:
- If the holiday is tuesday or wednesday, they moved to earlier monday.
- If the holiday is thursday, is moved to next friday.
- If the holiday is in monday or friday, doesn't move.

That is the reason of the error.
For example, the Battle of the Stones is the May, 18. In 2021 was tuesday and was moved to the earlier monday that was May, 17.

One exception to this rule is the November, 2 ("Día de los difuntos"). This holiday is laborable, but doesn't move.

Best regards.


Discussion:
coveralls: 
[![Coverage Status](https://coveralls.io/builds/53506511/badge)](https://coveralls.io/builds/53506511)

Coverage decreased (-0.002%) to 99.629% when pulling **2b85e40f9c67a7afdc557fc944b338f671d5a889 on kasya:uruguay-holidays** into **5c9ab076dd007d165a4beac92e184ee9b8b50527 on dr-prodigy:beta**.


Patch:
diff --git a/CHANGES b/CHANGES
index e1584bfb..14203272 100644
--- a/CHANGES
+++ b/CHANGES
@@ -18,7 +18,7 @@ Released ?????? ??, ????
 - Malaysia fix #736 (shahonseven)
 - Ukraine fixes #743, #746 (KJhellico)
 - Bulgaria fixes #748 (KJhellico)
-- Various refactorings #756, #759, #760, #766, #767 (KJhellico)
+- Various refactorings #756, #759, #760, #766, #767, #775, #776, #780 (KJhellico)
 
 Version 0.16
 ============
diff --git a/docs/source/examples.rst b/docs/source/examples.rst
index 53d558cf..cf4829fd 100644
--- a/docs/source/examples.rst
+++ b/docs/source/examples.rst
@@ -251,6 +251,22 @@ pairs, a list of dates, or even singular date/string/timestamp objects:
    >>> custom_holidays.append(date(2015, 12, 25))
 
 
+Add years to an existing Holiday object
+---------------------------------------
+
+Because the Holiday class is a subclass of dictionary, we use the `update()
+<https://docs.python.org/3/library/stdtypes.html?highlight=update#dict.update>`__ method to add years to an existing
+holiday object:
+
+.. code-block:: python
+
+   >>> from holidays import country_holidays
+   >>> us_holidays = country_holidays('US', years=2020)
+   # to add new years of holidays to the object:
+   >>> us_holidays.update(country_holidays('US', years=2021))
+
+
+
 Other ways to specify the country
 ---------------------------------
 
diff --git a/holidays/countries/canada.py b/holidays/countries/canada.py
index 66dd777b..f085f238 100644
--- a/holidays/countries/canada.py
+++ b/holidays/countries/canada.py
@@ -59,27 +59,35 @@ class Canada(HolidayBase):
             kwargs["subdiv"] = "ON"
         HolidayBase.__init__(self, **kwargs)
 
+    @staticmethod
+    def _get_nearest_monday(d: date) -> date:
+        if d.weekday() < FRI:
+            return d + rd(weekday=MO(-1))
+        else:
+            return d + rd(weekday=MO)
+
     def _populate(self, year):
+        if year < 1867:
+            return
+
         # New Year's Day
-        if year >= 1867:
-            name = "New Year's Day"
-            self[date(year, JAN, 1)] = name
-            if self.observed and date(year, JAN, 1).weekday() == SUN:
-                self[date(year, JAN, 1) + rd(days=+1)] = name + " (Observed)"
-            # The following year's observed New Year's Day can be in this year
-            # when it falls on a Friday (Jan 1st is a Saturday).
-            if self.observed and date(year, DEC, 31).weekday() == FRI:
-                self[date(year, DEC, 31)] = name + " (Observed)"
+        name = "New Year's Day"
+        self[date(year, JAN, 1)] = name
+        if self.observed and date(year, JAN, 1).weekday() == SUN:
+            self[date(year, JAN, 1) + rd(days=+1)] = name + " (Observed)"
+        # The following year's observed New Year's Day can be in this year
+        # when it falls on a Friday (Jan 1st is a Saturday).
+        if self.observed and date(year, DEC, 31).weekday() == FRI:
+            self[date(year, DEC, 31)] = name + " (Observed)"
 
         # Family Day / Louis Riel Day (MB) / Islander Day (PE)
         # / Heritage Day (NS, YT)
-        if self.subdiv in ("AB", "SK", "ON") and year >= 2008:
-            self[date(year, FEB, 1) + rd(weekday=MO(+3))] = "Family Day"
-        elif self.subdiv in ("AB", "SK") and year >= 2007:
-            self[date(year, FEB, 1) + rd(weekday=MO(+3))] = "Family Day"
-        elif self.subdiv == "AB" and year >= 1990:
-            self[date(year, FEB, 1) + rd(weekday=MO(+3))] = "Family Day"
-        elif self.subdiv == "NB" and year >= 2018:
+        if (
+            (self.subdiv == "AB" and year >= 1990)
+            or (self.subdiv == "SK" and year >= 2007)
+            or (self.subdiv == "ON" and year >= 2008)
+            or (self.subdiv == "NB" and year >= 2018)
+        ):
             self[date(year, FEB, 1) + rd(weekday=MO(+3))] = "Family Day"
         elif self.subdiv == "BC":
             if 2013 <= year <= 2018:
@@ -95,52 +103,52 @@ class Canada(HolidayBase):
         elif self.subdiv == "NS" and year >= 2015:
             # http://novascotia.ca/lae/employmentrights/NovaScotiaHeritageDay.asp
             self[date(year, FEB, 1) + rd(weekday=MO(+3))] = "Heritage Day"
-        elif self.subdiv == "YT":
+        elif self.subdiv == "YT" and year >= 1974:
             # start date?
+            # https://www.britannica.com/topic/Heritage-Day-Canadian-holiday
+            # Heritage Day was created in 1973
+            # by the Heritage Canada Foundation
+            # therefore, start date is not earlier than 1974
             # http://heritageyukon.ca/programs/heritage-day
             # https://en.wikipedia.org/wiki/Family_Day_(Canada)#Yukon_Heritage_Day
             # Friday before the last Sunday in February
-            dt = date(year, MAR, 1) + rd(weekday=SU(-1)) + rd(weekday=FR(-1))
+            dt = (
+                date(year, MAR, 1)
+                + rd(days=-1)
+                + rd(weekday=SU(-1))
+                + rd(days=-2)
+            )
             self[dt] = "Heritage Day"
 
         # St. Patrick's Day
         if self.subdiv == "NL" and year >= 1900:
-            dt = date(year, MAR, 17)
             # Nearest Monday to March 17
-            dt1 = date(year, MAR, 17) + rd(weekday=MO(-1))
-            dt2 = date(year, MAR, 17) + rd(weekday=MO(+1))
-            if dt2 - dt <= dt - dt1:
-                self[dt2] = "St. Patrick's Day"
-            else:
-                self[dt1] = "St. Patrick's Day"
+            dt = self._get_nearest_monday(date(year, MAR, 17))
+            self[dt] = "St. Patrick's Day"
 
-        if year >= 1867:
-            # Good Friday
-            self[easter(year) + rd(weekday=FR(-1))] = "Good Friday"
-            # Easter Monday
-            self[easter(year) + rd(weekday=MO)] = "Easter Monday"
+        # Good Friday
+        self[easter(year) + rd(weekday=FR(-1))] = "Good Friday"
+        # Easter Monday
+        self[easter(year) + rd(weekday=MO)] = "Easter Monday"
 
         # St. George's Day
-        if self.subdiv == "NL" and year == 2010:
-            # 4/26 is the Monday closer to 4/23 in 2010
-            # but the holiday was observed on 4/19? Crazy Newfies!
-            self[date(2010, 4, 19)] = "St. George's Day"
-        elif self.subdiv == "NL" and year >= 1990:
-            dt = date(year, APR, 23)
-            # Nearest Monday to April 23
-            dt1 = dt + rd(weekday=MO(-1))
-            dt2 = dt + rd(weekday=MO(+1))
-            if dt2 - dt < dt - dt1:
-                self[dt2] = "St. George's Day"
+        if self.subdiv == "NL" and year >= 1990:
+            if year == 2010:
+                # 4/26 is the Monday closer to 4/23 in 2010
+                # but the holiday was observed on 4/19? Crazy Newfies!
+                dt = date(2010, APR, 19)
             else:
-                self[dt1] = "St. George's Day"
+                # Nearest Monday to April 23
+                dt = self._get_nearest_monday(date(year, APR, 23))
+            self[dt] = "St. George's Day"
 
         # Victoria Day / National Patriots' Day (QC)
-        if self.subdiv not in ("NB", "NS", "PE", "NL", "QC") and year >= 1953:
-            self[date(year, MAY, 24) + rd(weekday=MO(-1))] = "Victoria Day"
-        elif self.subdiv == "QC" and year >= 1953:
-            name = "National Patriots' Day"
-            self[date(year, MAY, 24) + rd(weekday=MO(-1))] = name
+        if year >= 1953:
+            dt = date(year, MAY, 24) + rd(weekday=MO(-1))
+            if self.subdiv not in ("NB", "NS", "PE", "NL", "QC"):
+                self[dt] = "Victoria Day"
+            elif self.subdiv == "QC":
+                self[dt] = "National Patriots' Day"
 
         # National Aboriginal Day
         if self.subdiv == "NT" and year >= 1996:
@@ -148,60 +156,40 @@ class Canada(HolidayBase):
 
         # St. Jean Baptiste Day
         if self.subdiv == "QC" and year >= 1925:
-            self[date(year, JUN, 24)] = "St. Jean Baptiste Day"
-            if self.observed and date(year, JUN, 24).weekday() == SUN:
-                self[date(year, JUN, 25)] = "St. Jean Baptiste Day (Observed)"
+            name = "St. Jean Baptiste Day"
+            dt = date(year, JUN, 24)
+            self[dt] = name
+            if self.observed and dt.weekday() == SUN:
+                self[dt + rd(days=1)] = name + " (Observed)"
 
         # Discovery Day
         if self.subdiv == "NL" and year >= 1997:
-            dt = date(year, JUN, 24)
             # Nearest Monday to June 24
-            dt1 = dt + rd(weekday=MO(-1))
-            dt2 = dt + rd(weekday=MO(+1))
-            if dt2 - dt <= dt - dt1:
-                self[dt2] = "Discovery Day"
-            else:
-                self[dt1] = "Discovery Day"
+            dt = self._get_nearest_monday(date(year, JUN, 24))
+            self[dt] = "Discovery Day"
         elif self.subdiv == "YT" and year >= 1912:
             self[date(year, AUG, 1) + rd(weekday=MO(+3))] = "Discovery Day"
 
         # Canada Day / Memorial Day (NL)
-        if self.subdiv != "NL" and year >= 1867:
-            if year >= 1983:
-                name = "Canada Day"
-            else:
-                name = "Dominion Day"
-            self[date(year, JUL, 1)] = name
-            if (
-                year >= 1879
-                and self.observed
-                and date(year, JUL, 1).weekday() in WEEKEND
-            ):
-                self[date(year, JUL, 1) + rd(weekday=MO)] = (
-                    name + " (Observed)"
-                )
-        elif year >= 1867:
-            if year >= 1983:
-                name = "Memorial Day"
-            else:
-                name = "Dominion Day"
-            self[date(year, JUL, 1)] = name
-            if (
-                year >= 1879
-                and self.observed
-                and date(year, JUL, 1).weekday() in WEEKEND
-            ):
-                self[date(year, JUL, 1) + rd(weekday=MO)] = (
-                    name + " (Observed)"
-                )
+        if year >= 1983:
+            name = "Memorial Day" if self.subdiv == "NL" else "Canada Day"
+        else:
+            name = "Dominion Day"
+        dt = date(year, JUL, 1)
+        self[dt] = name
+        if year >= 1879 and self.observed and dt.weekday() in WEEKEND:
+            self[dt + rd(weekday=MO)] = name + " (Observed)"
 
         # Nunavut Day
-        if self.subdiv == "NU" and year >= 2001:
-            self[date(year, JUL, 9)] = "Nunavut Day"
-            if self.observed and date(year, JUL, 9).weekday() == SUN:
-                self[date(year, JUL, 10)] = "Nunavut Day (Observed)"
-        elif self.subdiv == "NU" and year == 2000:
-            self[date(2000, 4, 1)] = "Nunavut Day"
+        if self.subdiv == "NU":
+            name = "Nunavut Day"
+            if year >= 2001:
+                dt = date(year, JUL, 9)
+                self[dt] = name
+                if self.observed and dt.weekday() == SUN:
+                    self[dt + rd(days=1)] = name + " (Observed)"
+            elif year == 2000:
+                self[date(2000, APR, 1)] = name
 
         # Civic Holiday
         if self.subdiv in ("ON", "MB", "NT") and year >= 1900:
@@ -229,7 +217,7 @@ class Canada(HolidayBase):
         queen_funeral_observers = ("BC", "NB", "NL", "NS", "PE", "YT")
         if self.subdiv in queen_funeral_observers and year == 2022:
             self[
-                date(year, SEP, 19)
+                date(2022, SEP, 19)
             ] = "Funeral of Her Majesty the Queen Elizabeth II"
 
         # National Day for Truth and Reconciliation
@@ -244,36 +232,35 @@ class Canada(HolidayBase):
                 # in 1935, Canadian Thanksgiving was moved due to the General
                 # Election falling on the second Monday of October
                 # https://books.google.ca/books?id=KcwlQsmheG4C&pg=RA1-PA1940&lpg=RA1-PA1940&dq=canada+thanksgiving+1935&source=bl&ots=j4qYrcfGuY&sig=gxXeAQfXVsOF9fOwjSMswPHJPpM&hl=en&sa=X&ved=0ahUKEwjO0f3J2PjOAhVS4mMKHRzKBLAQ6AEIRDAG#v=onepage&q=canada%20thanksgiving%201935&f=false
-                self[date(1935, 10, 25)] = "Thanksgiving"
+                self[date(1935, OCT, 25)] = "Thanksgiving"
             else:
                 self[date(year, OCT, 1) + rd(weekday=MO(+2))] = "Thanksgiving"
 
         # Remembrance Day
-        name = "Remembrance Day"
-        if (
-            self.subdiv not in ("ON", "QC", "NS", "NL", "NT", "PE", "SK")
-            and year >= 1931
-        ):
-            self[date(year, NOV, 11)] = name
-        elif self.subdiv in ("NS", "NL", "NT", "PE", "SK") and year >= 1931:
-            self[date(year, NOV, 11)] = name
-            if self.observed and date(year, NOV, 11).weekday() == SUN:
-                name = name + " (Observed)"
-                self[date(year, NOV, 11) + rd(weekday=MO)] = name
+        if self.subdiv not in ("ON", "QC") and year >= 1931:
+            name = "Remembrance Day"
+            dt = date(year, NOV, 11)
+            self[dt] = name
+            if (
+                self.observed
+                and self.subdiv in ("NS", "NL", "NT", "PE", "SK")
+                and dt.weekday() == SUN
+            ):
+                self[dt + rd(weekday=MO)] = name + " (Observed)"
 
         # Christmas Day
-        if year >= 1867:
-            name = "Christmas Day"
-            self[date(year, DEC, 25)] = name
-            if self.observed and date(year, DEC, 25).weekday() in WEEKEND:
-                self[date(year, DEC, 27)] = name + " (Observed)"
+        name = "Christmas Day"
+        dt = date(year, DEC, 25)
+        self[dt] = name
+        if self.observed and dt.weekday() in WEEKEND:
+            self[dt + rd(days=2)] = name + " (Observed)"
 
         # Boxing Day
-        if year >= 1867:
-            name = "Boxing Day"
-            self[date(year, DEC, 26)] = name
-            if self.observed and date(year, DEC, 26).weekday() in WEEKEND:
-                self[date(year, DEC, 28)] = name + " (Observed)"
+        name = "Boxing Day"
+        dt = date(year, DEC, 26)
+        self[dt] = name
+        if self.observed and dt.weekday() in WEEKEND:
+            self[dt + rd(days=2)] = name + " (Observed)"
 
 
 class CA(Canada):
diff --git a/holidays/countries/ukraine.py b/holidays/countries/ukraine.py
index 8fdcb214..a55e119f 100644
--- a/holidays/countries/ukraine.py
+++ b/holidays/countries/ukraine.py
@@ -12,7 +12,6 @@
 from datetime import date
 
 from dateutil.easter import EASTER_ORTHODOX, easter
-from dateutil.relativedelta import MO
 from dateutil.relativedelta import relativedelta as rd
 
 from holidays.constants import (
@@ -27,9 +26,6 @@ from holidays.constants import (
     OCT,
     NOV,
     DEC,
-    FRI,
-    SAT,
-    SUN,
     WEEKEND,
 )
 from holidays.holiday_base import HolidayBase
@@ -39,15 +35,6 @@ class Ukraine(HolidayBase):
     """
     Current holidays list:
     https://zakon1.rada.gov.ua/laws/show/322-08/paran454#n454
-
-    27.01.1995: holiday on weekend move to next workday
-    https://zakon.rada.gov.ua/laws/show/35/95-вр
-
-    10.01.1998: cancelled
-    https://zakon.rada.gov.ua/laws/show/785/97-вр
-
-    23.04.1999: holiday on weekend move to next workday
-    https://zakon.rada.gov.ua/laws/show/576-14
     """
 
     country = "UA"
@@ -55,6 +42,32 @@ class Ukraine(HolidayBase):
     def __init__(self, **kwargs):
         HolidayBase.__init__(self, **kwargs)
 
+    def _add_observed(self, holiday: date) -> None:
+        """
+        27.01.1995: holiday on weekend move to next workday
+        https://zakon.rada.gov.ua/laws/show/35/95-вр
+
+        10.01.1998: cancelled
+        https://zakon.rada.gov.ua/laws/show/785/97-вр
+
+        23.04.1999: holiday on weekend move to next workday
+        https://zakon.rada.gov.ua/laws/show/576-14
+        """
+        if (
+            self.observed
+            and holiday.weekday() in WEEKEND
+            and (
+                date(1995, JAN, 27) <= holiday <= date(1998, JAN, 9)
+                or holiday >= date(1999, APR, 23)
+            )
+        ):
+            next_workday = holiday + rd(days=1)
+            while next_workday.weekday() in WEEKEND or self.get(
+                next_workday, None
+            ):
+                next_workday += rd(days=1)
+            self[next_workday] = "Вихідний за " + self[holiday]
+
     def _populate(self, year):
         # The current set of holidays came into force in 1991
         # But most holiday days were implemented in 1918
@@ -63,91 +76,35 @@ class Ukraine(HolidayBase):
 
         # New Year's Day
         if year <= 1929 or year >= 1948:
-            dt = date(year, JAN, 1)
-            self[dt] = "Новий рік"
-            if (
-                self.observed
-                and (1996 <= year <= 1998 or year >= 2000)
-                and dt.weekday() in WEEKEND
-            ):
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 1 січня"
+            self[date(year, JAN, 1)] = "Новий рік"
 
         # Christmas Day (Julian calendar)
         if year >= 1991:
-            dt = date(year, JAN, 7)
-            self[dt] = "Різдво Христове (за юліанським календарем)"
-            if (
-                self.observed
-                and (1996 <= year <= 1998 or year >= 2000)
-                and dt.weekday() in WEEKEND
-            ):
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 7 січня"
+            self[
+                date(year, JAN, 7)
+            ] = "Різдво Христове (за юліанським календарем)"
 
         # Women's Day
         if year >= 1966:
-            dt = date(year, MAR, 8)
-            self[dt] = "Міжнародний жіночий день"
-            if (
-                self.observed
-                and (1995 <= year <= 1997 or year >= 2000)
-                and dt.weekday() in WEEKEND
-            ):
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 8 березня"
+            self[date(year, MAR, 8)] = "Міжнародний жіночий день"
 
-        # Easter
         if year >= 1991:
+            # Easter
             dt = easter(year, method=EASTER_ORTHODOX)
             self[dt] = "Великдень (Пасха)"
-            if (
-                self.observed
-                and (1995 <= year <= 1997 or year >= 2000)
-                and dt != date(year, MAY, 1)
-            ):
-                name = "Вихідний за Великдень"
-                if dt == date(year, APR, 30):
-                    if year <= 2017:
-                        self[dt + rd(days=+3)] = name
-                    else:
-                        self[dt + rd(days=+2)] = name
-                elif dt == date(year, MAY, 2):
-                    self[dt + rd(days=+2)] = name
-                else:
-                    self[dt + rd(days=+1)] = name
-
-        # Holy trinity
-        if year >= 1991:
-            dt = easter(year, method=EASTER_ORTHODOX) + rd(days=49)
-            self[dt] = "Трійця"
-            if self.observed and (1995 <= year <= 1997 or year >= 1999):
-                self[dt + rd(days=+1)] = "Вихідний за Трійцю"
+
+            # Holy trinity
+            self[dt + rd(days=49)] = "Трійця"
 
         # Labour Day
         name = "День міжнародної солідарності трудящих"
-        dt = date(year, MAY, 1)
         if year >= 2018:
             name = "День праці"
-        self[dt] = name
-        if (
-            self.observed
-            and (1995 <= year <= 1997 or year >= 1999)
-            and dt.weekday() in WEEKEND
-        ):
-            name = "Вихідний за 1 травня"
-            if year <= 2017:
-                self[dt + rd(days=+2)] = name
-            else:
-                self[dt + rd(weekday=MO(+1))] = name
+        self[date(year, MAY, 1)] = name
 
         # Labour Day in past
         if 1929 <= year <= 2017:
-            dt = date(year, MAY, 2)
-            self[dt] = "День міжнародної солідарності трудящих"
-            if (
-                self.observed
-                and (1995 <= year <= 1997 or year >= 1999)
-                and dt.weekday() in WEEKEND
-            ):
-                self[dt + rd(days=+2)] = "Вихідний за 2 травня"
+            self[date(year, MAY, 2)] = "День міжнародної солідарності трудящих"
 
         # Victory Day
         name = "День перемоги"
@@ -162,73 +119,44 @@ class Ukraine(HolidayBase):
         elif 1945 <= year <= 1946:
             self[dt] = name
             self[date(year, SEP, 3)] = "День перемоги над Японією"
-        if (
-            self.observed
-            and (1995 <= year <= 1997 or year >= 1999)
-            and dt.weekday() in WEEKEND
-        ):
-            self[dt + rd(weekday=MO(+1))] = "Вихідний за 9 травня"
 
         # Constitution Day
         if year >= 1997:
-            dt = date(year, JUN, 28)
-            self[dt] = "День Конституції України"
-            if (
-                self.observed
-                and (year == 1997 or year >= 1999)
-                and dt.weekday() in WEEKEND
-            ):
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 28 червня"
+            self[date(year, JUN, 28)] = "День Конституції України"
 
         # Day of Ukrainian Statehood
         if year >= 2022:
-            dt = date(year, JUL, 28)
-            self[dt] = "День Української Державності"
-            if self.observed and dt.weekday() in WEEKEND:
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 28 липня"
+            self[date(year, JUL, 28)] = "День Української Державності"
 
         # Independence Day
         name = "День незалежності України"
         if year >= 1992:
-            dt = date(year, AUG, 24)
-            self[dt] = name
-            if (
-                self.observed
-                and (1995 <= year <= 1997 or year >= 1999)
-                and dt.weekday() in WEEKEND
-            ):
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 24 серпня"
+            self[date(year, AUG, 24)] = name
         elif year == 1991:
             self[date(year, JUL, 16)] = name
 
         # Day of the defender of Ukraine
         if year >= 2015:
             name = "День захисника України"
-            dt = date(year, OCT, 14)
             if year >= 2021:
                 name = "День захисників і захисниць України"
-            self[dt] = name
-            if self.observed and dt.weekday() in WEEKEND:
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 14 жовтня"
+            self[date(year, OCT, 14)] = name
 
         # October Revolution
         if year <= 1999:
             name = "Річниця Великої Жовтневої соціалістичної революції"
-            dt = date(year, NOV, 7)
-            self[dt] = name
-            self[dt + rd(days=+1)] = name
-            if self.observed and (1995 <= year <= 1997 or year >= 1999):
-                if dt.weekday() in (SAT, SUN):
-                    self[dt + rd(days=+2)] = "Вихідний за 7 листопада"
-                if dt.weekday() in (FRI, SAT):
-                    self[dt + rd(days=+3)] = "Вихідний за 8 листопада"
+            self[date(year, NOV, 7)] = name
+            self[date(year, NOV, 8)] = name
 
         # Christmas Day (Gregorian calendar)
         if year >= 2017:
-            dt = date(year, DEC, 25)
-            self[dt] = "Різдво Христове (за григоріанським календарем)"
-            if self.observed and dt.weekday() in WEEKEND:
-                self[dt + rd(weekday=MO(+1))] = "Вихідний за 25 грудня"
+            self[
+                date(year, DEC, 25)
+            ] = "Різдво Христове (за григоріанським календарем)"
+
+        for dt in sorted(list(self.keys())):
+            if dt.year == year:
+                self._add_observed(dt)
 
         # USSR holidays
         # Bloody_Sunday_(1905)
diff --git a/holidays/countries/united_kingdom.py b/holidays/countries/united_kingdom.py
index 9e9821c0..474dc58e 100644
--- a/holidays/countries/united_kingdom.py
+++ b/holidays/countries/united_kingdom.py
@@ -8,7 +8,6 @@
 #           ryanss <ryanssdev@icloud.com> (c) 2014-2017
 #  Website: https://github.com/dr-prodigy/python-holidays
 #  License: MIT (see LICENSE file)
-import warnings
 from datetime import date
 from typing import Any
 
@@ -18,12 +17,6 @@ from dateutil.relativedelta import MO, FR
 
 from holidays.constants import (
     MON,
-    TUE,
-    WED,
-    THU,
-    FRI,
-    SAT,
-    SUN,
     WEEKEND,
     JAN,
     MAR,
@@ -59,33 +52,32 @@ class UnitedKingdom(HolidayBase):
         # New Year's Day
         if year >= 1974:
             name = "New Year's Day"
-            self[date(year, JAN, 1)] = name
-            if self.observed and date(year, JAN, 1).weekday() == SUN:
-                self[date(year, JAN, 1) + rd(days=+1)] = name + " (Observed)"
-            elif self.observed and date(year, JAN, 1).weekday() == SAT:
-                self[date(year, JAN, 1) + rd(days=+2)] = name + " (Observed)"
+            dt = date(year, JAN, 1)
+            self[dt] = name
+            if self.observed and dt.weekday() in WEEKEND:
+                self[dt + rd(weekday=MO)] = name + " (Observed)"
 
         # New Year Holiday
         if self.subdiv in ("UK", "Scotland"):
             name = "New Year Holiday"
+            dt = date(year, JAN, 2)
             if self.subdiv == "UK":
                 name += " [Scotland]"
-            self[date(year, JAN, 2)] = name
-            if self.observed and date(year, JAN, 2).weekday() in WEEKEND:
-                self[date(year, JAN, 2) + rd(days=+2)] = name + " (Observed)"
-            elif self.observed and date(year, JAN, 2).weekday() == MON:
-                self[date(year, JAN, 2) + rd(days=+1)] = name + " (Observed)"
+            self[dt] = name
+            if self.observed and dt.weekday() in WEEKEND:
+                self[dt + rd(days=+2)] = name + " (Observed)"
+            elif self.observed and dt.weekday() == MON:
+                self[dt + rd(days=+1)] = name + " (Observed)"
 
         # St. Patrick's Day
         if self.subdiv in ("UK", "Northern Ireland"):
             name = "St. Patrick's Day"
+            dt = date(year, MAR, 17)
             if self.subdiv == "UK":
                 name += " [Northern Ireland]"
-            self[date(year, MAR, 17)] = name
-            if self.observed and date(year, MAR, 17).weekday() in WEEKEND:
-                self[date(year, MAR, 17) + rd(weekday=MO)] = (
-                    name + " (Observed)"
-                )
+            self[dt] = name
+            if self.observed and dt.weekday() in WEEKEND:
+                self[dt + rd(weekday=MO)] = name + " (Observed)"
 
         # Battle of the Boyne
         if self.subdiv in ("UK", "Northern Ireland"):
@@ -110,11 +102,10 @@ class UnitedKingdom(HolidayBase):
 
         # Christmas Day
         name = "Christmas Day"
-        self[date(year, DEC, 25)] = name
-        if self.observed and date(year, DEC, 25).weekday() == SAT:
-            self[date(year, DEC, 27)] = name + " (Observed)"
-        elif self.observed and date(year, DEC, 25).weekday() == SUN:
-            self[date(year, DEC, 27)] = name + " (Observed)"
+        dt = date(year, DEC, 25)
+        self[dt] = name
+        if self.observed and dt.weekday() in WEEKEND:
+            self[dt + rd(days=+2)] = name + " (Observed)"
 
         # Overwrite to modify country specific holidays
         self._country_specific(year)
@@ -137,28 +128,12 @@ class UnitedKingdom(HolidayBase):
         # May Day bank holiday (first Monday in May)
         if year >= 1978:
             name = "May Day"
-            if year == 2020:
-                # Moved to Friday to mark 75th anniversary of VE Day.
-                self[date(year, MAY, 8)] = name
+            if year == 1995 or year == 2020:
+                # In 2020 moved to Friday to mark 75th anniversary of VE Day.
+                dt = date(year, MAY, 8)
             else:
-                if year == 1995:
-                    dt = date(year, MAY, 8)
-                else:
-                    dt = date(year, MAY, 1)
-                if dt.weekday() == MON:
-                    self[dt] = name
-                if dt.weekday() == TUE:
-                    self[dt + rd(days=+6)] = name
-                if dt.weekday() == WED:
-                    self[dt + rd(days=+5)] = name
-                if dt.weekday() == THU:
-                    self[dt + rd(days=+4)] = name
-                if dt.weekday() == FRI:
-                    self[dt + rd(days=+3)] = name
-                if dt.weekday() == SAT:
-                    self[dt + rd(days=+2)] = name
-                if dt.weekday() == SUN:
-                    self[dt + rd(days=+1)] = name
+                dt = date(year, MAY, 1) + rd(weekday=MO)
+            self[dt] = name
 
         # Spring bank holiday (last Monday in May)
         name = "Spring Bank Holiday"
@@ -178,11 +153,10 @@ class UnitedKingdom(HolidayBase):
 
         # Boxing Day
         name = "Boxing Day"
-        self[date(year, DEC, 26)] = name
-        if self.observed and date(year, DEC, 26).weekday() == SAT:
-            self[date(year, DEC, 28)] = name + " (Observed)"
-        elif self.observed and date(year, DEC, 26).weekday() == SUN:
-            self[date(year, DEC, 28)] = name + " (Observed)"
+        dt = date(year, DEC, 26)
+        self[dt] = name
+        if self.observed and dt.weekday() in WEEKEND:
+            self[dt + rd(days=+2)] = name + " (Observed)"
 
         # Special holidays
         if year == 1977:
diff --git a/holidays/countries/uruguay.py b/holidays/countries/uruguay.py
index f7abd352..f582b07c 100644
--- a/holidays/countries/uruguay.py
+++ b/holidays/countries/uruguay.py
@@ -12,26 +12,16 @@
 from datetime import date
 
 from dateutil.easter import easter
+from dateutil.relativedelta import FR, MO, TH, TU, WE
 from dateutil.relativedelta import relativedelta as rd
-from dateutil.relativedelta import TH, FR
-
-from holidays.constants import (
-    WEEKEND,
-    JAN,
-    APR,
-    MAY,
-    JUN,
-    JUL,
-    AUG,
-    OCT,
-    NOV,
-    DEC,
-)
+
+from holidays.constants import APR, AUG, DEC, JAN, JUL, JUN, MAY, NOV, OCT
 from holidays.holiday_base import HolidayBase
 
 
 class Uruguay(HolidayBase):
     # https://www.ute.com.uy/clientes/tramites-y-servicios/potencia-contratada
+    # https://en.wikipedia.org/wiki/Public_holidays_in_Uruguay
 
     country = "UY"
 
@@ -39,104 +29,82 @@ class Uruguay(HolidayBase):
         HolidayBase.__init__(self, **kwargs)
 
     def _populate(self, year):
-        # New Year's Day
-        if not self.observed and date(year, JAN, 1).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, JAN, 1)] = "Año Nuevo [New Year's Day]"
-
-        # Carnival days
-        # revisar este día para futuros casos
+        # Mandatory paid holidays:
+
+        # New Year's Day.
+        self[date(year, JAN, 1)] = "Año Nuevo [New Year's Day]"
+
+        # Día de los Trabajadores.
+        self[date(year, MAY, 1)] = "Día del Trabajo [Labour Day]"
+
+        # Jura de la Constitución.
+        self[date(year, JUL, 18)] = "Jura de la constitución"
+
+        # Declaratoria de la Independencia.
+        self[
+            date(year, AUG, 25)
+        ] = "Día de la Independencia [Independence Day]"
+
+        # Christmas.
+        self[date(year, DEC, 25)] = "Navidad [Christmas]"
+
+        # Partially paid holidays:
+
+        # Día de Reyes - Feriado en el cual se conmemora la llegada de
+        # los reyes magos a Jesus.
+        self[date(year, JAN, 6)] = "Día de Reyes"
+
+        # Natalicio de José Gervacio Artigas.
+        self[date(year, JUN, 19)] = "Natalicio de José Gervacio Artigas"
+
+        # Día de los difuntos.
+        self[date(year, NOV, 2)] = "Día de los difuntos"
+
+        # Moveable holidays:
+
+        # Carnival days.
         name = "Día de Carnaval [Carnival's Day]"
         self[easter(year) - rd(days=48)] = name
         self[easter(year) - rd(days=47)] = name
 
-        # Día de Reyes - Feriado en el cual se conmemora la llegada de
-        # los reyes magos a Jesus
-        if not self.observed and date(year, JAN, 6).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, JAN, 6)] = "Día de Reyes"
-
-        # Holy Week
-        name_thu = "Semana Santa (Jueves Santo) [Holy day (Holy Thursday)]"
-        name_fri = "Semana Santa (Viernes Santo) [Holy day (Holy Friday)]"
-        name_easter = "Día de Pascuas [Easter Day]"
-
-        self[easter(year) + rd(weekday=TH(-1))] = name_thu
-        self[easter(year) + rd(weekday=FR(-1))] = name_fri
-
-        if not self.observed and easter(year).weekday() in WEEKEND:
-            pass
-        else:
-            self[easter(year)] = name_easter
-
-        # Desembarco de los 33 Orientales en la playa de la Agraciada
-        if not self.observed and date(year, APR, 19).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, APR, 19)] = (
-                "Desembarco de los 33 Orientales "
-                "Landing of the 33 Orientals"
-                " Aterrissagem dos 33 Orientais"
-                " Sbarco dei 33 orientali"
-            )
-
-        # Día de los Trabajadores
-        name = "Día del Trabajo [Labour Day]"
-        if not self.observed and date(year, MAY, 1).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, MAY, 1)] = name
-
-        # Batalla de las piedras
-        name = "Batalla de las Piedras [Battle of the stones]"
-        if not self.observed and date(year, MAY, 17).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, MAY, 17)] = name
-
-        # Natalicio de José Gervacio Artigas
-        name = "Natalicio de José Gervacio Artigas"
-        if not self.observed and date(year, JUN, 19).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, JUN, 19)] = name
-
-        # Jura de la Constitución
-        name = "Jura de la constitución"
-        if not self.observed and date(year, JUL, 18).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, JUL, 18)] = name
-
-        # Declaratoria de la Independencia
-        name = "Día de la Independencia [Independence Day]"
-        if not self.observed and date(year, AUG, 25).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, AUG, 25)] = name
-
-        # Respect for Cultural Diversity Day or Columbus day
-        if not self.observed and date(year, OCT, 11).weekday() in WEEKEND:
-            pass
-        elif year < 2010:
-            self[date(year, OCT, 11)] = "Día de la Raza [Columbus day]"
-        else:
-            self[date(year, OCT, 11)] = (
-                "Día del Respeto a la Diversidad"
-                " Cultural [Respect for"
-                " Cultural Diversity Day]"
-            )
-        # Día de los difuntos
-        name = "Día de los difuntos"
-        if not self.observed and date(year, NOV, 2).weekday() in WEEKEND:
-            pass
-        else:
-            self[date(year, NOV, 2)] = name
-
-        # Christmas
-        self[date(year, DEC, 25)] = "Navidad [Christmas]"
+        # Holy Week.
+        self[
+            easter(year) + rd(weekday=TH(-1))
+        ] = "Semana Santa (Jueves Santo)  [Holy day (Holy Thursday)]"
+        self[
+            easter(year) + rd(weekday=FR(-1))
+        ] = "Semana Santa (Viernes Santo)  [Holy day (Holy Friday)]"
+
+        self[easter(year)] = "Día de Pascuas [Easter Day]"
+
+        holiday_pairs = (
+            (
+                # Desembarco de los 33 Orientales en la playa de la Agraciada.
+                date(year, APR, 19),
+                "Desembarco de los 33 Orientales Landing of the 33 Orientals "
+                "Aterrissagem dos 33 Orientais Sbarco dei 33 orientali",
+            ),
+            (
+                # Batalla de las Piedras [Battle of the stones].
+                date(year, MAY, 18),
+                "Batalla de las Piedras [Battle of the stones]",
+            ),
+            (
+                # "Día del Respeto a la Diversidad Cultural
+                # [Respect for Cultural Diversity Day].
+                date(year, OCT, 12),
+                "Día del Respeto a la Diversidad Cultural "
+                "[Respect for Cultural Diversity Day]",
+            ),
+        )
+
+        for dt, name in holiday_pairs:
+            if dt.weekday() in (TU.weekday, WE.weekday):
+                self[dt + rd(weekday=MO(-1))] = name
+            elif dt.weekday() in (TH.weekday, FR.weekday):
+                self[dt + rd(weekday=MO(+1))] = name
+            else:
+                self[dt] = name
 
 
 class UY(Uruguay):
diff --git a/holidays/holiday_base.py b/holidays/holiday_base.py
index b1a2e49c..da89330d 100644
--- a/holidays/holiday_base.py
+++ b/holidays/holiday_base.py
@@ -552,7 +552,19 @@ class HolidayBase(Dict[date, str]):
         return self.__add__(other)
 
     def _populate(self, year: int) -> None:
-        """meta: public"""
+        """This is a private class that populates (generates and adds) holidays
+        for a given year. To keep things fast, it assumes that no holidays for
+        the year have already been populated. It should not be called directly;
+        to add holidays to an object, use the update() method:
+
+        >>> from holidays import country_holidays
+        >>> us_holidays = country_holidays('US', years=2020)
+        # to add new holidays to the object:
+        >>> us_holidays.update(country_holidays('US', years=2021))
+
+        :param year:
+            The year to populate with holidays.
+        """
         pass
 
     def __reduce__(self) -> Union[str, Tuple[Any, ...]]:


Test patch:
diff --git a/test/countries/test_canada.py b/test/countries/test_canada.py
index dc040d16..49b4387f 100644
--- a/test/countries/test_canada.py
+++ b/test/countries/test_canada.py
@@ -56,6 +56,21 @@ class TestCA(unittest.TestCase):
             self.assertNotIn(dt + relativedelta(days=-1), pei_holidays)
             self.assertNotIn(dt + relativedelta(days=+1), pei_holidays)
 
+    def test_yukon_heritage_day(self):
+        # https://www.timeanddate.com/holidays/canada/heritage-day-yukon
+        yt_holidays = holidays.CA(subdiv="YT")
+        for dt in [
+            date(2017, 2, 24),
+            date(2018, 2, 23),
+            date(2019, 2, 22),
+            date(2020, 2, 21),
+            date(2021, 2, 26),
+            date(2022, 2, 25),
+        ]:
+            self.assertIn(dt, yt_holidays)
+            self.assertNotIn(dt + relativedelta(days=-1), yt_holidays)
+            self.assertNotIn(dt + relativedelta(days=+1), yt_holidays)
+
     def test_family_day(self):
         ab_holidays = holidays.CA(subdiv="AB")
         bc_holidays = holidays.CA(subdiv="BC")
diff --git a/test/countries/test_ireland.py b/test/countries/test_ireland.py
index 5baa7f39..d6b01965 100644
--- a/test/countries/test_ireland.py
+++ b/test/countries/test_ireland.py
@@ -92,7 +92,6 @@ class TestIreland(unittest.TestCase):
             2001,
         ):
             dt = date(year, 12, day)
-            print(self.holidays[dt])
             self.assertIn(dt, self.holidays, dt)
             self.assertIn(
                 self.holidays[dt],
diff --git a/test/countries/test_united_kingdom.py b/test/countries/test_united_kingdom.py
index 9152108e..cb54b9be 100644
--- a/test/countries/test_united_kingdom.py
+++ b/test/countries/test_united_kingdom.py
@@ -10,7 +10,6 @@
 #  License: MIT (see LICENSE file)
 
 import unittest
-import warnings
 from datetime import date
 
 from dateutil.relativedelta import relativedelta
diff --git a/test/countries/test_uruguay.py b/test/countries/test_uruguay.py
index 7a41be8c..80635edc 100644
--- a/test/countries/test_uruguay.py
+++ b/test/countries/test_uruguay.py
@@ -21,6 +21,8 @@ class TestUY(unittest.TestCase):
     def setUp(self):
         self.holidays = holidays.UY(observed=True)
 
+    # Mandatory holidays.
+
     def test_new_years(self):
         self.holidays.observed = False
         self.assertNotIn(date(2010, 12, 31), self.holidays)
@@ -32,31 +34,7 @@ class TestUY(unittest.TestCase):
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
-
-    def test_carnival_day(self):
-        for dt in [
-            date(2021, 2, 15),
-            date(2021, 2, 16),
-            date(2018, 2, 12),
-            date(2018, 2, 13),
-            date(2017, 2, 27),
-            date(2017, 2, 28),
-            date(2016, 2, 8),
-            date(2016, 2, 9),
-        ]:
-            self.assertIn(dt, self.holidays)
-
-    def test_dia_de_reyes(self):
-        self.holidays.observed = False
-        for year in range(1900, 2100):
-            dt = date(year, 1, 6)
-        self.assertIn(dt, self.holidays)
-
-    def test_holy_week_day(self):
-        for dt in [
-            date(2021, 1, 6),
-        ]:
-            self.assertIn(dt, self.holidays)
+            self.assertEqual(self.holidays[dt], "Año Nuevo [New Year's Day]")
 
     def test_labor_day(self):
         self.holidays.observed = False
@@ -69,46 +47,53 @@ class TestUY(unittest.TestCase):
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(self.holidays[dt], "Día del Trabajo [Labour Day]")
 
-    def test_batalla_de_las_piedras_day(self):
-        self.holidays.observed = False
-        self.assertNotIn(date(1811, 5, 18), self.holidays)
-        self.assertNotIn(date(2021, 5, 18), self.holidays)
-        self.holidays.observed = True
+    def test_jura_de_la_constitucion_day(self):
         for year in range(1900, 2100):
-            dt = date(year, 5, 1)
+            dt = date(year, 7, 18)
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(self.holidays[dt], "Jura de la constitución")
 
-    def test_natalicio_artigas_day(self):
+    def test_declaratoria_de_la_independencia_day(self):
         for year in range(1900, 2100):
-            dt = date(year, 6, 19)
+            dt = date(year, 8, 25)
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(
+                self.holidays[dt], "Día de la Independencia [Independence Day]"
+            )
 
-    def test_jura_de_la_constitucion_day(self):
+    def test_christmas(self):
         for year in range(1900, 2100):
-            dt = date(year, 7, 18)
+            dt = date(year, 12, 25)
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(self.holidays[dt], "Navidad [Christmas]")
 
-    def test_declaratoria_de_la_independencia_day(self):
-        self.holidays.observed = True
+    # Partially paid holidays.
+
+    def test_dia_de_reyes(self):
+        self.holidays.observed = False
         for year in range(1900, 2100):
-            dt = date(year, 8, 25)
+            dt = date(year, 1, 6)
             self.assertIn(dt, self.holidays)
-            self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
-            self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(self.holidays[dt], "Día de Reyes")
 
-    def test_dia_de_la_raza_day(self):
+    def test_natalicio_artigas_day(self):
         for year in range(1900, 2100):
-            dt = date(year, 10, 11)
+            dt = date(year, 6, 19)
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(
+                self.holidays[dt],
+                "Natalicio de José Gervacio Artigas",
+            )
 
     def test_dia_de_los_difuntos_day(self):
         for year in range(1900, 2100):
@@ -116,10 +101,81 @@ class TestUY(unittest.TestCase):
             self.assertIn(dt, self.holidays)
             self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
             self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(self.holidays[dt], "Día de los difuntos")
 
-    def test_christmas(self):
-        for year in range(1900, 2100):
-            dt = date(year, 12, 25)
+    # Moveable holidays.
+
+    def test_carnival_day(self):
+        for dt in (
+            date(2016, 2, 8),
+            date(2016, 2, 9),
+            date(2017, 2, 27),
+            date(2017, 2, 28),
+            date(2018, 2, 12),
+            date(2018, 2, 13),
+            date(2021, 2, 15),
+            date(2021, 2, 16),
+        ):
             self.assertIn(dt, self.holidays)
-            self.assertNotIn(dt + relativedelta(days=-1), self.holidays)
-            self.assertNotIn(dt + relativedelta(days=+1), self.holidays)
+            self.assertEqual(
+                self.holidays[dt], "Día de Carnaval [Carnival's Day]"
+            )
+
+    def test_holy_week_day(self):
+        for dt in (
+            (
+                date(2021, 4, 1),
+                "Semana Santa (Jueves Santo)  [Holy day (Holy Thursday)]",
+            ),
+            (
+                date(2021, 4, 2),
+                "Semana Santa (Viernes Santo)  [Holy day (Holy Friday)]",
+            ),
+            (date(2021, 4, 4), "Día de Pascuas [Easter Day]"),
+        ):
+            self.assertIn(dt[0], self.holidays)
+            self.assertEqual(self.holidays[dt[0]], dt[1])
+
+    def test_desembarco_de_los_33_orientales(self):
+        for dt in (
+            date(2017, 4, 17),
+            date(2018, 4, 23),
+            date(2019, 4, 22),
+            date(2020, 4, 19),
+            date(2021, 4, 19),
+        ):
+            self.assertIn(dt, self.holidays)
+            self.assertEqual(
+                self.holidays[dt],
+                "Desembarco de los 33 Orientales Landing of the 33 Orientals "
+                "Aterrissagem dos 33 Orientais Sbarco dei 33 orientali",
+            )
+
+    def test_batalla_de_las_piedras_day(self):
+        for dt in (
+            date(2017, 5, 22),
+            date(2018, 5, 21),
+            date(2019, 5, 18),
+            date(2020, 5, 18),
+            date(2021, 5, 17),
+        ):
+            self.assertIn(dt, self.holidays)
+            self.assertEqual(
+                self.holidays[dt],
+                "Batalla de las Piedras [Battle of the stones]",
+            )
+
+    def test_dia_del_respeto_a_la_diversidad_cultural(self):
+        for dt in (
+            date(2017, 10, 16),
+            date(2018, 10, 15),
+            date(2019, 10, 12),
+            date(2020, 10, 12),
+            date(2021, 10, 11),
+        ):
+            self.assertIn(dt, self.holidays)
+            self.assertEqual(
+                self.holidays[dt],
+                "Día del Respeto a la Diversidad Cultural "
+                "[Respect for Cultural Diversity Day]",
+            )