UNPKG

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
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`); } }); }); });