diff --git a/lib/helpers/misc.dart b/lib/helpers/misc.dart index eb9bcf28..4ed41077 100644 --- a/lib/helpers/misc.dart +++ b/lib/helpers/misc.dart @@ -24,33 +24,35 @@ import 'package:wger/models/workouts/weight_unit.dart'; /// Returns the text representation for a single setting, used in the gym mode String repText( - num? reps, - RepetitionUnit repetitionUnitObj, + num? repetitions, + RepetitionUnit? repetitionUnitObj, num? weight, - WeightUnit weightUnitObj, + WeightUnit? weightUnitObj, String? rir, ) { // TODO(x): how to (easily?) translate strings like the units or 'RiR' final List out = []; - if (reps != null) { - out.add(formatNum(reps).toString()); + if (repetitions != null) { + out.add(formatNum(repetitions).toString()); // The default repetition unit is 'reps', which we don't show unless there // is no weight defined so that we don't just output something like "8" but // rather "8 repetitions". If there is weight we want to output "8 x 50kg", // since the repetitions are implied. If other units are used, we always // print them - if (repetitionUnitObj.id != REP_UNIT_REPETITIONS_ID || weight == 0 || weight == null) { - out.add(repetitionUnitObj.name); + if (repetitionUnitObj != null && repetitionUnitObj.id != REP_UNIT_REPETITIONS_ID || + weight == 0 || + weight == null) { + out.add(repetitionUnitObj!.name); } } if (weight != null && weight != 0) { out.add('×'); out.add(formatNum(weight).toString()); - out.add(weightUnitObj.name); + out.add(weightUnitObj!.name); } if (rir != null && rir != '') { diff --git a/lib/models/exercises/exercise_api.dart b/lib/models/exercises/exercise_api.dart index f920e42d..f15d2785 100644 --- a/lib/models/exercises/exercise_api.dart +++ b/lib/models/exercises/exercise_api.dart @@ -11,7 +11,7 @@ import 'package:wger/models/exercises/video.dart'; part 'exercise_api.freezed.dart'; part 'exercise_api.g.dart'; -/// Model for an exercise as returned from the exercisebaseinfo endpoint +/// Model for an exercise as returned from the exerciseinfo endpoint /// /// Basically this is just used as a convenience to create "real" exercise /// objects and nothing more diff --git a/lib/models/workouts/base_config.dart b/lib/models/workouts/base_config.dart index 7807b443..3f78f740 100644 --- a/lib/models/workouts/base_config.dart +++ b/lib/models/workouts/base_config.dart @@ -44,9 +44,6 @@ class BaseConfig { @JsonKey(required: true) late String step; - @JsonKey(required: true, name: 'need_log_to_apply') - late bool needLogToApply; - @JsonKey(required: true, name: 'repeat') late bool repeat; @@ -61,7 +58,6 @@ class BaseConfig { required this.value, this.operation = 'r', this.step = 'abs', - this.needLogToApply = false, this.requirements = null, }); @@ -69,7 +65,6 @@ class BaseConfig { iteration = 1; operation = 'r'; step = 'abs'; - needLogToApply = false; requirements = null; repeat = false; } diff --git a/lib/models/workouts/base_config.g.dart b/lib/models/workouts/base_config.g.dart index a13e315d..564efef3 100644 --- a/lib/models/workouts/base_config.g.dart +++ b/lib/models/workouts/base_config.g.dart @@ -16,7 +16,6 @@ BaseConfig _$BaseConfigFromJson(Map json) { 'value', 'operation', 'step', - 'need_log_to_apply', 'repeat', 'requirements' ], @@ -29,7 +28,6 @@ BaseConfig _$BaseConfigFromJson(Map json) { value: stringOrIntToNum(json['value']), operation: json['operation'] as String? ?? 'r', step: json['step'] as String? ?? 'abs', - needLogToApply: json['need_log_to_apply'] as bool? ?? false, requirements: json['requirements'] ?? null, ); } @@ -40,7 +38,6 @@ Map _$BaseConfigToJson(BaseConfig instance) => dayDataGym = []; - @JsonKey(includeFromJson: false, includeToJson: false) - List dayDataCurrentIteration = []; - - @JsonKey(includeFromJson: false, includeToJson: false) - List dayDataCurrentIterationGym = []; - @JsonKey(required: false, includeToJson: false, defaultValue: []) List sessions = []; @@ -89,8 +84,6 @@ class Routine { this.days = const [], this.dayData = const [], this.dayDataGym = const [], - this.dayDataCurrentIteration = const [], - this.dayDataCurrentIterationGym = const [], this.sessions = const [], }) { this.created = created ?? DateTime.now(); @@ -121,6 +114,29 @@ class Routine { return out; } + int? getIteration({DateTime? date}) { + if (date == null) { + return null; + } + + for (final data in dayData) { + if (data.date.isSameDayAs(date)) { + return data.iteration; + } + } + return null; + } + + List get dayDataCurrentIteration { + final iteration = getIteration() ?? 1; + return dayData.where((data) => data.iteration == iteration).toList(); + } + + List get dayDataCurrentIterationGym { + final iteration = getIteration() ?? 1; + return dayDataGym.where((data) => data.iteration == iteration).toList(); + } + /// Filters the workout logs by exercise and sorts them by date /// /// Optionally, filters list so that only unique logs are returned. "Unique" diff --git a/lib/models/workouts/set_config_data.dart b/lib/models/workouts/set_config_data.dart index 70c315fc..82771913 100644 --- a/lib/models/workouts/set_config_data.dart +++ b/lib/models/workouts/set_config_data.dart @@ -58,24 +58,24 @@ class SetConfigData { late int? weightUnitId; @JsonKey(includeToJson: false, includeFromJson: false) - late WeightUnit weightUnit; + late WeightUnit? weightUnit; @JsonKey(required: true, name: 'weight_rounding', fromJson: stringToNumNull) late num? weightRounding; - @JsonKey(required: true, fromJson: stringToNumNull, name: 'reps') + @JsonKey(required: true, fromJson: stringToNumNull, name: 'repetitions') late num? repetitions; - @JsonKey(required: true, name: 'max_reps', fromJson: stringToNumNull) + @JsonKey(required: true, name: 'max_repetitions', fromJson: stringToNumNull) late num? maxRepetitions; - @JsonKey(required: true, name: 'reps_unit') + @JsonKey(required: true, name: 'repetitions_unit') late int? repetitionsUnitId; @JsonKey(includeToJson: false, includeFromJson: false) - late RepetitionUnit repetitionsUnit; + late RepetitionUnit? repetitionsUnit; - @JsonKey(required: true, name: 'reps_rounding', fromJson: stringToNumNull) + @JsonKey(required: true, name: 'repetitions_rounding', fromJson: stringToNumNull) late num? repetitionsRounding; @JsonKey(required: true) @@ -119,7 +119,7 @@ class SetConfigData { this.textRepr = '', Exercise? exercise, WeightUnit? weightUnit, - RepetitionUnit? repsUnit, + RepetitionUnit? repetitionsUnit, }) { if (exercise != null) { this.exercise = exercise; @@ -127,8 +127,8 @@ class SetConfigData { if (weightUnit != null) { this.weightUnit = weightUnit; } - if (repsUnit != null) { - this.repetitionsUnit = repsUnit; + if (repetitionsUnit != null) { + this.repetitionsUnit = repetitionsUnit; } } diff --git a/lib/models/workouts/set_config_data.g.dart b/lib/models/workouts/set_config_data.g.dart index b0850730..dfc76fa5 100644 --- a/lib/models/workouts/set_config_data.g.dart +++ b/lib/models/workouts/set_config_data.g.dart @@ -20,10 +20,10 @@ SetConfigData _$SetConfigDataFromJson(Map json) { 'max_weight', 'weight_unit', 'weight_rounding', - 'reps', - 'max_reps', - 'reps_unit', - 'reps_rounding', + 'repetitions', + 'max_repetitions', + 'repetitions_unit', + 'repetitions_rounding', 'rir', 'max_rir', 'rpe', @@ -44,11 +44,12 @@ SetConfigData _$SetConfigDataFromJson(Map json) { weightRounding: json['weight_rounding'] == null ? 1.25 : stringToNumNull(json['weight_rounding'] as String?), - repetitions: stringToNumNull(json['reps'] as String?), - maxRepetitions: stringToNumNull(json['max_reps'] as String?), - repetitionsUnitId: (json['reps_unit'] as num?)?.toInt() ?? REP_UNIT_REPETITIONS_ID, - repetitionsRounding: - json['reps_rounding'] == null ? 1 : stringToNumNull(json['reps_rounding'] as String?), + repetitions: stringToNumNull(json['repetitions'] as String?), + maxRepetitions: stringToNumNull(json['max_repetitions'] as String?), + repetitionsUnitId: (json['repetitions_unit'] as num?)?.toInt() ?? REP_UNIT_REPETITIONS_ID, + repetitionsRounding: json['repetitions_rounding'] == null + ? 1 + : stringToNumNull(json['repetitions_rounding'] as String?), rir: json['rir'] as String?, maxRir: json['max_rir'] as String?, rpe: json['rpe'] as String?, @@ -70,10 +71,10 @@ Map _$SetConfigDataToJson(SetConfigData instance) => repsConfigs = []; + @JsonKey(required: false, name: 'repetitions_configs', includeToJson: false, defaultValue: []) + late List repetitionsConfigs = []; - @JsonKey(required: false, name: 'max_reps_configs', includeToJson: false, defaultValue: []) - late List maxRepsConfigs = []; + @JsonKey(required: false, name: 'max_repetitions_configs', includeToJson: false, defaultValue: []) + late List maxRepetitionsConfigs = []; @JsonKey(required: true, name: 'weight_unit') - late int weightUnitId; + late int? weightUnitId; @JsonKey(includeFromJson: false, includeToJson: false) - late WeightUnit weightUnitObj; + late WeightUnit? weightUnitObj; @JsonKey(required: true, name: 'weight_rounding', fromJson: stringToNum) late num weightRounding; @@ -137,8 +137,8 @@ class SlotEntry { this.maxRirConfigs = const [], this.restTimeConfigs = const [], this.maxRestTimeConfigs = const [], - this.repsConfigs = const [], - this.maxRepsConfigs = const [], + this.repetitionsConfigs = const [], + this.maxRepetitionsConfigs = const [], RepetitionUnit? repetitionUnit, WeightUnit? weightUnit, Exercise? exercise, @@ -186,8 +186,8 @@ class SlotEntry { bool get hasProgressionRules { return weightConfigs.length > 1 || - repsConfigs.length > 1 || - maxRepsConfigs.length > 1 || + repetitionsConfigs.length > 1 || + maxRepetitionsConfigs.length > 1 || nrOfSetsConfigs.length > 1 || maxNrOfSetsConfigs.length > 1 || rirConfigs.length > 1 || @@ -208,10 +208,10 @@ class SlotEntry { return nrOfSetsConfigs; case ConfigType.maxSets: return maxNrOfSetsConfigs; - case ConfigType.reps: - return repsConfigs; - case ConfigType.maxReps: - return maxRepsConfigs; + case ConfigType.repetitions: + return repetitionsConfigs; + case ConfigType.maxRepetitions: + return maxRepetitionsConfigs; case ConfigType.rir: return rirConfigs; case ConfigType.maxRir: diff --git a/lib/models/workouts/slot_entry.g.dart b/lib/models/workouts/slot_entry.g.dart index 2d2a99b3..a37de964 100644 --- a/lib/models/workouts/slot_entry.g.dart +++ b/lib/models/workouts/slot_entry.g.dart @@ -29,9 +29,9 @@ SlotEntry _$SlotEntryFromJson(Map json) { order: (json['order'] as num).toInt(), type: json['type'] as String, exerciseId: (json['exercise'] as num).toInt(), - repetitionUnitId: (json['repetition_unit'] as num).toInt(), + repetitionUnitId: (json['repetition_unit'] as num?)?.toInt(), repetitionRounding: stringToNum(json['repetition_rounding'] as String?), - weightUnitId: (json['weight_unit'] as num).toInt(), + weightUnitId: (json['weight_unit'] as num?)?.toInt(), weightRounding: stringToNum(json['weight_rounding'] as String?), comment: json['comment'] as String, weightConfigs: (json['weight_configs'] as List?) @@ -66,11 +66,11 @@ SlotEntry _$SlotEntryFromJson(Map json) { ?.map((e) => BaseConfig.fromJson(e as Map)) .toList() ?? [], - repsConfigs: (json['reps_configs'] as List?) + repetitionsConfigs: (json['repetitions_configs'] as List?) ?.map((e) => BaseConfig.fromJson(e as Map)) .toList() ?? [], - maxRepsConfigs: (json['max_reps_configs'] as List?) + maxRepetitionsConfigs: (json['max_repetitions_configs'] as List?) ?.map((e) => BaseConfig.fromJson(e as Map)) .toList() ?? [], diff --git a/lib/providers/add_exercise.dart b/lib/providers/add_exercise.dart index 43da6282..2dee7912 100644 --- a/lib/providers/add_exercise.dart +++ b/lib/providers/add_exercise.dart @@ -37,7 +37,7 @@ class AddExerciseProvider with ChangeNotifier { List _primaryMuscles = []; List _secondaryMuscles = []; - static const _exerciseUrlPath = 'exercise-base'; + static const _exerciseUrlPath = 'exercise'; static const _imagesUrlPath = 'exerciseimage'; static const _exerciseTranslationUrlPath = 'exercise-translation'; static const _exerciseAliasPath = 'exercisealias'; diff --git a/lib/providers/exercises.dart b/lib/providers/exercises.dart index 1441c84b..1edc0612 100644 --- a/lib/providers/exercises.dart +++ b/lib/providers/exercises.dart @@ -48,7 +48,7 @@ class ExercisesProvider with ChangeNotifier { static const EXERCISE_CACHE_DAYS = 7; static const CACHE_VERSION = 4; - static const exerciseInfoUrlPath = 'exercisebaseinfo'; + static const exerciseInfoUrlPath = 'exerciseinfo'; static const exerciseSearchPath = 'exercise/search'; static const categoriesUrlPath = 'exercisecategory'; diff --git a/lib/providers/routines.dart b/lib/providers/routines.dart index c6740e03..8fb062b4 100644 --- a/lib/providers/routines.dart +++ b/lib/providers/routines.dart @@ -45,8 +45,6 @@ class RoutinesProvider with ChangeNotifier { static const _routinesLogsSubpath = 'logs'; static const _routinesDateSequenceDisplaySubpath = 'date-sequence-display'; static const _routinesDateSequenceGymSubpath = 'date-sequence-gym'; - static const _routinesCurrentIterationDisplaySubpath = 'current-iteration-display'; - static const _routinesCurrentIterationGymSubpath = 'current-iteration-gym'; static const _daysUrlPath = 'day'; static const _slotsUrlPath = 'slot'; static const _slotEntriesUrlPath = 'slot-entry'; @@ -58,15 +56,15 @@ class RoutinesProvider with ChangeNotifier { static const _routineConfigMaxSets = 'max-sets-config'; static const _routineConfigWeights = 'weight-config'; static const _routineConfigMaxWeights = 'max-weight-config'; - static const _routineConfigReps = 'reps-config'; - static const _routineConfigMaxReps = 'max-reps-config'; + static const _routineConfigRepetitions = 'repetitions-config'; + static const _routineConfigMaxRepetitions = 'max-repetitions-config'; static const _routineConfigRir = 'rir-config'; static const _routineConfigMaxRir = 'rest-config'; static const _routineConfigRestTime = 'rest-config'; static const _routineConfigMaxRestTime = 'max-rest-config'; Routine? _currentRoutine; - late ExercisesProvider _exercises; + late ExercisesProvider _exerciseProvider; final WgerBaseProvider baseProvider; List _routines = []; List _weightUnits = []; @@ -79,7 +77,7 @@ class RoutinesProvider with ChangeNotifier { List? weightUnits, List? repetitionUnits, }) { - _exercises = exercises; + _exerciseProvider = exercises; _routines = entries; _weightUnits = weightUnits ?? []; _repetitionUnits = repetitionUnits ?? []; @@ -93,6 +91,10 @@ class RoutinesProvider with ChangeNotifier { return [..._weightUnits]; } + set weightUnits(List weightUnits) { + _weightUnits = weightUnits; + } + /// Clears all lists void clear() { _currentRoutine = null; @@ -112,6 +114,10 @@ class RoutinesProvider with ChangeNotifier { return [..._repetitionUnits]; } + set repetitionUnits(List repetitionUnits) { + _repetitionUnits = repetitionUnits; + } + RepetitionUnit findRepetitionUnitById(int id) => _repetitionUnits.firstWhere((element) => element.id == id); @@ -196,7 +202,7 @@ class RoutinesProvider with ChangeNotifier { for (final entry in entries) { for (final slot in entry.slots) { for (final setConfig in slot.setConfigs) { - setConfig.exercise = (await _exercises.fetchAndSetExercise(setConfig.exerciseId))!; + setConfig.exercise = (await _exerciseProvider.fetchAndSetExercise(setConfig.exerciseId))!; setConfig.repetitionsUnit = _repetitionUnits.firstWhere( (e) => e.id == setConfig.repetitionsUnitId, @@ -249,20 +255,6 @@ class RoutinesProvider with ChangeNotifier { objectMethod: _routinesDateSequenceGymSubpath, ), ), - baseProvider.fetch( - baseProvider.makeUrl( - _routinesUrlPath, - id: routineId, - objectMethod: _routinesCurrentIterationDisplaySubpath, - ), - ), - baseProvider.fetch( - baseProvider.makeUrl( - _routinesUrlPath, - id: routineId, - objectMethod: _routinesCurrentIterationGymSubpath, - ), - ), baseProvider.fetch( baseProvider.makeUrl( _routinesUrlPath, @@ -276,9 +268,7 @@ class RoutinesProvider with ChangeNotifier { final dayData = results[1] as List; final dayDataGym = results[2] as List; - final currentIterationDayData = results[3] as List; - final currentIterationDayDataGym = results[4] as List; - final sessionData = results[5] as List; + final sessionData = results[3] as List; /* * Set exercise, repetition and weight unit objects @@ -291,21 +281,14 @@ class RoutinesProvider with ChangeNotifier { final dayDataEntriesGym = dayDataGym.map((entry) => DayData.fromJson(entry)).toList(); setExercisesAndUnits(dayDataEntriesGym); - final currentIteration = - currentIterationDayData.map((entry) => DayData.fromJson(entry)).toList(); - setExercisesAndUnits(currentIteration); - - final currentIterationGym = - currentIterationDayDataGym.map((entry) => DayData.fromJson(entry)).toList(); - setExercisesAndUnits(currentIterationGym); - final sessionDataEntries = sessionData.map((entry) => WorkoutSessionApi.fromJson(entry)).toList(); for (final day in routine.days) { for (final slot in day.slots) { for (final slotEntry in slot.entries) { - slotEntry.exerciseObj = (await _exercises.fetchAndSetExercise(slotEntry.exerciseId))!; + slotEntry.exerciseObj = + (await _exerciseProvider.fetchAndSetExercise(slotEntry.exerciseId))!; slotEntry.repetitionUnitObj = _repetitionUnits.firstWhere( (e) => e.id == slotEntry.repetitionUnitId, ); @@ -318,8 +301,6 @@ class RoutinesProvider with ChangeNotifier { routine.dayData = dayDataEntriesDisplay; routine.dayDataGym = dayDataEntriesGym; - routine.dayDataCurrentIteration = currentIteration; - routine.dayDataCurrentIterationGym = currentIterationGym; // Logs routine.sessions = List.from(sessionDataEntries); @@ -327,7 +308,7 @@ class RoutinesProvider with ChangeNotifier { for (final log in session.logs) { log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); log.repetitionUnit = _repetitionUnits.firstWhere((e) => e.id == log.repetitionsUnitId); - log.exerciseBase = (await _exercises.fetchAndSetExercise(log.exerciseId))!; + log.exerciseBase = (await _exerciseProvider.fetchAndSetExercise(log.exerciseId))!; } } @@ -535,7 +516,7 @@ class RoutinesProvider with ChangeNotifier { baseProvider.makeUrl(_slotEntriesUrlPath), ); final newEntry = SlotEntry.fromJson(data); - newEntry.exerciseObj = (await _exercises.fetchAndSetExercise(newEntry.exerciseId))!; + newEntry.exerciseObj = (await _exerciseProvider.fetchAndSetExercise(newEntry.exerciseId))!; for (final routine in _routines) { for (final day in routine.days) { @@ -584,10 +565,10 @@ class RoutinesProvider with ChangeNotifier { return _routineConfigWeights; case ConfigType.maxWeight: return _routineConfigMaxWeights; - case ConfigType.reps: - return _routineConfigReps; - case ConfigType.maxReps: - return _routineConfigMaxReps; + case ConfigType.repetitions: + return _routineConfigRepetitions; + case ConfigType.maxRepetitions: + return _routineConfigMaxRepetitions; case ConfigType.rir: return _routineConfigRir; case ConfigType.maxRir: @@ -696,7 +677,7 @@ class RoutinesProvider with ChangeNotifier { newLog.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); newLog.repetitionUnit = _repetitionUnits.firstWhere((e) => e.id == log.weightUnitId); - newLog.exerciseBase = (await _exercises.fetchAndSetExercise(log.exerciseId))!; + newLog.exerciseBase = (await _exerciseProvider.fetchAndSetExercise(log.exerciseId))!; final plan = findById(newLog.routineId); final session = plan.sessions.firstWhere((element) => element.session.id == newLog.sessionId); diff --git a/lib/screens/routine_edit_screen.dart b/lib/screens/routine_edit_screen.dart index b6c995e4..29f52622 100644 --- a/lib/screens/routine_edit_screen.dart +++ b/lib/screens/routine_edit_screen.dart @@ -19,7 +19,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:wger/providers/routines.dart'; -import 'package:wger/widgets/routines/app_bar.dart'; +import 'package:wger/widgets/core/app_bar.dart'; import 'package:wger/widgets/routines/routine_edit.dart'; class RoutineEditScreen extends StatelessWidget { @@ -34,7 +34,7 @@ class RoutineEditScreen extends StatelessWidget { final routine = Provider.of(context).findById(routineId); return Scaffold( - appBar: RoutineDetailAppBar(routine), + appBar: EmptyAppBar(routine.name), body: RoutineEdit(routine), ); } diff --git a/lib/widgets/routines/forms/day.dart b/lib/widgets/routines/forms/day.dart index 07566696..46fac94d 100644 --- a/lib/widgets/routines/forms/day.dart +++ b/lib/widgets/routines/forms/day.dart @@ -132,7 +132,7 @@ class _ReorderableDaysListState extends State { ), onTap: () async { final day = Day.empty(); - day.name = i18n.newDay; + day.name = '${i18n.newDay} ${widget.days.length + 1}'; day.routineId = widget.routineId; final newDay = await provider.addDay(day); diff --git a/lib/widgets/routines/forms/reps.dart b/lib/widgets/routines/forms/reps.dart index bfaab4c0..1c5d3768 100644 --- a/lib/widgets/routines/forms/reps.dart +++ b/lib/widgets/routines/forms/reps.dart @@ -20,12 +20,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:wger/models/workouts/slot_entry.dart'; -class RepsInputWidget extends StatelessWidget { - final _repsController = TextEditingController(); +class RepetitionsInputWidget extends StatelessWidget { + final _repetitionsController = TextEditingController(); final SlotEntry _setting; final bool _detailed; - RepsInputWidget(this._setting, this._detailed); + RepetitionsInputWidget(this._setting, this._detailed); @override Widget build(BuildContext context) { @@ -34,7 +34,7 @@ class RepsInputWidget extends StatelessWidget { labelText: _detailed ? AppLocalizations.of(context).repetitions : '', errorMaxLines: 2, ), - controller: _repsController, + controller: _repetitionsController, keyboardType: TextInputType.number, validator: (value) { try { diff --git a/lib/widgets/routines/forms/reps_unit.dart b/lib/widgets/routines/forms/reps_unit.dart index 40d8561d..5e981565 100644 --- a/lib/widgets/routines/forms/reps_unit.dart +++ b/lib/widgets/routines/forms/reps_unit.dart @@ -26,12 +26,11 @@ import 'package:wger/providers/routines.dart'; /// /// Can be used with a Setting or a Log object class RepetitionUnitInputWidget extends StatefulWidget { - final int _initialValue; - late int selectedRepetitionUnit; - final ValueChanged onChanged; + late int? selectedRepetitionUnit; + final ValueChanged onChanged; - RepetitionUnitInputWidget(this._initialValue, {required this.onChanged}) { - selectedRepetitionUnit = _initialValue; + RepetitionUnitInputWidget(initialValue, {required this.onChanged}) { + selectedRepetitionUnit = initialValue; } @override @@ -43,7 +42,9 @@ class _RepetitionUnitInputWidgetState extends State { Widget build(BuildContext context) { final unitProvider = context.read(); - RepetitionUnit selectedWeightUnit = unitProvider.findRepetitionUnitById(widget._initialValue); + RepetitionUnit? selectedWeightUnit = widget.selectedRepetitionUnit != null + ? unitProvider.findRepetitionUnitById(widget.selectedRepetitionUnit!) + : null; return DropdownButtonFormField( value: selectedWeightUnit, diff --git a/lib/widgets/routines/forms/slot.dart b/lib/widgets/routines/forms/slot.dart index a8a1d9aa..c1dd6365 100644 --- a/lib/widgets/routines/forms/slot.dart +++ b/lib/widgets/routines/forms/slot.dart @@ -78,8 +78,8 @@ class _SlotEntryFormState extends State { final weightController = TextEditingController(); final maxWeightController = TextEditingController(); - final repsController = TextEditingController(); - final maxRepsController = TextEditingController(); + final repetitionsController = TextEditingController(); + final maxRepetitionsController = TextEditingController(); final restController = TextEditingController(); final maxRestController = TextEditingController(); final rirController = TextEditingController(); @@ -102,11 +102,12 @@ class _SlotEntryFormState extends State { maxWeightController.text = widget.entry.maxWeightConfigs.first.value.toString(); } - if (widget.entry.repsConfigs.isNotEmpty) { - repsController.text = widget.entry.repsConfigs.first.value.round().toString(); + if (widget.entry.repetitionsConfigs.isNotEmpty) { + repetitionsController.text = widget.entry.repetitionsConfigs.first.value.round().toString(); } - if (widget.entry.maxRepsConfigs.isNotEmpty) { - maxRepsController.text = widget.entry.maxRepsConfigs.first.value.round().toString(); + if (widget.entry.maxRepetitionsConfigs.isNotEmpty) { + maxRepetitionsController.text = + widget.entry.maxRepetitionsConfigs.first.value.round().toString(); } if (widget.entry.restTimeConfigs.isNotEmpty) { @@ -126,8 +127,8 @@ class _SlotEntryFormState extends State { weightController.dispose(); maxWeightController.dispose(); - repsController.dispose(); - maxRepsController.dispose(); + repetitionsController.dispose(); + maxRepetitionsController.dispose(); restController.dispose(); maxRestController.dispose(); @@ -252,7 +253,7 @@ class _SlotEntryFormState extends State { children: [ Flexible( child: TextFormField( - controller: repsController, + controller: repetitionsController, keyboardType: TextInputType.number, decoration: InputDecoration(labelText: i18n.repetitions), validator: (value) { @@ -266,7 +267,7 @@ class _SlotEntryFormState extends State { if (!widget.simpleMode) Flexible( child: TextFormField( - controller: maxRepsController, + controller: maxRepetitionsController, keyboardType: TextInputType.number, decoration: InputDecoration(labelText: i18n.max), validator: (value) { @@ -348,13 +349,13 @@ class _SlotEntryFormState extends State { provider.handleConfig( widget.entry, - repsController.text, - ConfigType.reps, + repetitionsController.text, + ConfigType.repetitions, ); provider.handleConfig( widget.entry, - maxRepsController.text, - ConfigType.maxReps, + maxRepetitionsController.text, + ConfigType.maxRepetitions, ); provider.handleConfig( diff --git a/lib/widgets/routines/forms/weight_unit.dart b/lib/widgets/routines/forms/weight_unit.dart index 2e27a14a..13273d8d 100644 --- a/lib/widgets/routines/forms/weight_unit.dart +++ b/lib/widgets/routines/forms/weight_unit.dart @@ -26,12 +26,11 @@ import 'package:wger/providers/routines.dart'; /// /// Can be used with a Setting or a Log object class WeightUnitInputWidget extends StatefulWidget { - final int _initialValue; - late int selectedWeightUnit; - final ValueChanged onChanged; + late int? selectedWeightUnit; + final ValueChanged onChanged; - WeightUnitInputWidget(this._initialValue, {required this.onChanged}) { - selectedWeightUnit = _initialValue; + WeightUnitInputWidget(initialValue, {required this.onChanged}) { + selectedWeightUnit = initialValue; } @override @@ -43,7 +42,9 @@ class _WeightUnitInputWidgetState extends State { Widget build(BuildContext context) { final unitProvider = context.read(); - WeightUnit selectedWeightUnit = unitProvider.findWeightUnitById(widget._initialValue); + WeightUnit? selectedWeightUnit = widget.selectedWeightUnit != null + ? unitProvider.findWeightUnitById(widget.selectedWeightUnit!) + : null; return DropdownButtonFormField( value: selectedWeightUnit, diff --git a/lib/widgets/routines/gym_mode.dart b/lib/widgets/routines/gym_mode.dart index ddd8d391..6c841223 100644 --- a/lib/widgets/routines/gym_mode.dart +++ b/lib/widgets/routines/gym_mode.dart @@ -311,7 +311,7 @@ class LogPage extends StatefulWidget { class _LogPageState extends State { final _form = GlobalKey(); String rirValue = SlotEntry.DEFAULT_RIR; - final _repsController = TextEditingController(); + final _repetitionsController = TextEditingController(); final _weightController = TextEditingController(); var _detailed = false; bool _isSaving = false; @@ -325,7 +325,7 @@ class _LogPageState extends State { focusNode = FocusNode(); if (widget._configData.repetitions != null) { - _repsController.text = widget._configData.repetitions!.toString(); + _repetitionsController.text = widget._configData.repetitions!.toString(); } if (widget._configData.weight != null) { @@ -336,7 +336,7 @@ class _LogPageState extends State { @override void dispose() { focusNode.dispose(); - _repsController.dispose(); + _repetitionsController.dispose(); _weightController.dispose(); super.dispose(); } @@ -348,9 +348,9 @@ class _LogPageState extends State { icon: const Icon(Icons.remove, color: Colors.black), onPressed: () { try { - final int newValue = int.parse(_repsController.text) - 1; + final int newValue = int.parse(_repetitionsController.text) - 1; if (newValue > 0) { - _repsController.text = newValue.toString(); + _repetitionsController.text = newValue.toString(); } } on FormatException {} }, @@ -361,7 +361,7 @@ class _LogPageState extends State { labelText: AppLocalizations.of(context).repetitions, ), enabled: true, - controller: _repsController, + controller: _repetitionsController, keyboardType: TextInputType.number, focusNode: focusNode, onFieldSubmitted: (_) {}, @@ -383,8 +383,8 @@ class _LogPageState extends State { icon: const Icon(Icons.add, color: Colors.black), onPressed: () { try { - final int newValue = int.parse(_repsController.text) + 1; - _repsController.text = newValue.toString(); + final int newValue = int.parse(_repetitionsController.text) + 1; + _repetitionsController.text = newValue.toString(); } on FormatException {} }, ), @@ -585,7 +585,7 @@ class _LogPageState extends State { onTap: () { setState(() { // Text field - _repsController.text = log.repetitions.toString(); + _repetitionsController.text = log.repetitions.toString(); _weightController.text = log.weight.toString(); // Drop downs diff --git a/test/exercises/exercise_provider_db_test.dart b/test/exercises/exercise_provider_db_test.dart index 1c9435b3..11b384cc 100644 --- a/test/exercises/exercise_provider_db_test.dart +++ b/test/exercises/exercise_provider_db_test.dart @@ -22,7 +22,7 @@ void main() { late ExerciseDatabase database; const String categoryUrl = 'exercisecategory'; - const String exerciseBaseInfoUrl = 'exercisebaseinfo'; + const String exerciseInfoUrl = 'exerciseinfo'; const String muscleUrl = 'muscle'; const String equipmentUrl = 'equipment'; const String languageUrl = 'language'; @@ -36,13 +36,13 @@ void main() { final Uri tExerciseInfoUri = Uri( scheme: 'http', host: 'localhost', - path: 'api/v2/$exerciseBaseInfoUrl/', + path: 'api/v2/$exerciseInfoUrl/', ); final Uri tExerciseInfoDetailUri = Uri( scheme: 'http', host: 'localhost', - path: 'api/v2/$exerciseBaseInfoUrl/9/', + path: 'api/v2/$exerciseInfoUrl/9/', ); final Uri tMuscleEntriesUri = Uri( @@ -80,7 +80,7 @@ void main() { fixture('exercises/language_entries.json'), ); final Map tExerciseInfoMap = jsonDecode( - fixture('exercises/exercisebaseinfo_response.json'), + fixture('exercises/exerciseinfo_response.json'), ); setUp(() { @@ -118,12 +118,12 @@ void main() { ); // Mock base info response - when(mockBaseProvider.makeUrl(exerciseBaseInfoUrl)).thenReturn(tExerciseInfoUri); + when(mockBaseProvider.makeUrl(exerciseInfoUrl)).thenReturn(tExerciseInfoUri); when(mockBaseProvider.fetch(tExerciseInfoUri)).thenAnswer( (_) => Future.value(tExerciseInfoMap), ); - when(mockBaseProvider.makeUrl(exerciseBaseInfoUrl, id: 9)).thenReturn(tExerciseInfoDetailUri); + when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 9)).thenReturn(tExerciseInfoDetailUri); when(mockBaseProvider.fetch(tExerciseInfoDetailUri)).thenAnswer( (_) => Future.value(tExerciseInfoMap), ); diff --git a/test/exercises/exercise_provider_load_test.dart b/test/exercises/exercise_provider_load_test.dart index 9d9ad06a..d72ceaf6 100644 --- a/test/exercises/exercise_provider_load_test.dart +++ b/test/exercises/exercise_provider_load_test.dart @@ -18,22 +18,22 @@ void main() { late MockWgerBaseProvider mockBaseProvider; late ExercisesProvider provider; - const String exerciseBaseInfoUrl = 'exercisebaseinfo'; + const String exerciseInfoUrl = 'exerciseinfo'; - final Uri tExerciseBaseInfoUri = Uri( + final Uri tExerciseInfoUri = Uri( scheme: 'http', host: 'localhost', - path: 'api/v2/$exerciseBaseInfoUrl/9/', + path: 'api/v2/$exerciseInfoUrl/9/', ); - final Uri tExerciseBaseInfoUri2 = Uri( + final Uri tExerciseInfoUri2 = Uri( scheme: 'http', host: 'localhost', - path: 'api/v2/$exerciseBaseInfoUrl/1/', + path: 'api/v2/$exerciseInfoUrl/1/', ); final Map tExerciseInfoMap = jsonDecode( - fixture('exercises/exercisebaseinfo_response.json'), + fixture('exercises/exerciseinfo_response.json'), ); setUpAll(() async { @@ -54,12 +54,12 @@ void main() { provider.languages = [tLanguage1, tLanguage2, tLanguage3]; // Mock base info response - when(mockBaseProvider.makeUrl(exerciseBaseInfoUrl, id: 9)).thenReturn(tExerciseBaseInfoUri); - when(mockBaseProvider.makeUrl(exerciseBaseInfoUrl, id: 1)).thenReturn(tExerciseBaseInfoUri2); + when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 9)).thenReturn(tExerciseInfoUri); + when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 1)).thenReturn(tExerciseInfoUri2); - when(mockBaseProvider.fetch(tExerciseBaseInfoUri)) + when(mockBaseProvider.fetch(tExerciseInfoUri)) .thenAnswer((_) => Future.value(tExerciseInfoMap)); - when(mockBaseProvider.fetch(tExerciseBaseInfoUri2)) + when(mockBaseProvider.fetch(tExerciseInfoUri2)) .thenAnswer((_) => Future.value(tExerciseInfoMap)); }); @@ -69,7 +69,7 @@ void main() { final base = await provider.fetchAndSetExercise(1); // assert - verifyNever(provider.baseProvider.fetch(tExerciseBaseInfoUri2)); + verifyNever(provider.baseProvider.fetch(tExerciseInfoUri2)); expect(base?.id, 1); }); @@ -78,7 +78,7 @@ void main() { final base = await provider.fetchAndSetExercise(9); // assert - verify(provider.baseProvider.fetch(tExerciseBaseInfoUri)); + verify(provider.baseProvider.fetch(tExerciseInfoUri)); expect(base?.id, 9); }); diff --git a/test/exercises/exercise_provider_test.dart b/test/exercises/exercise_provider_test.dart index 5a24bf43..b970d115 100644 --- a/test/exercises/exercise_provider_test.dart +++ b/test/exercises/exercise_provider_test.dart @@ -23,7 +23,7 @@ void main() { late ExercisesProvider provider; const String categoryUrl = 'exercisecategory'; - const String exerciseBaseInfoUrl = 'exercisebaseinfo'; + const String exerciseInfoUrl = 'exerciseinfo'; const String muscleUrl = 'muscle'; const String equipmentUrl = 'equipment'; const String languageUrl = 'language'; @@ -38,7 +38,7 @@ void main() { final Uri tExerciseInfoUri = Uri( scheme: 'http', host: 'localhost', - path: 'api/v2/$exerciseBaseInfoUrl/1/', + path: 'api/v2/$exerciseInfoUrl/1/', ); final Uri tMuscleEntriesUri = Uri( @@ -80,8 +80,8 @@ void main() { final Map tLanguageMap = jsonDecode( fixture('exercises/language_entries.json'), ); - final Map tExerciseBaseInfoMap = jsonDecode( - fixture('exercises/exercisebaseinfo_response.json'), + final Map tExerciseInfoMap = jsonDecode( + fixture('exercises/exerciseinfo_response.json'), ); setUpAll(() { @@ -122,10 +122,10 @@ void main() { .thenAnswer((_) => Future.value(tLanguageMap['results'])); // Mock base info response - when(mockBaseProvider.makeUrl(exerciseBaseInfoUrl, id: 1)).thenReturn(tExerciseInfoUri); - when(mockBaseProvider.makeUrl(exerciseBaseInfoUrl, id: 2)).thenReturn(tExerciseInfoUri); + when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 1)).thenReturn(tExerciseInfoUri); + when(mockBaseProvider.makeUrl(exerciseInfoUrl, id: 2)).thenReturn(tExerciseInfoUri); when(mockBaseProvider.fetch(tExerciseInfoUri)) - .thenAnswer((_) => Future.value(tExerciseBaseInfoMap)); + .thenAnswer((_) => Future.value(tExerciseInfoMap)); }); group('findCategoryById()', () { diff --git a/test/exercises/model_exercise_test.dart b/test/exercises/model_exercise_test.dart index f5b9defc..176d0379 100644 --- a/test/exercises/model_exercise_test.dart +++ b/test/exercises/model_exercise_test.dart @@ -8,7 +8,7 @@ import '../fixtures/fixture_reader.dart'; void main() { final Map tExerciseInfoMap = jsonDecode( - fixture('exercises/exercisebaseinfo_response.json'), + fixture('exercises/exerciseinfo_response.json'), ); group('Model tests', () { diff --git a/test/fixtures/exercises/exercisebaseinfo_response.json b/test/fixtures/exercises/exerciseinfo_response.json similarity index 100% rename from test/fixtures/exercises/exercisebaseinfo_response.json rename to test/fixtures/exercises/exerciseinfo_response.json diff --git a/test/fixtures/routines/routine_date_sequence_display.json b/test/fixtures/routines/routine_date_sequence_display.json new file mode 100644 index 00000000..faf59fa8 --- /dev/null +++ b/test/fixtures/routines/routine_date_sequence_display.json @@ -0,0 +1,696 @@ +[ + { + "iteration": 1, + "date": "2025-01-05", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 4, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 1, + "date": "2025-01-06", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-07", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 4, + "max_sets": null, + "weight": "20.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 20-22 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 1, + "date": "2025-01-08", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-09", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-10", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-11", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-12", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-13", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 4, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 2, + "date": "2025-01-14", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-15", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 4, + "max_sets": null, + "weight": "21.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 21-22 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 2, + "date": "2025-01-16", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-17", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-18", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-19", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-20", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 4, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 3, + "date": "2025-01-21", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-22", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 4, + "max_sets": null, + "weight": "22.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 22 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 3, + "date": "2025-01-23", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-24", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-25", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-26", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-01-27", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 4, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 4, + "date": "2025-01-28", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-01-29", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 4, + "max_sets": null, + "weight": "23.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 23 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 4, + "date": "2025-01-30", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-01-31", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-02-01", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-02-02", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 5, + "date": "2025-02-03", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 4, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 5, + "date": "2025-02-04", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 5, + "date": "2025-02-05", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 4, + "max_sets": null, + "weight": "24.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "4 Sätze, 10 × 24 kg 120s rest", + "comment": "" + } + ] + } + ] + } +] \ No newline at end of file diff --git a/test/fixtures/routines/routine_date_sequence_gym.json b/test/fixtures/routines/routine_date_sequence_gym.json new file mode 100644 index 00000000..b1708632 --- /dev/null +++ b/test/fixtures/routines/routine_date_sequence_gym.json @@ -0,0 +1,1356 @@ +[ + { + "iteration": 1, + "date": "2025-01-05", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "yes, we really do legs today", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 1, + "date": "2025-01-06", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-07", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "20.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 20-22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "20.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 20-22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "20.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 20-22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "20.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 20-22 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 1, + "date": "2025-01-08", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-09", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-10", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-11", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 1, + "date": "2025-01-12", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-13", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 2, + "date": "2025-01-14", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-15", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "21.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 21-22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "21.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 21-22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "21.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 21-22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "21.00", + "max_weight": "22.00", + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 21-22 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 2, + "date": "2025-01-16", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-17", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-18", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 2, + "date": "2025-01-19", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-20", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 3, + "date": "2025-01-21", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-22", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "22.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "22.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "22.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 22 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "22.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 22 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 3, + "date": "2025-01-23", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-24", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-25", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 3, + "date": "2025-01-26", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-01-27", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 4, + "date": "2025-01-28", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-01-29", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "23.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 23 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "23.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 23 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "23.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 23 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "23.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 23 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 4, + "date": "2025-01-30", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-01-31", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-02-01", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 4, + "date": "2025-02-02", + "label": null, + "day": null, + "slots": [] + }, + { + "iteration": 5, + "date": "2025-02-03", + "label": null, + "day": { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 76 + ], + "sets": [ + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 2, + "exercise": 76, + "sets": 1, + "max_sets": null, + "weight": "80.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 80 kg 120s rest", + "comment": "" + } + ] + } + ] + }, + { + "iteration": 5, + "date": "2025-02-04", + "label": null, + "day": { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [] + }, + { + "iteration": 5, + "date": "2025-02-05", + "label": null, + "day": { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null + }, + "slots": [ + { + "comment": "", + "is_superset": false, + "exercises": [ + 92 + ], + "sets": [ + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "24.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 24 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "24.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 24 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "24.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 24 kg 120s rest", + "comment": "" + }, + { + "slot_entry_id": 3, + "exercise": 92, + "sets": 1, + "max_sets": null, + "weight": "24.00", + "max_weight": null, + "weight_unit": 1, + "weight_rounding": null, + "repetitions": "10.00", + "max_repetitions": null, + "repetitions_unit": 1, + "repetitions_rounding": null, + "rir": null, + "max_rir": null, + "rpe": null, + "rest": "120.00", + "max_rest": null, + "type": "normal", + "text_repr": "10 × 24 kg 120s rest", + "comment": "" + } + ] + } + ] + } +] \ No newline at end of file diff --git a/test/fixtures/routines/routine_logs.json b/test/fixtures/routines/routine_logs.json new file mode 100644 index 00000000..cca04829 --- /dev/null +++ b/test/fixtures/routines/routine_logs.json @@ -0,0 +1,284 @@ +[ + { + "session": { + "id": 5, + "routine": 2, + "day": null, + "date": "2025-01-06", + "notes": null, + "impression": "2", + "time_start": "20:28:49", + "time_end": "23:35:53" + }, + "logs": [ + { + "id": 4, + "date": "2025-01-06T00:00:00+01:00", + "session": 5, + "routine": 2, + "iteration": 1, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "11.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "78.00", + "weight_target": "80.00", + "rir": "4", + "rir_target": null, + "rest": 150, + "rest_target": 120 + }, + { + "id": 2, + "date": "2025-01-06T00:00:00+01:00", + "session": 5, + "routine": 2, + "iteration": 1, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "12.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "77.00", + "weight_target": "80.00", + "rir": "2", + "rir_target": null, + "rest": 159, + "rest_target": 120 + }, + { + "id": 1, + "date": "2025-01-06T00:00:00+01:00", + "session": 5, + "routine": 2, + "iteration": 1, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "12.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "78.00", + "weight_target": "80.00", + "rir": "2.5", + "rir_target": null, + "rest": 143, + "rest_target": 120 + }, + { + "id": 3, + "date": "2025-01-06T00:00:00+01:00", + "session": 5, + "routine": 2, + "iteration": 1, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "12.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "83.00", + "weight_target": "80.00", + "rir": "0.5", + "rir_target": null, + "rest": 160, + "rest_target": 120 + } + ] + }, + { + "session": { + "id": 6, + "routine": 2, + "day": null, + "date": "2025-01-08", + "notes": null, + "impression": "2", + "time_start": "12:55:54", + "time_end": "14:25:31" + }, + "logs": [ + { + "id": 7, + "date": "2025-01-08T00:00:00+01:00", + "session": 6, + "routine": 2, + "iteration": 1, + "slot_entry": 3, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "10.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "80.00", + "weight_target": "80.00", + "rir": "3", + "rir_target": null, + "rest": 131, + "rest_target": 120 + }, + { + "id": 8, + "date": "2025-01-08T00:00:00+01:00", + "session": 6, + "routine": 2, + "iteration": 1, + "slot_entry": 3, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "11.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "83.00", + "weight_target": "80.00", + "rir": "3", + "rir_target": null, + "rest": 128, + "rest_target": 120 + }, + { + "id": 5, + "date": "2025-01-08T00:00:00+01:00", + "session": 6, + "routine": 2, + "iteration": 1, + "slot_entry": 3, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "11.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "90.00", + "weight_target": "80.00", + "rir": "0.5", + "rir_target": null, + "rest": 121, + "rest_target": 120 + }, + { + "id": 6, + "date": "2025-01-08T00:00:00+01:00", + "session": 6, + "routine": 2, + "iteration": 1, + "slot_entry": 3, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "12.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "77.00", + "weight_target": "80.00", + "rir": "1.5", + "rir_target": null, + "rest": 129, + "rest_target": 120 + } + ] + }, + { + "session": { + "id": 7, + "routine": 2, + "day": null, + "date": "2025-01-13", + "notes": null, + "impression": "2", + "time_start": "18:48:45", + "time_end": "20:20:52" + }, + "logs": [ + { + "id": 11, + "date": "2025-01-13T00:00:00+01:00", + "session": 7, + "routine": 2, + "iteration": 2, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "9.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "84.00", + "weight_target": "80.00", + "rir": "0", + "rir_target": null, + "rest": 128, + "rest_target": 120 + }, + { + "id": 10, + "date": "2025-01-13T00:00:00+01:00", + "session": 7, + "routine": 2, + "iteration": 2, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "10.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "84.00", + "weight_target": "80.00", + "rir": "4", + "rir_target": null, + "rest": 149, + "rest_target": 120 + }, + { + "id": 12, + "date": "2025-01-13T00:00:00+01:00", + "session": 7, + "routine": 2, + "iteration": 2, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "10.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "89.00", + "weight_target": "80.00", + "rir": "1.5", + "rir_target": null, + "rest": 120, + "rest_target": 120 + }, + { + "id": 9, + "date": "2025-01-13T00:00:00+01:00", + "session": 7, + "routine": 2, + "iteration": 2, + "slot_entry": 2, + "next_log": null, + "exercise": 76, + "repetitions_unit": 1, + "repetitions": "12.00", + "repetitions_target": "10.00", + "weight_unit": 1, + "weight": "90.00", + "weight_target": "80.00", + "rir": "2.5", + "rir_target": null, + "rest": 119, + "rest_target": 120 + } + ] + } +] \ No newline at end of file diff --git a/test/fixtures/routines/routine_structure.json b/test/fixtures/routines/routine_structure.json new file mode 100644 index 00000000..aadf28cd --- /dev/null +++ b/test/fixtures/routines/routine_structure.json @@ -0,0 +1,266 @@ +{ + "id": 101, + "name": "Test 123", + "description": "", + "created": "2025-02-02T17:52:36.245680+01:00", + "start": "2025-01-06", + "end": "2025-03-28", + "fit_in_week": true, + "days": [ + { + "id": 8, + "routine": 2, + "order": 1, + "name": "Leg day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null, + "slots": [ + { + "id": 2, + "day": 8, + "order": 1, + "comment": "", + "entries": [ + { + "id": 2, + "slot": 2, + "exercise": 76, + "order": 1, + "comment": "", + "type": "normal", + "class_name": null, + "config": null, + "repetition_unit": 1, + "repetition_rounding": null, + "repetitions_configs": [ + { + "id": 2, + "slot_entry": 2, + "iteration": 1, + "value": "10.00", + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_repetitions_configs": [], + "weight_unit": 1, + "weight_rounding": null, + "weight_configs": [ + { + "id": 1, + "slot_entry": 2, + "iteration": 1, + "value": "80.00", + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_weight_configs": [], + "set_nr_configs": [ + { + "id": 2, + "slot_entry": 2, + "iteration": 1, + "value": 4, + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_set_nr_configs": [], + "rir_configs": [], + "max_rir_configs": [], + "rest_configs": [ + { + "id": 2, + "slot_entry": 2, + "iteration": 1, + "value": 120, + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_rest_configs": [] + } + ], + "config": null + } + ] + }, + { + "id": 9, + "routine": 2, + "order": 2, + "name": "", + "description": "", + "is_rest": true, + "need_logs_to_advance": false, + "type": "custom", + "config": null, + "slots": [] + }, + { + "id": 10, + "routine": 2, + "order": 3, + "name": "Arms day", + "description": "Leg day", + "is_rest": false, + "need_logs_to_advance": false, + "type": "custom", + "config": null, + "slots": [ + { + "id": 3, + "day": 10, + "order": 1, + "comment": "", + "entries": [ + { + "id": 3, + "slot": 3, + "exercise": 92, + "order": 1, + "comment": "", + "type": "normal", + "class_name": null, + "config": null, + "repetition_unit": 1, + "repetition_rounding": null, + "repetitions_configs": [ + { + "id": 3, + "slot_entry": 3, + "iteration": 1, + "value": "10.00", + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_repetitions_configs": [], + "weight_unit": 1, + "weight_rounding": null, + "weight_configs": [ + { + "id": 2, + "slot_entry": 3, + "iteration": 1, + "value": "20.00", + "operation": "r", + "step": "na", + "repeat": false, + "requirements": { + "rules": [] + } + }, + { + "id": 7, + "slot_entry": 3, + "iteration": 2, + "value": "1.00", + "operation": "+", + "step": "abs", + "repeat": true, + "requirements": { + "rules": [] + } + }, + { + "id": 8, + "slot_entry": 3, + "iteration": 8, + "value": "20.00", + "operation": "r", + "step": "na", + "repeat": false, + "requirements": { + "rules": [] + } + } + ], + "max_weight_configs": [ + { + "id": 1, + "slot_entry": 3, + "iteration": 1, + "value": "22.00", + "operation": "r", + "step": "na", + "repeat": false, + "requirements": { + "rules": [] + } + }, + { + "id": 2, + "slot_entry": 3, + "iteration": 2, + "value": "1.00", + "operation": "+", + "step": "abs", + "repeat": true, + "requirements": { + "rules": [] + } + }, + { + "id": 3, + "slot_entry": 3, + "iteration": 8, + "value": "22.00", + "operation": "r", + "step": "na", + "repeat": false, + "requirements": { + "rules": [] + } + } + ], + "set_nr_configs": [ + { + "id": 3, + "slot_entry": 3, + "iteration": 1, + "value": 4, + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_set_nr_configs": [], + "rir_configs": [], + "max_rir_configs": [], + "rest_configs": [ + { + "id": 3, + "slot_entry": 3, + "iteration": 1, + "value": 120, + "operation": "r", + "step": "abs", + "repeat": false, + "requirements": null + } + ], + "max_rest_configs": [] + } + ], + "config": null + } + ] + } + ] +} \ No newline at end of file diff --git a/test/fixtures/routines/slot_entry.json b/test/fixtures/routines/slot_entry.json index dcce1053..75b9b193 100644 --- a/test/fixtures/routines/slot_entry.json +++ b/test/fixtures/routines/slot_entry.json @@ -9,7 +9,7 @@ "config": null, "repetition_unit": 1, "repetition_rounding": "1.25", - "reps_configs": [ + "repetitions_configs": [ { "id": 139, "slot_entry": 143, @@ -22,7 +22,7 @@ "requirements": null } ], - "max_reps_configs": [ + "max_repetitions_configs": [ { "id": 1, "slot_entry": 143, diff --git a/test/workout/day_form_test.mocks.dart b/test/workout/day_form_test.mocks.dart index 01714673..8a9a7d27 100644 --- a/test/workout/day_form_test.mocks.dart +++ b/test/workout/day_form_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/goldens/routine_logs_screen_detail.png b/test/workout/goldens/routine_logs_screen_detail.png index 70022710..d378e033 100644 Binary files a/test/workout/goldens/routine_logs_screen_detail.png and b/test/workout/goldens/routine_logs_screen_detail.png differ diff --git a/test/workout/repetition_unit_form_widget_test.dart b/test/workout/repetition_unit_form_widget_test.dart index b1984c3f..458cf743 100644 --- a/test/workout/repetition_unit_form_widget_test.dart +++ b/test/workout/repetition_unit_form_widget_test.dart @@ -37,7 +37,7 @@ void main() { const unit2 = RepetitionUnit(id: 2, name: 'another name'); const unit3 = RepetitionUnit(id: 3, name: 'this is repetition number 3'); - var result = -1; + int? result; final slotEntry = SlotEntry( slotId: 1, @@ -54,7 +54,7 @@ void main() { setUp(() { mockWorkoutPlans = MockRoutinesProvider(); - result = -1; + result = null; when(mockWorkoutPlans.repetitionUnits).thenAnswer((_) => [unit1, unit2, unit3]); when(mockWorkoutPlans.findRepetitionUnitById(1)).thenReturn(unit1); when(mockWorkoutPlans.findRepetitionUnitById(2)).thenReturn(unit2); diff --git a/test/workout/repetition_unit_form_widget_test.mocks.dart b/test/workout/repetition_unit_form_widget_test.mocks.dart index b7568d06..767865e4 100644 --- a/test/workout/repetition_unit_form_widget_test.mocks.dart +++ b/test/workout/repetition_unit_form_widget_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/routine_edit_screen_test.mocks.dart b/test/workout/routine_edit_screen_test.mocks.dart index dd67580c..1e9653af 100644 --- a/test/workout/routine_edit_screen_test.mocks.dart +++ b/test/workout/routine_edit_screen_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/routine_edit_test.dart b/test/workout/routine_edit_test.dart index 369fb79d..a18eb39f 100644 --- a/test/workout/routine_edit_test.dart +++ b/test/workout/routine_edit_test.dart @@ -66,8 +66,8 @@ void main() { expect(find.text('first day'), findsNWidgets(2)); expect(find.text('chest, shoulders'), findsNWidgets(2), reason: 'description'); - expect(find.text('second day'), findsNWidgets(3)); - expect(find.text('legs'), findsNWidgets(3), reason: 'description'); + expect(find.text('second day'), findsNWidgets(2)); + expect(find.text('legs'), findsNWidgets(2), reason: 'description'); // Edit the first day expect(find.byElementType(DayFormWidget), findsNothing); diff --git a/test/workout/routine_edit_test.mocks.dart b/test/workout/routine_edit_test.mocks.dart index dff0ee64..02bf8562 100644 --- a/test/workout/routine_edit_test.mocks.dart +++ b/test/workout/routine_edit_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/routine_form_test.mocks.dart b/test/workout/routine_form_test.mocks.dart index 96af3739..0d30517b 100644 --- a/test/workout/routine_form_test.mocks.dart +++ b/test/workout/routine_form_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/routine_logs_screen_test.mocks.dart b/test/workout/routine_logs_screen_test.mocks.dart index 51e60920..83c001fa 100644 --- a/test/workout/routine_logs_screen_test.mocks.dart +++ b/test/workout/routine_logs_screen_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/routine_screen_test.dart b/test/workout/routine_screen_test.dart index 392bc491..9709ac61 100644 --- a/test/workout/routine_screen_test.dart +++ b/test/workout/routine_screen_test.dart @@ -85,10 +85,9 @@ void main() { expect(find.text('first day'), findsOneWidget); expect(find.text('chest, shoulders'), findsOneWidget); - // The second day is repeated - expect(find.text('second day'), findsNWidgets(2)); - expect(find.text('legs'), findsNWidgets(2)); + expect(find.text('second day'), findsOneWidget); + expect(find.text('legs'), findsOneWidget); - expect(find.byType(Card), findsNWidgets(3)); + expect(find.byType(Card), findsNWidgets(2)); }); } diff --git a/test/workout/routines_provider_test.dart b/test/workout/routines_provider_test.dart index 8d473868..8f16666f 100644 --- a/test/workout/routines_provider_test.dart +++ b/test/workout/routines_provider_test.dart @@ -33,10 +33,12 @@ import 'package:wger/providers/base_provider.dart'; import 'package:wger/providers/exercises.dart'; import 'package:wger/providers/routines.dart'; +import '../../test_data/exercises.dart'; +import '../../test_data/routines.dart'; import '../fixtures/fixture_reader.dart'; import 'routines_provider_test.mocks.dart'; -@GenerateMocks([WgerBaseProvider]) +@GenerateMocks([WgerBaseProvider, ExercisesProvider]) void main() { final mockBaseProvider = MockWgerBaseProvider(); @@ -59,7 +61,7 @@ void main() { 'description': 'Test workout abcd', 'start': '2021-12-20', 'end': '2022-06-06', - 'fit_in_week': false + 'fit_in_week': false, }), ); @@ -163,5 +165,62 @@ void main() { expect(true, DateTime.parse(prefsJson['date']).isBefore(DateTime.now())); expect(true, DateTime.parse(prefsJson['expiresIn']).isAfter(DateTime.now())); }); + + test('Smoke test fetchAndSetRoutineFull', () async { + //Arrange + final structureUri = Uri.https('localhost', 'api/v2/routine/101/structure/'); + when(mockBaseProvider.makeUrl('routine', objectMethod: 'structure', id: 101)) + .thenReturn(structureUri); + when(mockBaseProvider.fetch(structureUri)).thenAnswer((_) async => Future.value( + jsonDecode(fixture('routines/routine_structure.json')), + )); + + final dateSequenceDisplayUri = + Uri.https('localhost', 'api/v2/routine/101/date-sequence-display/'); + when(mockBaseProvider.makeUrl('routine', objectMethod: 'date-sequence-display', id: 101)) + .thenReturn(dateSequenceDisplayUri); + when(mockBaseProvider.fetch(dateSequenceDisplayUri)).thenAnswer((_) async => Future.value( + jsonDecode(fixture('routines/routine_date_sequence_display.json')), + )); + + final dateSequenceGymUri = Uri.https('localhost', 'api/v2/routine/101/date-sequence-gym/'); + when(mockBaseProvider.makeUrl('routine', objectMethod: 'date-sequence-gym', id: 101)) + .thenReturn(dateSequenceGymUri); + when(mockBaseProvider.fetch(dateSequenceGymUri)).thenAnswer((_) async => Future.value( + jsonDecode(fixture('routines/routine_date_sequence_gym.json')), + )); + + final logsUri = Uri.https('localhost', 'api/v2/routine/101/logs/'); + when(mockBaseProvider.makeUrl('routine', objectMethod: 'logs', id: 101)).thenReturn(logsUri); + when(mockBaseProvider.fetch(logsUri)).thenAnswer((_) async => Future.value( + jsonDecode(fixture('routines/routine_logs.json')), + )); + + final mockExercisesProvider = MockExercisesProvider(); + when(mockExercisesProvider.fetchAndSetExercise(76)).thenAnswer( + (_) async => Future.value(testBenchPress), + ); + when(mockExercisesProvider.fetchAndSetExercise(92)).thenAnswer( + (_) async => Future.value(testCrunches), + ); + + final provider = RoutinesProvider(mockBaseProvider, mockExercisesProvider, []); + provider.repetitionUnits = testRepetitionUnits; + provider.weightUnits = testWeightUnits; + + // Act + final result = await provider.fetchAndSetRoutineFull(101); + + // Assert + expect(result, isA()); + expect(result.id, 101); + expect(result.sessions.length, 3); + expect(result.days.length, 3); + expect(result.logs.length, 12); + expect(result.dayDataCurrentIteration.length, 8); + expect(result.dayDataCurrentIterationGym.length, 8); + expect(result.dayData.length, 32); + expect(result.dayDataGym.length, 32); + }); }); } diff --git a/test/workout/routines_provider_test.mocks.dart b/test/workout/routines_provider_test.mocks.dart index 9c26d49b..b94e0c8c 100644 --- a/test/workout/routines_provider_test.mocks.dart +++ b/test/workout/routines_provider_test.mocks.dart @@ -3,12 +3,20 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i5; +import 'dart:async' as _i11; +import 'dart:ui' as _i13; import 'package:http/http.dart' as _i3; import 'package:mockito/mockito.dart' as _i1; +import 'package:wger/database/exercises/exercise_database.dart' as _i5; +import 'package:wger/models/exercises/category.dart' as _i7; +import 'package:wger/models/exercises/equipment.dart' as _i8; +import 'package:wger/models/exercises/exercise.dart' as _i6; +import 'package:wger/models/exercises/language.dart' as _i10; +import 'package:wger/models/exercises/muscle.dart' as _i9; import 'package:wger/providers/auth.dart' as _i2; import 'package:wger/providers/base_provider.dart' as _i4; +import 'package:wger/providers/exercises.dart' as _i12; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -40,6 +48,37 @@ class _FakeResponse_3 extends _i1.SmartFake implements _i3.Response { _FakeResponse_3(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); } +class _FakeWgerBaseProvider_4 extends _i1.SmartFake implements _i4.WgerBaseProvider { + _FakeWgerBaseProvider_4(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeExerciseDatabase_5 extends _i1.SmartFake implements _i5.ExerciseDatabase { + _FakeExerciseDatabase_5(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeExercise_6 extends _i1.SmartFake implements _i6.Exercise { + _FakeExercise_6(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); +} + +class _FakeExerciseCategory_7 extends _i1.SmartFake implements _i7.ExerciseCategory { + _FakeExerciseCategory_7(Object parent, Invocation parentInvocation) + : super(parent, parentInvocation); +} + +class _FakeEquipment_8 extends _i1.SmartFake implements _i8.Equipment { + _FakeEquipment_8(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); +} + +class _FakeMuscle_9 extends _i1.SmartFake implements _i9.Muscle { + _FakeMuscle_9(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); +} + +class _FakeLanguage_10 extends _i1.SmartFake implements _i10.Language { + _FakeLanguage_10(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); +} + /// A class which mocks [WgerBaseProvider]. /// /// See the documentation for Mockito's code generation for more information. @@ -104,46 +143,400 @@ class MockWgerBaseProvider extends _i1.Mock implements _i4.WgerBaseProvider { ) as Uri); @override - _i5.Future fetch(Uri? uri) => (super.noSuchMethod( + _i11.Future fetch(Uri? uri) => (super.noSuchMethod( Invocation.method(#fetch, [uri]), - returnValue: _i5.Future.value(), - ) as _i5.Future); + returnValue: _i11.Future.value(), + ) as _i11.Future); @override - _i5.Future> fetchPaginated(Uri? uri) => (super.noSuchMethod( + _i11.Future> fetchPaginated(Uri? uri) => (super.noSuchMethod( Invocation.method(#fetchPaginated, [uri]), - returnValue: _i5.Future>.value([]), - ) as _i5.Future>); + returnValue: _i11.Future>.value([]), + ) as _i11.Future>); @override - _i5.Future> post(Map? data, Uri? uri) => + _i11.Future> post( + Map? data, + Uri? uri, + ) => (super.noSuchMethod( Invocation.method(#post, [data, uri]), - returnValue: _i5.Future>.value( + returnValue: _i11.Future>.value( {}, ), - ) as _i5.Future>); + ) as _i11.Future>); @override - _i5.Future> patch( + _i11.Future> patch( Map? data, Uri? uri, ) => (super.noSuchMethod( Invocation.method(#patch, [data, uri]), - returnValue: _i5.Future>.value( + returnValue: _i11.Future>.value( {}, ), - ) as _i5.Future>); + ) as _i11.Future>); @override - _i5.Future<_i3.Response> deleteRequest(String? url, int? id) => (super.noSuchMethod( + _i11.Future<_i3.Response> deleteRequest(String? url, int? id) => (super.noSuchMethod( Invocation.method(#deleteRequest, [url, id]), - returnValue: _i5.Future<_i3.Response>.value( + returnValue: _i11.Future<_i3.Response>.value( _FakeResponse_3( this, Invocation.method(#deleteRequest, [url, id]), ), ), - ) as _i5.Future<_i3.Response>); + ) as _i11.Future<_i3.Response>); +} + +/// A class which mocks [ExercisesProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockExercisesProvider extends _i1.Mock implements _i12.ExercisesProvider { + MockExercisesProvider() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.WgerBaseProvider get baseProvider => (super.noSuchMethod( + Invocation.getter(#baseProvider), + returnValue: _FakeWgerBaseProvider_4( + this, + Invocation.getter(#baseProvider), + ), + ) as _i4.WgerBaseProvider); + + @override + _i5.ExerciseDatabase get database => (super.noSuchMethod( + Invocation.getter(#database), + returnValue: _FakeExerciseDatabase_5( + this, + Invocation.getter(#database), + ), + ) as _i5.ExerciseDatabase); + + @override + set database(_i5.ExerciseDatabase? _database) => super.noSuchMethod( + Invocation.setter(#database, _database), + returnValueForMissingStub: null, + ); + + @override + List<_i6.Exercise> get exercises => (super.noSuchMethod( + Invocation.getter(#exercises), + returnValue: <_i6.Exercise>[], + ) as List<_i6.Exercise>); + + @override + set exercises(List<_i6.Exercise>? _exercises) => super.noSuchMethod( + Invocation.setter(#exercises, _exercises), + returnValueForMissingStub: null, + ); + + @override + List<_i6.Exercise> get filteredExercises => (super.noSuchMethod( + Invocation.getter(#filteredExercises), + returnValue: <_i6.Exercise>[], + ) as List<_i6.Exercise>); + + @override + set filteredExercises(List<_i6.Exercise>? newFilteredExercises) => super.noSuchMethod( + Invocation.setter(#filteredExercises, newFilteredExercises), + returnValueForMissingStub: null, + ); + + @override + Map> get exerciseBasesByVariation => (super.noSuchMethod( + Invocation.getter(#exerciseBasesByVariation), + returnValue: >{}, + ) as Map>); + + @override + List<_i7.ExerciseCategory> get categories => (super.noSuchMethod( + Invocation.getter(#categories), + returnValue: <_i7.ExerciseCategory>[], + ) as List<_i7.ExerciseCategory>); + + @override + List<_i9.Muscle> get muscles => (super.noSuchMethod( + Invocation.getter(#muscles), + returnValue: <_i9.Muscle>[], + ) as List<_i9.Muscle>); + + @override + List<_i8.Equipment> get equipment => (super.noSuchMethod( + Invocation.getter(#equipment), + returnValue: <_i8.Equipment>[], + ) as List<_i8.Equipment>); + + @override + List<_i10.Language> get languages => (super.noSuchMethod( + Invocation.getter(#languages), + returnValue: <_i10.Language>[], + ) as List<_i10.Language>); + + @override + set languages(List<_i10.Language>? languages) => super.noSuchMethod( + Invocation.setter(#languages, languages), + returnValueForMissingStub: null, + ); + + @override + bool get hasListeners => + (super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false) as bool); + + @override + _i11.Future setFilters(_i12.Filters? newFilters) => (super.noSuchMethod( + Invocation.method(#setFilters, [newFilters]), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + void initFilters() => super.noSuchMethod( + Invocation.method(#initFilters, []), + returnValueForMissingStub: null, + ); + + @override + _i11.Future findByFilters() => (super.noSuchMethod( + Invocation.method(#findByFilters, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + void clear() => super.noSuchMethod( + Invocation.method(#clear, []), + returnValueForMissingStub: null, + ); + + @override + _i6.Exercise findExerciseById(int? id) => (super.noSuchMethod( + Invocation.method(#findExerciseById, [id]), + returnValue: _FakeExercise_6( + this, + Invocation.method(#findExerciseById, [id]), + ), + ) as _i6.Exercise); + + @override + List<_i6.Exercise> findExercisesByVariationId( + int? id, { + int? exerciseBaseIdToExclude, + }) => + (super.noSuchMethod( + Invocation.method( + #findExercisesByVariationId, + [id], + {#exerciseBaseIdToExclude: exerciseBaseIdToExclude}, + ), + returnValue: <_i6.Exercise>[], + ) as List<_i6.Exercise>); + + @override + _i7.ExerciseCategory findCategoryById(int? id) => (super.noSuchMethod( + Invocation.method(#findCategoryById, [id]), + returnValue: _FakeExerciseCategory_7( + this, + Invocation.method(#findCategoryById, [id]), + ), + ) as _i7.ExerciseCategory); + + @override + _i8.Equipment findEquipmentById(int? id) => (super.noSuchMethod( + Invocation.method(#findEquipmentById, [id]), + returnValue: _FakeEquipment_8( + this, + Invocation.method(#findEquipmentById, [id]), + ), + ) as _i8.Equipment); + + @override + _i9.Muscle findMuscleById(int? id) => (super.noSuchMethod( + Invocation.method(#findMuscleById, [id]), + returnValue: _FakeMuscle_9( + this, + Invocation.method(#findMuscleById, [id]), + ), + ) as _i9.Muscle); + + @override + _i10.Language findLanguageById(int? id) => (super.noSuchMethod( + Invocation.method(#findLanguageById, [id]), + returnValue: _FakeLanguage_10( + this, + Invocation.method(#findLanguageById, [id]), + ), + ) as _i10.Language); + + @override + _i11.Future fetchAndSetCategoriesFromApi() => (super.noSuchMethod( + Invocation.method(#fetchAndSetCategoriesFromApi, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetMusclesFromApi() => (super.noSuchMethod( + Invocation.method(#fetchAndSetMusclesFromApi, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetEquipmentsFromApi() => (super.noSuchMethod( + Invocation.method(#fetchAndSetEquipmentsFromApi, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetLanguagesFromApi() => (super.noSuchMethod( + Invocation.method(#fetchAndSetLanguagesFromApi, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future<_i6.Exercise?> fetchAndSetExercise(int? exerciseId) => (super.noSuchMethod( + Invocation.method(#fetchAndSetExercise, [exerciseId]), + returnValue: _i11.Future<_i6.Exercise?>.value(), + ) as _i11.Future<_i6.Exercise?>); + + @override + _i11.Future<_i6.Exercise> handleUpdateExerciseFromApi( + _i5.ExerciseDatabase? database, + int? exerciseId, + ) => + (super.noSuchMethod( + Invocation.method(#handleUpdateExerciseFromApi, [ + database, + exerciseId, + ]), + returnValue: _i11.Future<_i6.Exercise>.value( + _FakeExercise_6( + this, + Invocation.method(#handleUpdateExerciseFromApi, [ + database, + exerciseId, + ]), + ), + ), + ) as _i11.Future<_i6.Exercise>); + + @override + _i11.Future initCacheTimesLocalPrefs({dynamic forceInit = false}) => (super.noSuchMethod( + Invocation.method(#initCacheTimesLocalPrefs, [], { + #forceInit: forceInit, + }), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future clearAllCachesAndPrefs() => (super.noSuchMethod( + Invocation.method(#clearAllCachesAndPrefs, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetInitialData() => (super.noSuchMethod( + Invocation.method(#fetchAndSetInitialData, []), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future setExercisesFromDatabase( + _i5.ExerciseDatabase? database, { + bool? forceDeleteCache = false, + }) => + (super.noSuchMethod( + Invocation.method( + #setExercisesFromDatabase, + [database], + {#forceDeleteCache: forceDeleteCache}, + ), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future updateExerciseCache(_i5.ExerciseDatabase? database) => (super.noSuchMethod( + Invocation.method(#updateExerciseCache, [database]), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetMuscles(_i5.ExerciseDatabase? database) => (super.noSuchMethod( + Invocation.method(#fetchAndSetMuscles, [database]), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetCategories(_i5.ExerciseDatabase? database) => (super.noSuchMethod( + Invocation.method(#fetchAndSetCategories, [database]), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetLanguages(_i5.ExerciseDatabase? database) => (super.noSuchMethod( + Invocation.method(#fetchAndSetLanguages, [database]), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future fetchAndSetEquipments(_i5.ExerciseDatabase? database) => (super.noSuchMethod( + Invocation.method(#fetchAndSetEquipments, [database]), + returnValue: _i11.Future.value(), + returnValueForMissingStub: _i11.Future.value(), + ) as _i11.Future); + + @override + _i11.Future> searchExercise( + String? name, { + String? languageCode = 'en', + bool? searchEnglish = false, + }) => + (super.noSuchMethod( + Invocation.method( + #searchExercise, + [name], + {#languageCode: languageCode, #searchEnglish: searchEnglish}, + ), + returnValue: _i11.Future>.value( + <_i6.Exercise>[], + ), + ) as _i11.Future>); + + @override + void addListener(_i13.VoidCallback? listener) => super.noSuchMethod( + Invocation.method(#addListener, [listener]), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i13.VoidCallback? listener) => super.noSuchMethod( + Invocation.method(#removeListener, [listener]), + returnValueForMissingStub: null, + ); + + @override + void dispose() => super.noSuchMethod( + Invocation.method(#dispose, []), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method(#notifyListeners, []), + returnValueForMissingStub: null, + ); } diff --git a/test/workout/slot_entry_form_test.mocks.dart b/test/workout/slot_entry_form_test.mocks.dart index c104eed1..85a9cd42 100644 --- a/test/workout/slot_entry_form_test.mocks.dart +++ b/test/workout/slot_entry_form_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test/workout/slot_entry_model_test.dart b/test/workout/slot_entry_model_test.dart index 8d932bce..96fde3b0 100644 --- a/test/workout/slot_entry_model_test.dart +++ b/test/workout/slot_entry_model_test.dart @@ -37,9 +37,9 @@ void main() { expect(slotEntry.repetitionRounding, 1.25); expect(slotEntry.weightUnitId, 1); expect(slotEntry.weightRounding, 2.5); - expect(slotEntry.repsConfigs.length, 1); - expect(slotEntry.repsConfigs[0].id, 139); - expect(slotEntry.maxRepsConfigs.length, 1); + expect(slotEntry.repetitionsConfigs.length, 1); + expect(slotEntry.repetitionsConfigs[0].id, 139); + expect(slotEntry.maxRepetitionsConfigs.length, 1); expect(slotEntry.weightConfigs.length, 1); expect(slotEntry.maxWeightConfigs.length, 1); expect(slotEntry.nrOfSetsConfigs.length, 1); diff --git a/test/workout/weight_unit_form_widget_test.dart b/test/workout/weight_unit_form_widget_test.dart index 082954bc..f93f42b4 100644 --- a/test/workout/weight_unit_form_widget_test.dart +++ b/test/workout/weight_unit_form_widget_test.dart @@ -33,7 +33,7 @@ import 'weight_unit_form_widget_test.mocks.dart'; @GenerateMocks([RoutinesProvider]) void main() { var mockWorkoutPlans = MockRoutinesProvider(); - var result = -1; + int? result; const unit1 = WeightUnit(id: 1, name: 'kg'); const unit2 = WeightUnit(id: 2, name: 'donkeys'); @@ -53,7 +53,7 @@ void main() { slotEntry.weightUnitObj = unit1; setUp(() { - result = -1; + result = null; mockWorkoutPlans = MockRoutinesProvider(); when(mockWorkoutPlans.weightUnits).thenAnswer((_) => [unit1, unit2, unit3]); when(mockWorkoutPlans.findWeightUnitById(1)).thenReturn(unit1); diff --git a/test/workout/weight_unit_form_widget_test.mocks.dart b/test/workout/weight_unit_form_widget_test.mocks.dart index 386cdd96..dc95f310 100644 --- a/test/workout/weight_unit_form_widget_test.mocks.dart +++ b/test/workout/weight_unit_form_widget_test.mocks.dart @@ -107,6 +107,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i3.WeightUnit>[], ) as List<_i3.WeightUnit>); + @override + set weightUnits(List<_i3.WeightUnit>? weightUnits) => super.noSuchMethod( + Invocation.setter(#weightUnits, weightUnits), + returnValueForMissingStub: null, + ); + @override _i3.WeightUnit get defaultWeightUnit => (super.noSuchMethod( Invocation.getter(#defaultWeightUnit), @@ -122,6 +128,12 @@ class MockRoutinesProvider extends _i1.Mock implements _i12.RoutinesProvider { returnValue: <_i4.RepetitionUnit>[], ) as List<_i4.RepetitionUnit>); + @override + set repetitionUnits(List<_i4.RepetitionUnit>? repetitionUnits) => super.noSuchMethod( + Invocation.setter(#repetitionUnits, repetitionUnits), + returnValueForMissingStub: null, + ); + @override _i4.RepetitionUnit get defaultRepetitionUnit => (super.noSuchMethod( Invocation.getter(#defaultRepetitionUnit), diff --git a/test_data/exercises.dart b/test_data/exercises.dart index 63faa2d3..ab23e265 100644 --- a/test_data/exercises.dart +++ b/test_data/exercises.dart @@ -50,7 +50,7 @@ const tEquipment3 = Equipment(id: 3, name: 'Bench'); const tEquipment4 = Equipment(id: 10, name: 'Gym mat'); const testEquipment = [tEquipment1, tEquipment2, tEquipment3]; -final benchPress = Exercise( +final testBenchPress = Exercise( id: 1, uuid: '364f196c-881b-4839-8bfc-9e8f651521b6', created: DateTime(2021, 09, 01), @@ -62,7 +62,7 @@ final benchPress = Exercise( translations: [benchPressEn, benchPressDe], ); -final crunches = Exercise( +final testCrunches = Exercise( id: 2, uuid: '82415754-fc4c-49ea-8ca7-1516dd36d5a0', created: DateTime(2021, 08, 01), @@ -74,7 +74,7 @@ final crunches = Exercise( translations: [crunchesEn, crunchesDe, crunchesFr], ); -final deadLift = Exercise( +final testDeadLift = Exercise( id: 3, uuid: 'ca84e2c5-5608-4d6d-ba57-6d4b6b5e7acd', created: DateTime(2021, 08, 01), @@ -86,7 +86,7 @@ final deadLift = Exercise( translations: [deadLiftEn], ); -final curls = Exercise( +final testCurls = Exercise( id: 4, uuid: '361f024c-fdf8-4146-b7d7-0c1b67c58141', created: DateTime(2021, 08, 01), @@ -98,7 +98,7 @@ final curls = Exercise( translations: [curlsEn], ); -final squats = Exercise( +final testSquats = Exercise( id: 5, uuid: '361f024c-fdf8-4146-b7d7-0c1b67c58141', created: DateTime(2021, 08, 01), @@ -110,7 +110,7 @@ final squats = Exercise( translations: [squatsEn], ); -final sideRaises = Exercise( +final testSideRaises = Exercise( id: 6, uuid: '721ff972-c568-41e3-8cf5-cf1e5c5c801c', created: DateTime(2022, 11, 01), @@ -213,16 +213,16 @@ final sideRaisesEn = Translation( ); List getTestExercises() { - return [benchPress, crunches, deadLift, curls, squats, sideRaises]; + return [testBenchPress, testCrunches, testDeadLift, testCurls, testSquats, testSideRaises]; } List getScreenshotExercises() { - benchPress.translations = benchPressTranslations; - crunches.translations = crunchesTranslations; - deadLift.translations = deadLiftTranslations; - curls.translations = curlsTranslations; - squats.translations = squatsTranslations; - sideRaises.translations = raisesTranslations; + testBenchPress.translations = benchPressTranslations; + testCrunches.translations = crunchesTranslations; + testDeadLift.translations = deadLiftTranslations; + testCurls.translations = curlsTranslations; + testSquats.translations = squatsTranslations; + testSideRaises.translations = raisesTranslations; - return [benchPress, crunches, deadLift, curls, squats, sideRaises]; + return [testBenchPress, testCrunches, testDeadLift, testCurls, testSquats, testSideRaises]; } diff --git a/test_data/routines.dart b/test_data/routines.dart index 4f3cf48d..9a49c810 100644 --- a/test_data/routines.dart +++ b/test_data/routines.dart @@ -126,7 +126,7 @@ Routine getTestRoutine({List? exercises}) { nrOfSetsConfigs: [ BaseConfig.firstIteration(4, 1), ], - repsConfigs: [ + repetitionsConfigs: [ BaseConfig.firstIteration(3, 1), ], weightConfigs: [ @@ -138,7 +138,6 @@ Routine getTestRoutine({List? exercises}) { value: 5, operation: '+', step: 'abs', - needLogToApply: false, requirements: null, repeat: true, ), @@ -170,7 +169,7 @@ Routine getTestRoutine({List? exercises}) { weightConfigs: [ BaseConfig.firstIteration(80, 1), ], - repsConfigs: [ + repetitionsConfigs: [ BaseConfig.firstIteration(5, 1), ], nrOfSetsConfigs: [ @@ -198,7 +197,7 @@ Routine getTestRoutine({List? exercises}) { nrOfSetsConfigs: [ BaseConfig.firstIteration(4, 1), ], - repsConfigs: [ + repetitionsConfigs: [ BaseConfig.firstIteration(12, 1), ], weightConfigs: [ @@ -227,6 +226,172 @@ Routine getTestRoutine({List? exercises}) { slots: [slotSquat], ); + final List dayDataGym = [ + DayData( + iteration: 1, + date: DateTime(2024, 11, 01), + label: '', + day: dayChestShoulders, + slots: [ + SlotData( + comment: 'Make sure to warm up', + isSuperset: false, + exerciseIds: [testExercises[0].id!], + setConfigs: [ + SetConfigData( + exerciseId: 1, + exercise: testExercises[0], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 3, + repetitionsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + SetConfigData( + exerciseId: testExercises[0].id!, + exercise: testExercises[0], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 3, + repetitionsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + SetConfigData( + exerciseId: testExercises[0].id!, + exercise: testExercises[0], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 3, + repetitionsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + ], + ), + SlotData( + comment: 'Side rises', + isSuperset: false, + exerciseIds: [testExercises[5].id!], + setConfigs: [ + SetConfigData( + exerciseId: testExercises[5].id!, + exercise: testExercises[5], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 12, + repetitionsUnit: testRepetitionUnit1, + weight: 10, + weightUnit: testWeightUnit1, + restTime: 60, + rir: '', + rpe: '', + textRepr: '12x10kg', + ), + SetConfigData( + exerciseId: testExercises[5].id!, + exercise: testExercises[5], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 12, + repetitionsUnit: testRepetitionUnit1, + weight: 10, + weightUnit: testWeightUnit1, + restTime: 60, + rir: '', + rpe: '', + textRepr: '12x10kg', + ), + SetConfigData( + exerciseId: testExercises[5].id!, + exercise: testExercises[5], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 12, + repetitionsUnit: testRepetitionUnit1, + weight: 10, + weightUnit: testWeightUnit1, + restTime: 60, + rir: '', + rpe: '', + textRepr: '12x10kg', + ), + ], + ), + ], + ), + DayData( + iteration: 1, + date: DateTime(2024, 11, 02), + label: '', + day: dayLegs, + slots: [ + SlotData( + comment: 'Squats', + isSuperset: false, + exerciseIds: [testExercises[4].id!], + setConfigs: [ + SetConfigData( + exerciseId: 8, + exercise: testExercises[4], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 3, + repetitionsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + SetConfigData( + exerciseId: testExercises[4].id!, + exercise: testExercises[4], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 3, + repetitionsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + SetConfigData( + exerciseId: testExercises[4].id!, + exercise: testExercises[4], + slotEntryId: 1, + nrOfSets: 1, + repetitions: 3, + repetitionsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + ], + ), + ], + ), + ]; + final List dayDataDisplay = [ DayData( iteration: 1, @@ -245,7 +410,7 @@ Routine getTestRoutine({List? exercises}) { slotEntryId: 1, nrOfSets: 4, repetitions: 3, - repsUnit: testRepetitionUnit1, + repetitionsUnit: testRepetitionUnit1, weight: 100, weightUnit: testWeightUnit1, restTime: 120, @@ -266,7 +431,7 @@ Routine getTestRoutine({List? exercises}) { slotEntryId: 1, nrOfSets: 4, repetitions: 12, - repsUnit: testRepetitionUnit1, + repetitionsUnit: testRepetitionUnit1, weight: 10, weightUnit: testWeightUnit1, restTime: 60, @@ -295,7 +460,7 @@ Routine getTestRoutine({List? exercises}) { slotEntryId: 1, nrOfSets: 4, repetitions: 3, - repsUnit: testRepetitionUnit1, + repetitionsUnit: testRepetitionUnit1, weight: 100, weightUnit: testWeightUnit1, restTime: 120, @@ -333,203 +498,7 @@ Routine getTestRoutine({List? exercises}) { days: [dayChestShoulders, dayLegs], sessions: [session1, session2], dayData: dayDataDisplay, - dayDataCurrentIteration: [ - ...dayDataDisplay, - DayData( - iteration: 2, - date: DateTime(2024, 11, 02), - label: '', - day: dayLegs, - slots: [ - SlotData( - comment: 'Squats', - isSuperset: false, - exerciseIds: [8], - setConfigs: [ - SetConfigData( - exerciseId: 8, - exercise: testExercises[4], - slotEntryId: 1, - nrOfSets: 5, - repetitions: 8, - repsUnit: testRepetitionUnit1, - weight: 105, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1', - rpe: '9', - textRepr: '5 sets 8x105kg', - ), - ], - ), - ], - ), - ], - dayDataGym: [ - DayData( - iteration: 1, - date: DateTime(2024, 11, 01), - label: '', - day: dayChestShoulders, - slots: [ - SlotData( - comment: 'Make sure to warm up', - isSuperset: false, - exerciseIds: [testExercises[0].id!], - setConfigs: [ - SetConfigData( - exerciseId: 1, - exercise: testExercises[0], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 3, - repsUnit: testRepetitionUnit1, - weight: 100, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1.5', - rpe: '8', - textRepr: '3x100kg', - ), - SetConfigData( - exerciseId: testExercises[0].id!, - exercise: testExercises[0], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 3, - repsUnit: testRepetitionUnit1, - weight: 100, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1.5', - rpe: '8', - textRepr: '3x100kg', - ), - SetConfigData( - exerciseId: testExercises[0].id!, - exercise: testExercises[0], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 3, - repsUnit: testRepetitionUnit1, - weight: 100, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1.5', - rpe: '8', - textRepr: '3x100kg', - ), - ], - ), - SlotData( - comment: 'Side rises', - isSuperset: false, - exerciseIds: [testExercises[5].id!], - setConfigs: [ - SetConfigData( - exerciseId: testExercises[5].id!, - exercise: testExercises[5], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 12, - repsUnit: testRepetitionUnit1, - weight: 10, - weightUnit: testWeightUnit1, - restTime: 60, - rir: '', - rpe: '', - textRepr: '12x10kg', - ), - SetConfigData( - exerciseId: testExercises[5].id!, - exercise: testExercises[5], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 12, - repsUnit: testRepetitionUnit1, - weight: 10, - weightUnit: testWeightUnit1, - restTime: 60, - rir: '', - rpe: '', - textRepr: '12x10kg', - ), - SetConfigData( - exerciseId: testExercises[5].id!, - exercise: testExercises[5], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 12, - repsUnit: testRepetitionUnit1, - weight: 10, - weightUnit: testWeightUnit1, - restTime: 60, - rir: '', - rpe: '', - textRepr: '12x10kg', - ), - ], - ), - ], - ), - DayData( - iteration: 1, - date: DateTime(2024, 11, 02), - label: '', - day: dayLegs, - slots: [ - SlotData( - comment: 'Squats', - isSuperset: false, - exerciseIds: [testExercises[4].id!], - setConfigs: [ - SetConfigData( - exerciseId: 8, - exercise: testExercises[4], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 3, - repsUnit: testRepetitionUnit1, - weight: 100, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1.5', - rpe: '8', - textRepr: '3x100kg', - ), - SetConfigData( - exerciseId: testExercises[4].id!, - exercise: testExercises[4], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 3, - repsUnit: testRepetitionUnit1, - weight: 100, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1.5', - rpe: '8', - textRepr: '3x100kg', - ), - SetConfigData( - exerciseId: testExercises[4].id!, - exercise: testExercises[4], - slotEntryId: 1, - nrOfSets: 1, - repetitions: 3, - repsUnit: testRepetitionUnit1, - weight: 100, - weightUnit: testWeightUnit1, - restTime: 120, - rir: '1.5', - rpe: '8', - textRepr: '3x100kg', - ), - ], - ), - ], - ), - ], + dayDataGym: dayDataGym, ); return routine;