fix: seed partial overlap timeline tasks

This commit is contained in:
Ashley Venn 2026-06-30 14:17:49 -07:00
parent 4f19860054
commit acee1da264
2 changed files with 84 additions and 1 deletions

View file

@ -229,6 +229,48 @@ class DemoSchedulerComposition {
completedAt: _instant(date, 16, 20),
createdAt: createdAt,
),
_task(
id: 'sort-mail',
title: 'Sort mail',
type: TaskType.flexible,
status: TaskStatus.planned,
date: date,
startHour: 14,
startMinute: 40,
endHour: 15,
endMinute: 20,
reward: RewardLevel.low,
difficulty: DifficultyLevel.easy,
createdAt: createdAt,
),
_task(
id: 'start-laundry',
title: 'Start laundry',
type: TaskType.flexible,
status: TaskStatus.planned,
date: date,
startHour: 15,
startMinute: 0,
endHour: 15,
endMinute: 40,
reward: RewardLevel.medium,
difficulty: DifficultyLevel.medium,
createdAt: createdAt,
),
_task(
id: 'water-plants',
title: 'Water plants',
type: TaskType.flexible,
status: TaskStatus.planned,
date: date,
startHour: 15,
startMinute: 20,
endHour: 16,
endMinute: 0,
reward: RewardLevel.medium,
difficulty: DifficultyLevel.medium,
createdAt: createdAt,
),
_task(
id: 'pay-bill',
title: 'Pay bill',

View file

@ -44,6 +44,9 @@ void main() {
);
expect(find.text('Clean coffee maker'), findsOneWidget);
expect(find.text('Cleaned kitchen counter'), findsNWidgets(2));
expect(find.text('Sort mail'), findsOneWidget);
expect(find.text('Start laundry'), findsOneWidget);
expect(find.text('Water plants'), findsOneWidget);
expect(find.text('Pay bill'), findsOneWidget);
expect(find.text('Doctor appointment'), findsOneWidget);
expect(find.text('Free Slot'), findsOneWidget);
@ -57,6 +60,9 @@ void main() {
final data = TodayScreenData.fromTodayState(state);
expect(_kindFor(data, 'clean-coffee-maker'), TaskVisualKind.flexible);
expect(_kindFor(data, 'sort-mail'), TaskVisualKind.flexible);
expect(_kindFor(data, 'start-laundry'), TaskVisualKind.flexible);
expect(_kindFor(data, 'water-plants'), TaskVisualKind.flexible);
expect(_kindFor(data, 'pay-bill'), TaskVisualKind.required);
expect(_kindFor(data, 'doctor-appointment'), TaskVisualKind.appointment);
expect(_kindFor(data, 'free-slot'), TaskVisualKind.freeSlot);
@ -159,7 +165,7 @@ void main() {
},
);
testWidgets('timeline reuses empty overlap lanes for chained tasks', (
testWidgets('timeline splits partial overlaps and reuses empty lanes', (
tester,
) async {
await _pumpConstrainedWidget(
@ -210,6 +216,41 @@ void main() {
expect(leftReused.right, lessThan(rightMiddle.left));
});
testWidgets('seeded demo partial overlaps pack into two lanes', (
tester,
) async {
final state = await _readSeededToday();
final data = TodayScreenData.fromTodayState(state);
await _pumpConstrainedWidget(
tester,
size: const Size(900, 620),
child: TimelineView(
cards: data.cards,
range: data.timelineRange,
now: () => DateTime(2025, 5, 20, 15, 20),
onCardSelected: (_) {},
),
);
expect(tester.takeException(), isNull);
final sortMail = tester.getRect(find.byKey(const ValueKey('sort-mail')));
final startLaundry = tester.getRect(
find.byKey(const ValueKey('start-laundry')),
);
final waterPlants = tester.getRect(
find.byKey(const ValueKey('water-plants')),
);
expect(startLaundry.left, greaterThan(sortMail.left));
expect(waterPlants.left, closeTo(sortMail.left, 1));
expect(sortMail.width, closeTo(startLaundry.width, 1));
expect(waterPlants.width, closeTo(sortMail.width, 1));
expect(sortMail.right, lessThan(startLaundry.left));
expect(waterPlants.right, lessThan(startLaundry.left));
});
testWidgets('top bar controls scale inside a compact header width', (
tester,
) async {