Back to Repositories

Validating Bengali Locale Implementation in dayjs

This test suite validates the Bengali (Bangladesh) locale implementation in the Day.js library, focusing on date formatting, relative time calculations, and locale-specific parsing. It ensures proper handling of Bengali date representations and time calculations through comprehensive comparison with Moment.js.

Test Coverage Overview

The test suite provides extensive coverage of Bengali locale functionality including:
  • Month formatting in various patterns (full, short)
  • Date string parsing with locale considerations
  • Relative time calculations across different time units
  • Direct comparison with Moment.js outputs for validation
Testing spans multiple time units from seconds to years, ensuring accurate Bengali representations.

Implementation Analysis

The testing approach utilizes Jest’s describe/it pattern with MockDate for consistent date handling.
  • Implements parallel testing against Moment.js as reference implementation
  • Uses plugin architecture (relativeTime, localeData, preParsePostFormat)
  • Employs systematic iteration through time units and formats

Technical Details

Key technical components include:
  • Jest test framework with MockDate for date manipulation
  • Day.js plugins: relativeTime, localeData, preParsePostFormat
  • Moment.js for reference implementation comparison
  • Locale-specific format patterns (DD MMMM YYYY MMM)

Best Practices Demonstrated

The test suite exemplifies strong testing practices:
  • Consistent test setup/teardown with beforeEach/afterEach
  • Comprehensive format pattern testing
  • Systematic validation against established library
  • Isolation of locale-specific functionality
  • Clear test case organization and naming

iamkun/dayjs

test/locale/bn-bd.test.js

            
import moment from 'moment'
import MockDate from 'mockdate'
import dayjs from '../../src'
import relativeTime from '../../src/plugin/relativeTime'
import localeData from '../../src/plugin/localeData'
import preParsePostFormat from '../../src/plugin/preParsePostFormat'
import '../../src/locale/bn-bd'

dayjs.extend(localeData)
dayjs.extend(relativeTime)
dayjs.extend(preParsePostFormat)

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

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

it('Format Month with locale function', () => {
  for (let i = 0; i <= 7; i += 1) {
    const dayjsBN = dayjs()
      .locale('bn-bd')
      .add(i, 'day')
    const momentBN = moment()
      .locale('bn-bd')
      .add(i, 'day')
    const testFormat1 = 'DD MMMM YYYY MMM'
    const testFormat2 = 'MMMM'
    const testFormat3 = 'MMM'
    expect(dayjsBN.format(testFormat1)).toEqual(momentBN.format(testFormat1))
    expect(dayjsBN.format(testFormat2)).toEqual(momentBN.format(testFormat2))
    expect(dayjsBN.format(testFormat3)).toEqual(momentBN.format(testFormat3))
  }
})

it('Month short', () => {
  const date = '2021-02-01T05:54:32.005Z'
  const dayjsBN = dayjs(date)
    .locale('bn-bd')
  const momentBN = moment(date)
    .locale('bn-bd')
  const testFormat1 = 'DD MMMM YYYY MMM'
  expect(dayjsBN.format(testFormat1)).toEqual(momentBN.format(testFormat1))
})

it('Preparse with locale function', () => {
  for (let i = 0; i <= 7; i += 1) {
    dayjs.locale('bn-bd')
    const momentBN = moment()
      .locale('bn-bd')
      .add(i, 'day')
    expect(dayjs(momentBN.format()).format()).toEqual(momentBN.format())
  }
})

it('RelativeTime: Time from X', () => {
  const T = [
    [44.4, 'second'], // a few seconds
    [89.5, 'second'], // a minute
    [130, 'second'], // two minutes
    [43, 'minute'], // 44 minutes
    [1, 'hour'], // 1 hour
    [21, 'hour'], // 21 hours
    [2, 'day'], // 2 days
    [25, 'day'], // 25 days
    [2, 'month'], // 2 months
    [10, 'month'], // 10 months
    [18, 'month'], // 2 years
    [15, 'year'] // 15 years
  ]

  T.forEach((t) => {
    dayjs.locale('bn-bd')
    moment.locale('bn-bd')
    expect(dayjs().from(dayjs().add(t[0], t[1]))).toBe(moment().from(moment().add(t[0], t[1])))
    expect(dayjs().from(dayjs().add(t[0], t[1]), true))
      .toBe(moment().from(moment().add(t[0], t[1]), true))
  })
})