Module(s) Affected
holiday-calendar-apac
Problem / Motivation
No Korea Exchange (KRX) market calendar exists in this library today. KRX observes all South Korean national holidays (including daecheday substitutes) plus a market-only full-day closure on December 31 (year-end) that is not a national public holiday.
Proposed Solution
Create HolidayCalendarServiceXKRX (MIC code XKRX), reusing KR's full holiday list via KRHolidays, plus one new market-only closure.
Holidays
- All entries from
KR (see sibling sub-issue), via KRHolidays, including daecheday substitutes
- December 31 year-end closure — confirm this is a full-day non-trading closure (
Holiday.Type.FIXED, appears in calculate()), not an EARLY_CLOSE; research fixture data described it as "full closure" but this needs confirming against KRX's own published market schedule before implementation, since the design prose alone was ambiguous on this point
Scope
Testing
Verification
Related
Alternatives Considered
None — market-only Dec 31 closure content is straightforward given KR's base list already exists.
Additional Context
None.
Module(s) Affected
holiday-calendar-apac
Problem / Motivation
No Korea Exchange (KRX) market calendar exists in this library today. KRX observes all South Korean national holidays (including daecheday substitutes) plus a market-only full-day closure on December 31 (year-end) that is not a national public holiday.
Proposed Solution
Create
HolidayCalendarServiceXKRX(MIC codeXKRX), reusingKR's full holiday list viaKRHolidays, plus one new market-only closure.Holidays
KR(see sibling sub-issue), viaKRHolidays, including daecheday substitutesHoliday.Type.FIXED, appears incalculate()), not anEARLY_CLOSE; research fixture data described it as "full closure" but this needs confirming against KRX's own published market schedule before implementation, since the design prose alone was ambiguous on this pointScope
HolidayCalendarServiceXKRX, consumingKRHolidaysfor the base list plus the Dec 31 closuremodule-info.javaTesting
HolidayCalendarServiceXKRXTest—isProvided("XKRX")true,isProvided("KR")false from this class's perspectivetestYearEndClosurePresentEveryYearRegardlessOfWeekday()for 2024 (Tue), 2025 (Wed), 2026 (Thu) — confirms the closure is unconditional, not day-of-week-gatedtestDec31ClosureIsFullDayNotEarlyClose()— assert the entry appears incalculate(), notcalculateEarlyCloses()(write this to fail loudly if the confirmed type turns out to beEARLY_CLOSEinstead — don't silently adapt the test to match an unverified assumption)testXKRXSameHolidaysAsKRPlusYearEndClosure(int year)— set-equality check:XKRX.calculate(year)equalsKR.calculate(year)plus the Dec 31 entrytestKRHasNoYearEndClosure()— confirm the Dec 31 closure does not leak into the nationalKRcalendartestHolidayCalendarFactoryCreate()—factory.create("XKRX").getCode()equals"XKRX"XKRXtoHolidayCalendar30YearIT'sallCalendarCodes()Verification
mvn -pl holiday-calendar-apac clean installmvn -pl tests clean verifyRelated
KRHolidaysshared factory)Alternatives Considered
None — market-only Dec 31 closure content is straightforward given
KR's base list already exists.Additional Context
None.