65 lines
1.9 KiB
Dart
65 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,
|
||
|
|
);
|
||
|
|
});
|
||
|
|
}
|