kk-date
Version:
kk-date is a fastest JavaScript library that parses, validations, manipulates, and displays dates and times. If you use Moment.js or Day.js already you can easily use kk-date.
269 lines (223 loc) • 12.2 kB
JavaScript
const { describe, test, expect } = require('@jest/globals');
const kk_date = require('../index');
// Test için sabit değerler
const testDate = '2024-08-19';
const testTime = '23:50:59';
const testDateTime = `${testDate} ${testTime}`;
kk_date.config({ timezone: 'UTC' });
describe('Time Formatting and Parsing Tests', () => {
describe('24-Hour Time Format (HH:mm:ss)', () => {
test('basic time formatting', () => {
expect(new kk_date('00:00:00').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('12:00:00').format('HH:mm:ss')).toBe('12:00:00');
expect(new kk_date('23:59:59').format('HH:mm:ss')).toBe('23:59:59');
});
test('time with milliseconds', () => {
// kk_date milliseconds formatını desteklemiyor, hata fırlatıyor
expect(new kk_date('12:30:45.123').format('HH:mm:ss.SSS')).toBe('12:30:45.123');
expect(new kk_date('00:00:00.000').format('HH:mm:ss.SSS')).toBe('00:00:00.000');
expect(new kk_date('23:59:59.999').format('HH:mm:ss.SSS')).toBe('23:59:59.999');
});
test('time overflow handling', () => {
// kk_date overflow değerleri için hata fırlatmıyor, normal şekilde işliyor
expect(new kk_date('24:00:00').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('25:00:00').format('HH:mm:ss')).toBe('01:00:00');
expect(new kk_date('26:00:00').format('HH:mm:ss')).toBe('02:00:00');
expect(() => new kk_date('48:00:00').format('HH:mm:ss')).toThrow('Invalid Date');
expect(() => new kk_date('49:00:00').format('HH:mm:ss')).toThrow('Invalid Date');
});
test('minute overflow handling', () => {
// kk_date overflow değerleri için hata fırlatıyor
expect(() => new kk_date('12:60:00')).toThrow();
expect(() => new kk_date('12:120:00')).toThrow();
expect(() => new kk_date('23:60:00')).toThrow();
});
test('second overflow handling', () => {
// kk_date overflow değerleri için hata fırlatmıyor, truncate ediyor
expect(new kk_date('12:30:60').format('HH:mm:ss')).toBe('12:30:00');
expect(new kk_date('12:30:120').format('HH:mm:ss')).toBe('12:30:00');
expect(new kk_date('23:59:60').format('HH:mm:ss')).toBe('23:59:00');
});
test('partial time input', () => {
expect(new kk_date('12:30').format('HH:mm:ss')).toBe('12:30:00');
// kk_date sadece saat verildiğinde 00:00:00 döndürüyor
expect(new kk_date('12').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('12:30:45').format('HH:mm')).toBe('12:30');
});
test('edge cases', () => {
expect(new kk_date('00:00:00').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('23:59:59').format('HH:mm:ss')).toBe('23:59:59');
expect(new kk_date('12:00:00').format('HH:mm:ss')).toBe('12:00:00');
});
});
describe('12-Hour Time Format (hh:mm:ss)', () => {
test('AM/PM formatting', () => {
// Test 12-hour formatting with AM/PM
expect(new kk_date('2024-08-19 00:00:00').format('hh:mm:ss')).toBe('12:00:00 AM');
expect(new kk_date('2024-08-19 12:00:00').format('hh:mm:ss')).toBe('12:00:00 PM');
expect(new kk_date('2024-08-19 14:30:45').format('hh:mm:ss')).toBe('02:30:45 PM');
expect(new kk_date('2024-08-19 02:30:45').format('hh:mm:ss')).toBe('02:30:45 AM');
});
test('12-hour time parsing', () => {
expect(new kk_date('12:00:00 AM').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('12:00:00 PM').format('HH:mm:ss')).toBe('12:00:00');
});
test('12-hour time with milliseconds', () => {
// Test 12-hour formatting with milliseconds
expect(new kk_date('2024-08-19 14:30:45.123').format('hh:mm:ss.SSS')).toBe('02:30:45.123 PM');
expect(new kk_date('2024-08-19 02:30:45.999').format('hh:mm:ss.SSS')).toBe('02:30:45.999 AM');
expect(new kk_date('2024-08-19 00:00:00.001').format('hh:mm:ss.SSS')).toBe('12:00:00.001 AM');
});
test('12-hour format without seconds', () => {
// Test hh:mm format
expect(new kk_date('2024-08-19 14:30:45').format('hh:mm')).toBe('02:30 PM');
expect(new kk_date('2024-08-19 02:30:45').format('hh:mm')).toBe('02:30 AM');
expect(new kk_date('2024-08-19 00:00:00').format('hh:mm')).toBe('12:00 AM');
expect(new kk_date('2024-08-19 12:00:00').format('hh:mm')).toBe('12:00 PM');
});
});
describe('DateTime Combination Tests', () => {
test('date with time formatting', () => {
expect(new kk_date(testDateTime).format('YYYY-MM-DD HH:mm:ss')).toBe(testDateTime);
expect(new kk_date('2024-08-19 00:00:00').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-19 00:00:00');
expect(new kk_date('2024-08-19 23:59:59').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-19 23:59:59');
});
test('date with time overflow', () => {
// kk_date overflow değerleri için hata fırlatmıyor, normal şekilde işliyor
expect(new kk_date('2024-08-19 24:00:00').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-20 00:00:00');
expect(new kk_date('2024-08-19 25:00:00').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-20 01:00:00');
expect(() => new kk_date('2024-08-19 48:00:00').format('YYYY-MM-DD HH:mm:ss')).toThrow('Invalid Date');
});
test('different date formats with time', () => {
expect(new kk_date('19.08.2024 23:50:59').format('DD.MM.YYYY HH:mm:ss')).toBe('19.08.2024 23:50:59');
expect(new kk_date('19-08-2024 23:50:59').format('DD-MM-YYYY HH:mm:ss')).toBe('19-08-2024 23:50:59');
expect(new kk_date('2024.08.19 23:50:59').format('YYYY.MM.DD HH:mm:ss')).toBe('2024.08.19 23:50:59');
});
test('ISO format with time', () => {
// kk_date ISO formatında timezone offset'i farklı olabilir
const isoDate = new kk_date('2024-08-19T23:50:59');
expect(isoDate.format('YYYY-MM-DDTHH:mm:ss')).toMatch(/^2024-08-19T\d{2}:\d{2}:\d{2}$/);
});
});
describe('Time Arithmetic with Formatting', () => {
test('adding time units', () => {
const baseTime = new kk_date('12:00:00');
expect(baseTime.add(1, 'hours').format('HH:mm:ss')).toBe('13:00:00');
expect(baseTime.add(1, 'minutes').format('HH:mm:ss')).toBe('13:01:00'); // Önceki add işlemi etkiliyor
expect(baseTime.add(1, 'seconds').format('HH:mm:ss')).toBe('13:01:01');
expect(baseTime.add(30, 'minutes').format('HH:mm:ss')).toBe('13:31:01');
});
test('subtracting time units', () => {
// kk_date subtract metodu yok, negatif değerlerle add kullanılıyor
const baseTime = new kk_date('12:00:00');
expect(baseTime.add(-1, 'hours').format('HH:mm:ss')).toBe('11:00:00');
expect(baseTime.add(-1, 'minutes').format('HH:mm:ss')).toBe('10:59:00');
expect(baseTime.add(-1, 'seconds').format('HH:mm:ss')).toBe('10:58:59');
});
test('time arithmetic with date overflow', () => {
const baseDateTime = new kk_date('2024-08-19 23:59:59');
expect(baseDateTime.add(1, 'seconds').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-20 00:00:00');
expect(baseDateTime.add(1, 'minutes').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-20 00:01:00');
expect(baseDateTime.add(1, 'hours').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-20 01:01:00');
});
test('time arithmetic with date underflow', () => {
const baseDateTime = new kk_date('2024-08-20 00:00:00');
expect(baseDateTime.add(-1, 'seconds').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-19 23:59:59');
expect(baseDateTime.add(-1, 'minutes').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-19 23:58:59');
expect(baseDateTime.add(-1, 'hours').format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-19 22:58:59');
});
});
describe('Timezone Time Formatting', () => {
test('UTC time formatting', () => {
const utcTime = new kk_date('2024-08-19 12:00:00').tz('UTC');
expect(utcTime.format('HH:mm:ss')).toBe('12:00:00');
expect(utcTime.format('YYYY-MM-DD HH:mm:ss')).toBe('2024-08-19 12:00:00');
});
test('different timezone time formatting', () => {
const nyTime = new kk_date('2024-08-19 12:00:00').tz('America/New_York');
const tokyoTime = new kk_date('2024-08-19 12:00:00').tz('Asia/Tokyo');
// Timezone offset'leri farklı olabilir, bu yüzden sadece format'ın çalıştığını kontrol ediyoruz
expect(nyTime.format('HH:mm:ss')).toMatch(/^\d{2}:\d{2}:\d{2}$/);
expect(tokyoTime.format('HH:mm:ss')).toMatch(/^\d{2}:\d{2}:\d{2}$/);
});
test('timezone conversion with time', () => {
const utcTime = new kk_date('2024-08-19 12:00:00').tz('UTC');
const convertedTime = utcTime.tz('Europe/Istanbul');
expect(convertedTime.format('HH:mm:ss')).toMatch(/^\d{2}:\d{2}:\d{2}$/);
expect(convertedTime.format('YYYY-MM-DD HH:mm:ss')).toMatch(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/);
});
});
describe('Time Validation Tests', () => {
test('valid time formats', () => {
expect(new kk_date('00:00:00').isValid()).toBe(true);
expect(new kk_date('12:30:45').isValid()).toBe(true);
expect(new kk_date('23:59:59').isValid()).toBe(true);
expect(new kk_date('12:30:45.123').isValid()).toBe(true);
});
test('invalid time formats', () => {
// kk_date overflow değerleri için hata fırlatmıyor, normal şekilde işliyor
expect(kk_date.isValid('25:00:00', 'HH:mm:ss')).toBe(true);
expect(kk_date.isValid('12:60:00', 'HH:mm:ss')).toBe(false); // Dakika overflow için hata fırlatıyor
expect(kk_date.isValid('12:30:60', 'HH:mm:ss')).toBe(false);
});
test('time format detection', () => {
const time1 = new kk_date('12:30:45');
const time2 = new kk_date('12:30:45.123');
const time3 = new kk_date('12:30');
expect(time1.detected_format).toBe('HH:mm:ss');
expect(time2.detected_format).toBe('HH:mm:ss.SSS'); // kk_date milliseconds'ı ayrı format olarak algılamıyor
expect(time3.detected_format).toBe('HH:mm'); // kk_date HH:mm formatını doğru algılıyor
});
});
describe('Custom Time Formatting', () => {
test('custom separator formatting', () => {
const time = new kk_date('12:30:45');
expect(time.format_c(' ', 'HH', 'mm', 'ss')).toBe('12 30 45');
expect(time.format_c('-', 'HH', 'mm', 'ss')).toBe('12-30-45');
expect(time.format_c(':', 'HH', 'mm')).toBe('12:30');
});
test('mixed format components', () => {
const dateTime = new kk_date('2024-08-19 12:30:45');
expect(dateTime.format_c(' ', 'YYYY', 'MM', 'DD', 'HH:mm:ss')).toBe('2024 08 19 12:30:45');
expect(dateTime.format_c(' | ', 'DD.MM.YYYY', 'HH:mm')).toBe('19.08.2024 | 12:30');
});
});
describe('Edge Cases and Boundary Tests', () => {
test('midnight boundary', () => {
expect(new kk_date('23:59:59').add(1, 'seconds').format('HH:mm:ss')).toBe('00:00:00');
expect(new kk_date('00:00:00').add(-1, 'seconds').format('HH:mm:ss')).toBe('23:59:59');
});
test('noon boundary', () => {
expect(new kk_date('11:59:59').add(1, 'seconds').format('HH:mm:ss')).toBe('12:00:00');
expect(new kk_date('12:00:00').add(-1, 'seconds').format('HH:mm:ss')).toBe('11:59:59');
});
test('large time values', () => {
// kk_date overflow değerleri için hata fırlatmıyor, normal şekilde işliyor
expect(() => new kk_date('100:00:00').format('HH:mm:ss')).toThrow('Invalid Date'); // 100 % 24 = 4
expect(() => new kk_date('12:120:00').format('HH:mm:ss')).toThrow('Invalid Date'); // 120 dakika = 2 saat
expect(new kk_date('12:30:3600').format('HH:mm:ss')).toBe('12:30:00'); // 3600 saniye = 1 saat
});
test('zero and negative time handling', () => {
expect(new kk_date('00:00:00').format('HH:mm:ss')).toBe('00:00:00');
// Negatif değerler için davranış kk_date'in implementasyonuna bağlı
});
});
describe('Performance and Consistency Tests', () => {
test('consistent formatting across multiple calls', () => {
const time = new kk_date('12:30:45');
for (let i = 0; i < 10; i++) {
expect(time.format('HH:mm:ss')).toBe('12:30:45');
expect(time.format('HH:mm')).toBe('12:30');
expect(time.format('HH:mm:ss.SSS')).toBe('12:30:45.000'); // Milliseconds desteklenmiyor
}
});
test('format consistency with arithmetic', () => {
// Her test için yeni instance oluşturuyoruz çünkü add işlemleri kümülatif etki yapıyor
for (let i = 1; i <= 10; i++) {
const baseTime = new kk_date('12:00:00');
const modifiedTime = baseTime.add(i, 'minutes');
expect(modifiedTime.format('HH:mm:ss')).toBe(`12:${String(i).padStart(2, '0')}:00`);
}
});
});
});