camote-utils
Version:
A comprehensive TypeScript utility library featuring advanced string and number formatting, data structures, and algorithms
178 lines (146 loc) • 5.53 kB
text/typescript
import {
humanReadableNumber,
formatWithCommas,
formatPercentage,
formatOrdinal,
formatFileSize,
formatCurrency,
formatDecimals,
calculateDiscountPrice
} from '../src/formatters/number'
describe('Number Formatters', () => {
describe('humanReadableNumber', () => {
it('should format numbers with K suffix', () => {
expect(humanReadableNumber(1234)).toBe('1.2K')
expect(humanReadableNumber(5678)).toBe('5.7K')
})
it('should format numbers with M suffix', () => {
expect(humanReadableNumber(1234567)).toBe('1.2M')
})
it('should handle numbers less than 1000', () => {
expect(humanReadableNumber(999)).toBe('999')
})
it('should format numbers with specified decimals', () => {
expect(humanReadableNumber(1234, { decimals: 1 })).toBe('1.2K')
expect(humanReadableNumber(1500, { decimals: 0 })).toBe('2K')
})
it('should format numbers in compact representation', () => {
expect(humanReadableNumber(1500, { compact: true })).toBe('1.5K')
expect(humanReadableNumber(1500000, { compact: true })).toBe('1.5M')
})
})
describe('formatWithCommas', () => {
it('should add commas to large numbers', () => {
expect(formatWithCommas(1234567)).toBe('1,234,567')
})
it('should handle numbers less than 1000', () => {
expect(formatWithCommas(999)).toBe('999')
})
it('should handle zero', () => {
expect(formatWithCommas(0)).toBe('0')
})
})
describe('formatPercentage', () => {
it('should format number as percentage with default decimals', () => {
expect(formatPercentage(0.1234)).toBe('12%')
})
it('should format number as percentage with specified decimals', () => {
expect(formatPercentage(0.1234, 1)).toBe('12.3%')
})
it('should handle zero', () => {
expect(formatPercentage(0)).toBe('0%')
})
})
describe('formatOrdinal', () => {
it('should format numbers with st suffix', () => {
expect(formatOrdinal(1)).toBe('1st')
expect(formatOrdinal(21)).toBe('21st')
})
it('should format numbers with nd suffix', () => {
expect(formatOrdinal(2)).toBe('2nd')
expect(formatOrdinal(22)).toBe('22nd')
})
it('should format numbers with rd suffix', () => {
expect(formatOrdinal(3)).toBe('3rd')
expect(formatOrdinal(23)).toBe('23rd')
})
it('should format numbers with th suffix', () => {
expect(formatOrdinal(4)).toBe('4th')
expect(formatOrdinal(11)).toBe('11th')
expect(formatOrdinal(12)).toBe('12th')
expect(formatOrdinal(13)).toBe('13th')
})
})
describe('formatFileSize', () => {
it('should format bytes', () => {
expect(formatFileSize(500)).toBe('500 Bytes')
})
it('should format kilobytes', () => {
expect(formatFileSize(1024)).toBe('1.00 KB')
})
it('should format megabytes', () => {
expect(formatFileSize(1024 * 1024)).toBe('1.00 MB')
})
it('should handle zero', () => {
expect(formatFileSize(0)).toBe('0 Bytes')
})
})
describe('formatCurrency', () => {
it('should format USD by default', () => {
expect(formatCurrency(1234.56)).toBe('$1,234.56')
})
it('should format with specified currency and locale', () => {
const formatted = formatCurrency(1234.56, 'EUR', 'de-DE')
expect(formatted).toMatch(/1[.,]234[.,]56\s*€/)
})
it('should handle zero', () => {
expect(formatCurrency(0)).toBe('$0.00')
})
})
describe('formatDecimals', () => {
it('should format with specified decimal places', () => {
expect(formatDecimals(1.2345, 2)).toBe('1.23')
})
it('should round up with ceil mode', () => {
expect(formatDecimals(1.2345, 2, 'ceil')).toBe('1.24')
})
it('should round down with floor mode', () => {
expect(formatDecimals(1.2345, 2, 'floor')).toBe('1.23')
})
it('should handle zero', () => {
expect(formatDecimals(0, 2)).toBe('0.00')
})
})
describe('calculateDiscountPrice', () => {
test('should calculate percentage discount correctly', () => {
expect(calculateDiscountPrice(100, 20, '%')).toBe(80.00)
expect(calculateDiscountPrice(50, 10, '%')).toBe(45.00)
expect(calculateDiscountPrice(75.50, 15, '%')).toBe(64.17)
})
test('should calculate fixed amount discount correctly', () => {
expect(calculateDiscountPrice(100, 30, '$')).toBe(70.00)
expect(calculateDiscountPrice(50, 10, '$')).toBe(40.00)
expect(calculateDiscountPrice(75.50, 15.50, '$')).toBe(60.00)
})
test('should default to percentage discount when no type is specified', () => {
expect(calculateDiscountPrice(100, 10)).toBe(90.00)
expect(calculateDiscountPrice(50, 20)).toBe(40.00)
expect(calculateDiscountPrice(75.50, 25)).toBe(56.63)
})
test('should handle edge cases correctly', () => {
// 100% discount
expect(calculateDiscountPrice(100, 100, '%')).toBe(0.00)
// 0% discount
expect(calculateDiscountPrice(100, 0, '%')).toBe(100.00)
// Discount greater than price
expect(calculateDiscountPrice(50, 75, '$')).toBe(-25.00)
// Zero price
expect(calculateDiscountPrice(0, 20, '%')).toBe(0.00)
})
test('should round to 2 decimal places', () => {
expect(calculateDiscountPrice(100.33, 33.33, '%')).toBe(66.89)
expect(calculateDiscountPrice(50.55, 10.55, '$')).toBe(40.00)
expect(calculateDiscountPrice(75.99, 25)).toBe(56.99)
})
})
})