Back to Repositories

Validating ISO Week Calculations Implementation in iamkun/dayjs

This test suite validates the ISO week functionality in the Day.js library, ensuring accurate handling of ISO week calculations and comparisons with Moment.js implementations. The tests cover essential ISO week operations including getting/setting ISO weeks, ISO weekdays, and year transitions.

Test Coverage Overview

The test suite provides comprehensive coverage of ISO week functionality, including:
  • ISO week number retrieval and setting
  • ISO week year calculations
  • Week start/end operations
  • ISO weekday handling
  • Year boundary transitions for weeks 52/53/1
  • UTC mode compatibility

Implementation Analysis

The testing approach utilizes Jest’s testing framework with MockDate for consistent date handling. Tests are structured to validate Day.js results against Moment.js implementations, ensuring compatibility and accuracy. Each test case uses direct value comparisons with toBe() assertions for precise validation.

Technical Details

Testing infrastructure includes:
  • Jest as the testing framework
  • MockDate for date mocking
  • Day.js with isoWeek and UTC plugins
  • Moment.js for reference implementations
  • Direct millisecond-level value comparisons

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Consistent test setup/teardown with beforeEach/afterEach
  • Comprehensive edge case coverage around year boundaries
  • Systematic validation against reference implementation
  • Isolated plugin testing
  • Clear test case organization and naming

iamkun/dayjs

test/plugin/isoWeek.test.js

            
import MockDate from 'mockdate'
import moment from 'moment'
import dayjs from '../../src'
import isoWeek from '../../src/plugin/isoWeek'
import utc from '../../src/plugin/utc'

dayjs.extend(isoWeek)
dayjs.extend(utc)

beforeEach(() => {
  MockDate.set(new Date())
})

afterEach(() => {
  MockDate.reset()
})

it('get isoWeek', () => {
  expect(dayjs().isoWeek()).toBe(moment().isoWeek())
})

it('set isoWeek', () => {
  expect(dayjs().isoWeek(1).valueOf()).toBe(moment().isoWeek(1).valueOf())
  expect(dayjs().isoWeek(52).valueOf()).toBe(moment().isoWeek(52).valueOf())
})

it('get isoWeekYear', () => {
  expect(dayjs().isoWeekYear()).toBe(moment().isoWeekYear())
})

it('startOf/endOf isoWeek', () => {
  const ISOWEEK = 'isoWeek'
  expect(dayjs().startOf(ISOWEEK).valueOf()).toBe(moment().startOf(ISOWEEK).valueOf())
  expect(dayjs().endOf(ISOWEEK).valueOf()).toBe(moment().endOf(ISOWEEK).valueOf())
})

it('isoWeekday', () => {
  expect(dayjs().isoWeekday()).toBe(moment().isoWeekday())
  expect(dayjs('20200301').isoWeekday(1).valueOf()).toBe(moment('20200301').isoWeekday(1).valueOf()) // Sunday this.day() -> 0
  for (let i = 0; i < 7; i += 1) {
    expect(dayjs().add(i, 'day').isoWeekday()).toBe(moment().add(i, 'day').isoWeekday())
    expect(dayjs().isoWeekday(i).valueOf()).toBe(moment().isoWeekday(i).valueOf())
    expect(dayjs().add(1, 'day').isoWeekday(i).valueOf()).toBe(moment().add(1, 'day').isoWeekday(i).valueOf())
  }
})

it('isoWeek of year', () => {
  expect(dayjs().isoWeek(1).isoWeek()).toBe(1)
  expect(dayjs().isoWeek(27).isoWeek()).toBe(27)


  expect(dayjs('20191223').isoWeekYear()).toBe(2019)
  expect(dayjs('20191223').isoWeek()).toBe(52)
  expect(dayjs('20191224').isoWeekYear()).toBe(2019)
  expect(dayjs('20191224').isoWeek()).toBe(52)
  expect(dayjs('20191225').isoWeekYear()).toBe(2019)
  expect(dayjs('20191225').isoWeek()).toBe(52)
  expect(dayjs('20191226').isoWeekYear()).toBe(2019)
  expect(dayjs('20191226').isoWeek()).toBe(52)
  expect(dayjs('20191227').isoWeekYear()).toBe(2019)
  expect(dayjs('20191227').isoWeek()).toBe(52)
  expect(dayjs('20191228').isoWeekYear()).toBe(2019)
  expect(dayjs('20191228').isoWeek()).toBe(52)
  expect(dayjs('20191229').isoWeekYear()).toBe(2019)
  expect(dayjs('20191229').isoWeek()).toBe(52)

  expect(dayjs('20191230').isoWeekYear()).toBe(2020)
  expect(dayjs('20191230').isoWeek()).toBe(1)
  expect(dayjs('20191231').isoWeekYear()).toBe(2020)
  expect(dayjs('20191231').isoWeek()).toBe(1)
  expect(dayjs('20200101').isoWeekYear()).toBe(2020)
  expect(dayjs('20200101').isoWeek()).toBe(1)
  expect(dayjs('20200102').isoWeekYear()).toBe(2020)
  expect(dayjs('20200102').isoWeek()).toBe(1)
  expect(dayjs('20200103').isoWeekYear()).toBe(2020)
  expect(dayjs('20200103').isoWeek()).toBe(1)
  expect(dayjs('20200104').isoWeekYear()).toBe(2020)
  expect(dayjs('20200104').isoWeek()).toBe(1)
  expect(dayjs('20200105').isoWeekYear()).toBe(2020)
  expect(dayjs('20200105').isoWeek()).toBe(1)

  expect(dayjs('20200106').isoWeekYear()).toBe(2020)
  expect(dayjs('20200106').isoWeek()).toBe(2)
  expect(dayjs('20200107').isoWeekYear()).toBe(2020)
  expect(dayjs('20200107').isoWeek()).toBe(2)


  expect(dayjs('20201223').isoWeekYear()).toBe(2020)
  expect(dayjs('20201223').isoWeek()).toBe(52)
  expect(dayjs('20201224').isoWeekYear()).toBe(2020)
  expect(dayjs('20201224').isoWeek()).toBe(52)
  expect(dayjs('20201225').isoWeekYear()).toBe(2020)
  expect(dayjs('20201225').isoWeek()).toBe(52)
  expect(dayjs('20201226').isoWeekYear()).toBe(2020)
  expect(dayjs('20201226').isoWeek()).toBe(52)
  expect(dayjs('20201227').isoWeekYear()).toBe(2020)
  expect(dayjs('20201227').isoWeek()).toBe(52)

  expect(dayjs('20201228').isoWeekYear()).toBe(2020)
  expect(dayjs('20201228').isoWeek()).toBe(53)
  expect(dayjs('20201229').isoWeekYear()).toBe(2020)
  expect(dayjs('20201229').isoWeek()).toBe(53)
  expect(dayjs('20201230').isoWeekYear()).toBe(2020)
  expect(dayjs('20201230').isoWeek()).toBe(53)
  expect(dayjs('20201231').isoWeekYear()).toBe(2020)
  expect(dayjs('20201231').isoWeek()).toBe(53)
  expect(dayjs('20210101').isoWeekYear()).toBe(2020)
  expect(dayjs('20210101').isoWeek()).toBe(53)
  expect(dayjs('20210102').isoWeekYear()).toBe(2020)
  expect(dayjs('20210102').isoWeek()).toBe(53)
  expect(dayjs('20210103').isoWeekYear()).toBe(2020)
  expect(dayjs('20210103').isoWeek()).toBe(53)

  expect(dayjs('20210104').isoWeekYear()).toBe(2021)
  expect(dayjs('20210104').isoWeek()).toBe(1)
  expect(dayjs('20210105').isoWeekYear()).toBe(2021)
  expect(dayjs('20210105').isoWeek()).toBe(1)
  expect(dayjs('20210106').isoWeekYear()).toBe(2021)
  expect(dayjs('20210106').isoWeek()).toBe(1)
  expect(dayjs('20210107').isoWeekYear()).toBe(2021)
  expect(dayjs('20210107').isoWeek()).toBe(1)
  expect(dayjs('20210108').isoWeekYear()).toBe(2021)
  expect(dayjs('20210108').isoWeek()).toBe(1)
  expect(dayjs('20210109').isoWeekYear()).toBe(2021)
  expect(dayjs('20210109').isoWeek()).toBe(1)
  expect(dayjs('20210110').isoWeekYear()).toBe(2021)
  expect(dayjs('20210110').isoWeek()).toBe(1)
})


it('utc mode', () => {
  // Wednesday, 1 January 2020 00:00:00 UTC
  const d = dayjs.utc(1577836800000).isoWeek()
  expect(d).toBe(1)
  expect(moment.utc(1577836800000).isoWeek()).toBe(d)
})