Files
CookIT/test/planning/week_fill_test.dart
2026-10-28 22:55:09 +01:00

66 lines
1.9 KiB
Dart

import 'dart:math';
import 'package:cookit/src/planning/week_fill.dart';
import 'package:flutter_test/flutter_test.dart';
import '../support/fixtures.dart';
void main() {
final days = [for (var d = 19; d <= 25; d++) DateTime.utc(2026, 10, d)];
final recipes = [for (var i = 0; i < 5; i++) recipe(id: 'r$i', name: 'R$i')];
test('fills each empty day with a different Recipe, never one already in the week', () {
final filled = fillWeek(
emptyDays: days.take(3).toList(),
candidates: recipes,
inWeek: {'r0'},
recent: const {},
random: Random(1),
);
expect(filled.keys, days.take(3));
final ids = filled.values.map((r) => r.id).toList();
expect(ids.toSet(), hasLength(3));
expect(ids, isNot(contains('r0')));
});
test('recently planned Recipes come only after the others', () {
for (var seed = 0; seed < 20; seed++) {
final filled = fillWeek(
emptyDays: days.take(4).toList(),
candidates: recipes,
inWeek: const {},
recent: {'r0', 'r1'},
random: Random(seed),
);
final ids = filled.values.map((r) => r.id).toList();
expect(ids.take(3).toSet(), {'r2', 'r3', 'r4'});
expect(ids.last, anyOf('r0', 'r1'));
}
});
test('days stay empty when the Recipes run out', () {
final filled = fillWeek(
emptyDays: days,
candidates: recipes.take(2).toList(),
inWeek: const {},
recent: const {},
random: Random(2),
);
expect(filled, hasLength(2));
});
test('pickReplacement skips the week and returns null when nothing is left', () {
final pick = pickReplacement(
candidates: recipes,
inWeek: {'r0', 'r1', 'r2', 'r3'},
recent: const {},
random: Random(),
);
expect(pick?.id, 'r4');
expect(
pickReplacement(candidates: recipes, inWeek: {for (final r in recipes) r.id}, recent: const {}, random: Random()),
isNull,
);
});
}