11import { assert , expect } from 'chai' ;
2- import { getISOFormatDate , Calendar , LAST , getDayNumber_SGC , getDayNumberGregorian , getDayNumberJulian , isValidDate_SGC } from './calendar' ;
2+ import {
3+ getISOFormatDate , Calendar , LAST , getDayNumber_SGC , getDayNumberGregorian , getDayNumberJulian , isValidDate_SGC ,
4+ getLastDateInMonth_SGC , getDaysInMonth_SGC , getDayOfWeek_SGC , getDayOfWeekInMonthCount_SGC , getDayOnOrBefore_SGC ,
5+ WEDNESDAY , MONDAY , getDayOnOrAfter_SGC
6+ } from './calendar' ;
37import { YMDDate } from './common' ;
48import { DateTime } from './date-time' ;
59
610describe ( 'Calendar' , ( ) => {
7- const calendar = new Calendar ( ) ;
11+ let calendar : Calendar ;
812
913 beforeEach ( ( ) => {
14+ calendar = new Calendar ( ) ;
1015 DateTime . setDefaultLocale ( 'en-us' ) ;
1116 DateTime . setDefaultTimezone ( 'America/New_York' ) ;
1217 } ) ;
@@ -26,6 +31,8 @@ describe('Calendar', () => {
2631 expect ( getDayNumberGregorian ( { y : 2021 , dy : 40 } ) ) . to . equal ( 18667 ) ;
2732 expect ( getDayNumberGregorian ( { n : 34567 } ) ) . to . equal ( 34567 ) ;
2833 expect ( getDayNumberGregorian ( { n : - 234567 } ) ) . to . equal ( - 234567 ) ;
34+ expect ( getDayNumberJulian ( { y : 2021 , m : 0 , d : 31 } ) ) . to . equal ( 18640 ) ;
35+ expect ( getDayNumberJulian ( { y : 2020 , m : 13 , d : 1 } ) ) . to . equal ( 18641 ) ;
2936 expect ( getDayNumberJulian ( { y : 2021 } ) ) . to . equal ( 18641 ) ;
3037 expect ( getDayNumberJulian ( { y : 2021 , m : 3 } ) ) . to . equal ( 18700 ) ;
3138 expect ( getDayNumberJulian ( { y : 2021 , m : 3 , d : 2 } ) ) . to . equal ( 18701 ) ;
@@ -35,8 +42,11 @@ describe('Calendar', () => {
3542 expect ( ( ) => getDayNumber_SGC ( { } ) ) . to . throw ( 'Calendar: Invalid date arguments' ) ;
3643 expect ( getDayNumber_SGC ( { y : 2021 , j : false } ) ) . to . equal ( 18628 ) ;
3744 expect ( getDayNumber_SGC ( { y : 2021 , j : true } ) ) . to . equal ( 18641 ) ;
45+ expect ( getDayNumber_SGC ( { y : 2021 , m : 0 , d : 31 } ) ) . to . equal ( 18627 ) ;
46+ expect ( getDayNumber_SGC ( { y : 2020 , m : 13 , d : 1 } ) ) . to . equal ( 18628 ) ;
3847 expect ( isValidDate_SGC ( { y : 1582 , m : 10 , d : 7 } ) ) . to . be . false ;
3948 expect ( isValidDate_SGC ( { y : 1582 , m : 10 , d : 7 , j : true } ) ) . to . be . true ;
49+ expect ( calendar . isValidDate ( [ 1582 , 10 , 7 ] ) ) . to . be . false ;
4050 } ) ;
4151
4252 it ( 'should consistently convert the date for a day number back to the same day number.' , ( ) => {
@@ -62,6 +72,7 @@ describe('Calendar', () => {
6272
6373 it ( 'should return Saturday (6) for 1962-10-13.' , ( ) => {
6474 expect ( calendar . getDayOfWeek ( 1962 , 10 , 13 ) ) . to . equal ( 6 ) ;
75+ expect ( getDayOfWeek_SGC ( 1962 , 10 , 13 ) ) . to . equal ( 6 ) ;
6576 } ) ;
6677
6778 it ( 'should return Friday (5) for 2016-12-16.' , ( ) => {
@@ -72,10 +83,35 @@ describe('Calendar', () => {
7283 expect ( calendar . getDateOfNthWeekdayOfMonth ( 2016 , 11 , 4 , 4 ) ) . to . equal ( 24 ) ;
7384 } ) ;
7485
86+ it ( 'should get proper last day for February.' , ( ) => {
87+ expect ( calendar . getLastDateInMonth ( 1900 , 2 ) ) . to . equal ( 28 ) ;
88+ expect ( calendar . getLastDateInMonth ( 1904 , 2 ) ) . to . equal ( 29 ) ;
89+ expect ( calendar . getLastDateInMonth ( 1905 , 2 ) ) . to . equal ( 28 ) ;
90+ expect ( calendar . getLastDateInMonth ( 2000 , 2 ) ) . to . equal ( 29 ) ;
91+ expect ( calendar . getDaysInMonth ( 1900 , 2 ) ) . to . equal ( 28 ) ;
92+ expect ( calendar . getDaysInMonth ( 1904 , 2 ) ) . to . equal ( 29 ) ;
93+ expect ( calendar . getDaysInMonth ( 1905 , 2 ) ) . to . equal ( 28 ) ;
94+ expect ( calendar . getDaysInMonth ( 2000 , 2 ) ) . to . equal ( 29 ) ;
95+ calendar . setPureJulian ( true ) ;
96+ expect ( calendar . isPureJulian ( ) ) . to . be . true ;
97+ expect ( calendar . getLastDateInMonth ( 1900 , 2 ) ) . to . equal ( 29 ) ;
98+
99+ expect ( getLastDateInMonth_SGC ( 1900 , 2 ) ) . to . equal ( 28 ) ;
100+ expect ( getLastDateInMonth_SGC ( 1904 , 2 ) ) . to . equal ( 29 ) ;
101+ expect ( getLastDateInMonth_SGC ( 1905 , 2 ) ) . to . equal ( 28 ) ;
102+ expect ( getLastDateInMonth_SGC ( 2000 , 2 ) ) . to . equal ( 29 ) ;
103+ expect ( getDaysInMonth_SGC ( 1900 , 2 ) ) . to . equal ( 28 ) ;
104+ expect ( getDaysInMonth_SGC ( 1904 , 2 ) ) . to . equal ( 29 ) ;
105+ expect ( getDaysInMonth_SGC ( 1905 , 2 ) ) . to . equal ( 28 ) ;
106+ expect ( getDaysInMonth_SGC ( 2000 , 2 ) ) . to . equal ( 29 ) ;
107+ } ) ;
108+
75109 it ( 'should return a series of Tuesdays at the correct index for each month.' , ( ) => {
76110 let match = true ;
77111 let countMatch = true ;
112+ let countMatch2 = true ;
78113 let count = 0 ;
114+ let count2 = 0 ;
79115 let expectedCount = 0 ;
80116 let month = 1 ;
81117 let day : number ;
@@ -89,8 +125,10 @@ describe('Calendar', () => {
89125 ++ index ;
90126 else {
91127 count = calendar . getDayOfWeekInMonthCount ( lastYmd ?. y , lastYmd ?. m , 2 ) ;
128+ count2 = getDayOfWeekInMonthCount_SGC ( lastYmd ?. y , lastYmd ?. m , 2 ) ;
92129 expectedCount = index ;
93130 countMatch = ( count === expectedCount ) ;
131+ countMatch2 = ( count2 === expectedCount ) ;
94132 index = 1 ;
95133 month = ymd . m ;
96134 }
@@ -102,20 +140,21 @@ describe('Calendar', () => {
102140
103141 assert ( match , getISOFormatDate ( ymd ) + ' -> ' + index + ': ' + day ) ;
104142 assert ( countMatch , getISOFormatDate ( lastYmd ) + ' -> ' + count + ' counted, ' + expectedCount + ' expected.' ) ;
143+ assert ( countMatch2 , getISOFormatDate ( lastYmd ) + ' -> ' + count2 + ' counted, ' + expectedCount + ' expected.' ) ;
105144 } ) ;
106145
107146 it ( 'should have only 19 days in September 1752 when most of North America switched to the Gregorian calendar.' , ( ) => {
108147 calendar . setGregorianChange ( 1752 , 9 , 14 ) ;
109148 expect ( calendar . getDaysInMonth ( 1752 , 9 ) ) . to . equal ( 19 ) ;
110149 } ) ;
111150
112- // Proceeding with modified Gregorian Calendar change...
113-
114151 it ( 'should return 30 as the third Saturday of 1752/09.' , ( ) => {
152+ calendar . setGregorianChange ( 1752 , 9 , 14 ) ;
115153 expect ( calendar . getDateOfNthWeekdayOfMonth ( 1752 , 9 , 6 , 3 ) ) . to . equal ( 30 ) ;
116154 } ) ;
117155
118156 it ( 'should return 30 as the last Saturday of 1752/09.' , ( ) => {
157+ calendar . setGregorianChange ( 1752 , 9 , 14 ) ;
119158 expect ( calendar . getDateOfNthWeekdayOfMonth ( 1752 , 9 , 6 , LAST ) ) . to . equal ( 30 ) ;
120159 } ) ;
121160
@@ -152,4 +191,36 @@ describe('Calendar', () => {
152191 expect ( calendar . getYearWeekAndWeekday ( [ 2021 , 1 , 3 ] ) ) . to . eql ( [ 2020 , 53 , 7 ] ) ;
153192 expect ( calendar . getYearWeekAndWeekday ( [ 2021 , 1 , 4 ] ) ) . to . eql ( [ 2021 , 1 , 1 ] ) ;
154193 } ) ;
194+
195+ it ( 'should properly handle various Julian/Gregorian crossovers.' , ( ) => {
196+ calendar = new Calendar ( [ 1752 , 9 , 14 ] ) ;
197+ expect ( calendar . getDaysInMonth ( 1752 , 9 ) ) . to . equal ( 19 ) ;
198+ expect ( calendar . getDaysInMonth ( 1752 , 10 ) ) . to . equal ( 31 ) ;
199+ expect ( calendar . getMissingDateRange ( 1752 , 9 ) ) . to . eql ( [ 3 , 13 ] ) ;
200+
201+ const dayNum = calendar . getDayNumber ( 1752 , 9 , 2 ) ;
202+
203+ calendar . setPureGregorian ( true ) ;
204+ expect ( calendar . isPureGregorian ( ) ) . to . be . true ;
205+ expect ( calendar . getDateFromDayNumber ( dayNum ) ) . to . include ( { y : 1752 , m : 9 , d : 13 } ) ;
206+ expect ( calendar . getMissingDateRange ( 1752 , 9 ) ) . to . equal ( null ) ;
207+ calendar . setPureGregorian ( false ) ;
208+ expect ( calendar . getDateFromDayNumber ( dayNum ) ) . to . include ( { y : 1752 , m : 9 , d : 13 } ) ;
209+ calendar . setGregorianChange ( 'j' ) ;
210+ expect ( calendar . getDateFromDayNumber ( dayNum ) ) . to . include ( { y : 1752 , m : 9 , d : 2 } ) ;
211+ } ) ;
212+
213+ it ( 'should properly handle getDayOnOrAfter.' , ( ) => {
214+ expect ( getDayOnOrAfter_SGC ( 2022 , 8 , MONDAY , 1 ) ) . to . equal ( 1 ) ;
215+ expect ( calendar . getDayOnOrAfter ( 2022 , 8 , MONDAY , 1 ) ) . to . equal ( 1 ) ;
216+ expect ( getDayOnOrAfter_SGC ( 2022 , 8 , MONDAY , 2 ) ) . to . equal ( 8 ) ;
217+ expect ( calendar . getDayOnOrAfter ( 2022 , 8 , MONDAY , 2 ) ) . to . equal ( 8 ) ;
218+ } ) ;
219+
220+ it ( 'should properly handle getDayOnOrBefore.' , ( ) => {
221+ expect ( getDayOnOrBefore_SGC ( 2021 , 4 , WEDNESDAY , 21 ) ) . to . equal ( 21 ) ;
222+ expect ( calendar . getDayOnOrBefore ( 2021 , 4 , WEDNESDAY , 21 ) ) . to . equal ( 21 ) ;
223+ expect ( getDayOnOrBefore_SGC ( 2021 , 4 , WEDNESDAY , 20 ) ) . to . equal ( 14 ) ;
224+ expect ( calendar . getDayOnOrBefore ( 2021 , 4 , WEDNESDAY , 20 ) ) . to . equal ( 14 ) ;
225+ } ) ;
155226} ) ;
0 commit comments