feat(exécution): clarifie Durée et Temps réalisé, renomme Durée par défaut (s)

Sépare la notion de Durée (paramètre configuré) de Temps réalisé (résultat
mesuré au chronomètre), renomme le champ « Temps par défaut (s) » en
« Durée par défaut (s) » dans la bibliothèque d'exercices, et limite
l'exécution à un seul chrono visible à la fois. Le mode Score chrono est
conservé tel quel comme mode du score.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-28 09:37:44 +02:00
parent 6d86700348
commit e3c7ca0dab
11 changed files with 316 additions and 56 deletions

View File

@ -1532,6 +1532,53 @@ void main() {
},
);
test(
'active set result persists duration and stopwatch score separately',
() async {
final now = DateTime.utc(2026, 7, 17, 12);
await activeRepository.save(
ActiveWorkoutSession(
metadata: _metadata('session-chrono', now),
status: ActiveWorkoutStatus.running,
startedAt: now,
lastPersistedAt: now,
elapsedActiveMs: 0,
currentProgramIndex: 0,
currentExerciseIndex: 0,
currentSetIndex: 0,
resolvedTemplateSnapshotJson: _resolvedSnapshot(),
),
);
await activeRepository.saveSetResult(
ActiveSetResult(
metadata: _metadata('active-result-chrono', now),
activeWorkoutSessionId: 'session-chrono',
programSnapshotId: 'program-snapshot-1',
exerciseSnapshotId: 'exercise-snapshot-1',
programIndex: 0,
exerciseIndex: 0,
setIndex: 0,
actualTimeMs: 30000,
actualScoreTimeMs: 12000,
scoreInputModeSnapshot: ScoreInputMode.stopwatch,
completedAt: now,
),
);
final afterAppKillRepository = local.DriftActiveSessionRepository(
database,
);
final restored = await afterAppKillRepository.listSetResults(
'session-chrono',
);
expect(restored, hasLength(1));
expect(restored.single.actualTimeMs, 30000);
expect(restored.single.actualScoreTimeMs, 12000);
expect(restored.single.scoreInputModeSnapshot, ScoreInputMode.stopwatch);
},
);
test(
'closing a session stores autonomous history rows with set snapshots',
() async {