feat(swift): voeg date/time parsing toe (E2)
Epic 2 compleet: NLP-helpers voor datum en tijd interpretatie.
Implementatie:
- parseRelativeDate(): ondersteunt "vandaag", "morgen", "deze week",
weekdagen (maandag-zondag), en absolute datums (30 december, 28-12-2024)
- parseTime(): ondersteunt "14:00", "14", "half drie", "kwart voor drie",
en natuurlijke taal tijdsaanduidingen
- combineDatetime(): combineert datum + tijd naar ISO string
- isNotInPast(): validatie voor toekomstige datums
- isDateRange(): type guard voor datum ranges
Integratie:
- Entity extractor gebruikt date/time parser voor agenda intents
- Normaliseert ruwe strings ("morgen", "14:00") naar Date objecten
- Ondersteunt Nederlandse tijdsaanduidingen
Tests & validatie:
- Unit tests voor alle parser functies
- Verify script voor handmatige testing
- Review document met bevindingen en suggesties
Story points: 7 SP (E2.S1: 3, E2.S2: 2, E2.S3: 2)
This commit is contained in:
93
lib/swift/verify-parser.ts
Normal file
93
lib/swift/verify-parser.ts
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* Manual verification script for date-time parser
|
||||
* Run with: pnpm tsx lib/swift/verify-parser.ts
|
||||
*/
|
||||
|
||||
import {
|
||||
parseRelativeDate,
|
||||
parseTime,
|
||||
isDateRange,
|
||||
combineDatetime,
|
||||
isNotInPast,
|
||||
} from './date-time-parser';
|
||||
import { format } from 'date-fns';
|
||||
import { nl } from 'date-fns/locale';
|
||||
|
||||
console.log('🧪 Testing Date/Time Parser\n');
|
||||
|
||||
// Test parseRelativeDate
|
||||
console.log('📅 Testing parseRelativeDate():\n');
|
||||
|
||||
const dateTests = [
|
||||
'vandaag',
|
||||
'morgen',
|
||||
'overmorgen',
|
||||
'maandag',
|
||||
'dinsdag',
|
||||
'deze week',
|
||||
'volgende week',
|
||||
'30 december',
|
||||
'2024-12-28',
|
||||
'28-12-2024',
|
||||
];
|
||||
|
||||
dateTests.forEach((input) => {
|
||||
const result = parseRelativeDate(input);
|
||||
if (result === null) {
|
||||
console.log(` ❌ "${input}" → null`);
|
||||
} else if (isDateRange(result)) {
|
||||
console.log(` ✅ "${input}" → Range: ${format(result.start, 'dd MMM', { locale: nl })} - ${format(result.end, 'dd MMM', { locale: nl })}`);
|
||||
} else {
|
||||
console.log(` ✅ "${input}" → ${format(result, 'EEEE dd MMMM yyyy', { locale: nl })}`);
|
||||
}
|
||||
});
|
||||
|
||||
// Test parseTime
|
||||
console.log('\n⏰ Testing parseTime():\n');
|
||||
|
||||
const timeTests = [
|
||||
'14:00',
|
||||
'14',
|
||||
'twee uur',
|
||||
'half drie',
|
||||
'kwart over twee',
|
||||
'kwart voor drie',
|
||||
'ochtend',
|
||||
'middag',
|
||||
'avond',
|
||||
];
|
||||
|
||||
timeTests.forEach((input) => {
|
||||
const result = parseTime(input);
|
||||
if (result === null) {
|
||||
console.log(` ❌ "${input}" → null`);
|
||||
} else {
|
||||
console.log(` ✅ "${input}" → ${result}`);
|
||||
}
|
||||
});
|
||||
|
||||
// Test combineDatetime
|
||||
console.log('\n🔗 Testing combineDatetime():\n');
|
||||
|
||||
const morgen = parseRelativeDate('morgen');
|
||||
if (morgen && !isDateRange(morgen)) {
|
||||
const combined = combineDatetime(morgen, '14:00');
|
||||
console.log(` ✅ morgen + 14:00 → ${combined}`);
|
||||
}
|
||||
|
||||
// Test isNotInPast
|
||||
console.log('\n✔️ Testing isNotInPast():\n');
|
||||
|
||||
const today = new Date();
|
||||
const tomorrow = parseRelativeDate('morgen');
|
||||
const yesterday = parseRelativeDate('gisteren');
|
||||
|
||||
console.log(` Today: ${isNotInPast(today)} (expected: true)`);
|
||||
if (tomorrow && !isDateRange(tomorrow)) {
|
||||
console.log(` Tomorrow: ${isNotInPast(tomorrow)} (expected: true)`);
|
||||
}
|
||||
if (yesterday && !isDateRange(yesterday)) {
|
||||
console.log(` Yesterday: ${isNotInPast(yesterday)} (expected: false)`);
|
||||
}
|
||||
|
||||
console.log('\n✅ Verification complete!');
|
||||
Reference in New Issue
Block a user