import assert from 'assert' ; import startOfUTCWeek from '.' ; describe ( 'startOfUTCWeek' , ( ) => { it ( 'returns the date with the time set to 00:00:00 and the date set to the first day of a week' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ; const result = startOfUTCWeek ( date ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 7 , 31 ) ) ) ; } ) ; it ( 'allows to specify which day is the first day of the week' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ; const result = startOfUTCWeek ( date , { weekStartsOn : 1 } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 8 , 1 ) ) ) ; } ) ; it ( 'allows to specify which day is the first day of the week in locale' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ; const result = startOfUTCWeek ( date , { locale : { options : { weekStartsOn : 1 } , } , } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 8 , 1 ) ) ) ; } ) ; it ( '`options.weekStartsOn` overwrites the first day of the week specified in locale' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ; const result = startOfUTCWeek ( date , { weekStartsOn : 1 , locale : { options : { weekStartsOn : 0 } , } , } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 8 , 1 ) ) ) ; } ) ; it ( 'implicitly converts options' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ; const result = startOfUTCWeek ( date , { weekStartsOn : '1' , } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 8 , 1 ) ) ) ; } ) ; it ( 'accepts a timestamp' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) . getTime ( ) ; const result = startOfUTCWeek ( date ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 7 , 31 ) ) ) ; } ) ; it ( 'does not mutate the original date' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ; startOfUTCWeek ( date ) ; assert . deepStrictEqual ( date , new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) ) ; } ) ; describe ( 'edge cases' , ( ) => { describe ( 'when the given day is before the start of a week' , ( ) => { it ( 'it returns the start of a week' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 9 , 6 ) ) ; const result = startOfUTCWeek ( date , { weekStartsOn : 3 } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 9 , 1 ) ) ) ; } ) ; } ) ; describe ( 'when the given day is the start of a week' , ( ) => { it ( 'it returns the start of a week' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 9 , 8 ) ) ; const result = startOfUTCWeek ( date , { weekStartsOn : 3 } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 9 , 8 ) ) ) ; } ) ; } ) ; describe ( 'when the given day is after the start of a week' , ( ) => { it ( 'it returns the start of a week' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 9 , 10 ) ) ; const result = startOfUTCWeek ( date , { weekStartsOn : 3 } ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2014 , 9 , 8 ) ) ) ; } ) ; } ) ; it ( 'handles the week at the start of a year' , ( ) => { const date = new Date ( Date . UTC ( 2014 , 0 , 1 ) ) ; const result = startOfUTCWeek ( date ) ; assert . deepStrictEqual ( result , new Date ( Date . UTC ( 2013 , 11 , 29 ) ) ) ; } ) ; } ) ; it ( 'returns `Invalid Date` if the given date is invalid' , ( ) => { const result = startOfUTCWeek ( new Date ( NaN ) ) ; assert ( result instanceof Date && isNaN ( result . getTime ( ) ) ) ; } ) ; it ( 'throws `RangeError` if `options.weekStartsOn` is not convertable to 0, 1, ..., 6 or undefined' , ( ) => { const block = ( ) => startOfUTCWeek ( new Date ( Date . UTC ( 2014 , 8 , 2 , 11 , 55 , 0 ) ) , { weekStartsOn : NaN , } ) ; assert . throws ( block , RangeError ) ; } ) ; it ( 'throws TypeError exception if passed less than 1 argument' , ( ) => { assert . throws ( startOfUTCWeek . bind ( null ) , TypeError ) ; } ) ; } ) ;