Files
triqura-ecd/lib/swift/verify-parser.ts
colinislit 0031bd5fd1 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)
2025-12-27 22:14:22 +01:00

94 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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!');