From 5a39c6c2293dce21b1bd68416d7fd02252df90e9 Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Fri, 10 Jan 2025 15:52:26 +0100 Subject: [PATCH] Rename some functions, a bit of cleanup --- integration_test/1_dashboard.dart | 9 +- integration_test/2_workout.dart | 2 +- integration_test/3_gym_mode.dart | 2 +- lib/models/exercises/exercise.dart | 4 +- lib/providers/routines.dart | 38 +- lib/screens/add_exercise_screen.dart | 2 +- lib/screens/exercise_screen.dart | 2 +- lib/screens/gym_mode.dart | 6 +- .../add_exercise/steps/step2variations.dart | 4 +- lib/widgets/dashboard/widgets.dart | 2 +- lib/widgets/exercises/autocompleter.dart | 2 +- lib/widgets/exercises/exercises.dart | 2 +- lib/widgets/exercises/list_tile.dart | 2 +- lib/widgets/routines/day.dart | 4 +- lib/widgets/routines/forms/slot.dart | 8 +- lib/widgets/routines/gym_mode.dart | 41 +- lib/widgets/routines/log.dart | 2 +- test/exercises/model_exercise_test.dart | 14 +- test/workout/gym_mode_screen_test.dart | 19 +- test/workout/workout_plan_model_test.dart | 2 +- test/workout/workout_plan_screen_test.dart | 2 +- test_data/exercises.dart | 34 +- test_data/routines.dart | 403 ++++++++++++++---- 23 files changed, 434 insertions(+), 172 deletions(-) diff --git a/integration_test/1_dashboard.dart b/integration_test/1_dashboard.dart index b9298f84..00b8e942 100644 --- a/integration_test/1_dashboard.dart +++ b/integration_test/1_dashboard.dart @@ -12,9 +12,8 @@ import 'package:wger/theme/theme.dart'; import '../test/exercises/contribute_exercise_test.mocks.dart'; import '../test/measurements/measurement_categories_screen_test.mocks.dart'; -import '../test/nutrition/nutritional_plan_form_test.mocks.dart'; +import '../test/weight/weight_screen_test.mocks.dart' as weight; import '../test/workout/weight_unit_form_widget_test.mocks.dart'; -import '../test/workout/workout_form_test.mocks.dart'; import '../test_data/body_weight.dart'; import '../test_data/exercises.dart'; import '../test_data/measurements.dart'; @@ -25,7 +24,7 @@ import '../test_data/routines.dart'; Widget createDashboardScreen({locale = 'en'}) { final mockWorkoutProvider = MockRoutinesProvider(); when(mockWorkoutProvider.activeRoutine) - .thenReturn(getRoutine(exercises: getScreenshotExercises())); + .thenReturn(getTestRoutine(exercises: getScreenshotExercises())); final Map logs = { 'results': [ @@ -41,13 +40,13 @@ Widget createDashboardScreen({locale = 'en'}) { }; when(mockWorkoutProvider.fetchSessionData()).thenAnswer((a) => Future.value(logs)); - final mockNutritionProvider = MockNutritionPlansProvider(); + final mockNutritionProvider = weight.MockNutritionPlansProvider(); when(mockNutritionProvider.currentPlan) .thenAnswer((realInvocation) => getNutritionalPlanScreenshot()); when(mockNutritionProvider.items).thenReturn([getNutritionalPlanScreenshot()]); - final mockWeightProvider = MockBodyWeightProvider(); + final mockWeightProvider = weight.MockBodyWeightProvider(); when(mockWeightProvider.items).thenReturn(getScreenshotWeightEntries()); final mockMeasurementProvider = MockMeasurementProvider(); diff --git a/integration_test/2_workout.dart b/integration_test/2_workout.dart index da3f7121..de41c4c9 100644 --- a/integration_test/2_workout.dart +++ b/integration_test/2_workout.dart @@ -14,7 +14,7 @@ Widget createWorkoutDetailScreen({locale = 'en'}) { final key = GlobalKey(); final mockWorkoutProvider = MockRoutinesProvider(); - final workout = getRoutine(exercises: getScreenshotExercises()); + final workout = getTestRoutine(exercises: getScreenshotExercises()); when(mockWorkoutProvider.activeRoutine).thenReturn(workout); when(mockWorkoutProvider.fetchAndSetRoutineFull(1)).thenAnswer((_) => Future.value(workout)); diff --git a/integration_test/3_gym_mode.dart b/integration_test/3_gym_mode.dart index bddc80df..3715d0fe 100644 --- a/integration_test/3_gym_mode.dart +++ b/integration_test/3_gym_mode.dart @@ -16,7 +16,7 @@ import '../test_data/routines.dart'; Widget createGymModeScreen({locale = 'en'}) { final key = GlobalKey(); final bases = getTestExercises(); - final workout = getRoutine(exercises: getScreenshotExercises()); + final workout = getTestRoutine(exercises: getScreenshotExercises()); final mockExerciseProvider = MockExercisesProvider(); diff --git a/lib/models/exercises/exercise.dart b/lib/models/exercises/exercise.dart index a6c322be..69bd82e4 100644 --- a/lib/models/exercises/exercise.dart +++ b/lib/models/exercises/exercise.dart @@ -173,7 +173,7 @@ class Exercise extends Equatable { variationId = baseData.variationId; } - /// Returns exercises for the given language + /// Returns translation for the given language /// /// If no translation is found, English will be returned /// @@ -181,7 +181,7 @@ class Exercise extends Equatable { /// translation in English. This is something that should never happen, /// but we can't make sure that no local installation hasn't deleted /// the entry in English. - Translation getExercise(String language) { + Translation getTranslation(String language) { // If the language is in the form en-US, take the language code only final languageCode = language.split('-')[0]; diff --git a/lib/providers/routines.dart b/lib/providers/routines.dart index 89b0e52c..985edaca 100644 --- a/lib/providers/routines.dart +++ b/lib/providers/routines.dart @@ -63,18 +63,24 @@ class RoutinesProvider with ChangeNotifier { static const _routineConfigMaxRestTime = 'max-rest-config'; Routine? _currentPlan; - final ExercisesProvider _exercises; + late ExercisesProvider _exercises; final WgerBaseProvider baseProvider; List _routines = []; List _weightUnits = []; - List _repetitionUnit = []; + List _repetitionUnits = []; RoutinesProvider( this.baseProvider, ExercisesProvider exercises, - List entries, - ) : _exercises = exercises, - _routines = entries; + List entries, { + List? weightUnits, + List? repetitionUnits, + }) { + _exercises = exercises; + _routines = entries; + _weightUnits = weightUnits ?? []; + _repetitionUnits = repetitionUnits ?? []; + } List get items { return [..._routines]; @@ -89,7 +95,7 @@ class RoutinesProvider with ChangeNotifier { _currentPlan = null; _routines = []; _weightUnits = []; - _repetitionUnit = []; + _repetitionUnits = []; } /// Return the default weight unit (kg) @@ -100,15 +106,15 @@ class RoutinesProvider with ChangeNotifier { WeightUnit findWeightUnitById(int id) => _weightUnits.firstWhere((element) => element.id == id); List get repetitionUnits { - return [..._repetitionUnit]; + return [..._repetitionUnits]; } RepetitionUnit findRepetitionUnitById(int id) => - _repetitionUnit.firstWhere((element) => element.id == id); + _repetitionUnits.firstWhere((element) => element.id == id); /// Return the default weight unit (reps) RepetitionUnit get defaultRepetitionUnit { - return _repetitionUnit.firstWhere((element) => element.id == REP_UNIT_REPETITIONS_ID); + return _repetitionUnits.firstWhere((element) => element.id == REP_UNIT_REPETITIONS_ID); } List getPlans() { @@ -189,7 +195,7 @@ class RoutinesProvider with ChangeNotifier { for (final setConfig in slot.setConfigs) { setConfig.exercise = (await _exercises.fetchAndSetExercise(setConfig.exerciseId))!; - setConfig.repsUnit = _repetitionUnit.firstWhere( + setConfig.repsUnit = _repetitionUnits.firstWhere( (e) => e.id == setConfig.repsUnitId, ); @@ -293,7 +299,7 @@ class RoutinesProvider with ChangeNotifier { for (final slot in day.slots) { for (final slotEntry in slot.entries) { slotEntry.exerciseObj = (await _exercises.fetchAndSetExercise(slotEntry.exerciseId))!; - slotEntry.repetitionUnitObj = _repetitionUnit.firstWhere( + slotEntry.repetitionUnitObj = _repetitionUnits.firstWhere( (e) => e.id == slotEntry.repetitionUnitId, ); slotEntry.weightUnitObj = _weightUnits.firstWhere( @@ -315,7 +321,7 @@ class RoutinesProvider with ChangeNotifier { try { final log = Log.fromJson(logEntry); log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); - log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); + log.repetitionUnit = _repetitionUnits.firstWhere((e) => e.id == log.weightUnitId); log.exerciseBase = (await _exercises.fetchAndSetExercise(log.exerciseId))!; routine.logs.add(log); } catch (e) { @@ -392,7 +398,7 @@ class RoutinesProvider with ChangeNotifier { final response = await baseProvider.fetchPaginated(baseProvider.makeUrl(_repetitionUnitUrlPath)); for (final unit in response) { - _repetitionUnit.add(RepetitionUnit.fromJson(unit)); + _repetitionUnits.add(RepetitionUnit.fromJson(unit)); } } @@ -411,7 +417,7 @@ class RoutinesProvider with ChangeNotifier { final unitData = json.decode(prefs.getString(PREFS_WORKOUT_UNITS)!); if (DateTime.parse(unitData['expiresIn']).isAfter(DateTime.now())) { unitData['repetitionUnits'].forEach( - (e) => _repetitionUnit.add(RepetitionUnit.fromJson(e)), + (e) => _repetitionUnits.add(RepetitionUnit.fromJson(e)), ); unitData['weightUnit'].forEach( (e) => _weightUnits.add(WeightUnit.fromJson(e)), @@ -431,7 +437,7 @@ class RoutinesProvider with ChangeNotifier { final cacheData = { 'date': DateTime.now().toIso8601String(), 'expiresIn': DateTime.now().add(const Duration(days: DAYS_TO_CACHE)).toIso8601String(), - 'repetitionUnits': _repetitionUnit.map((e) => e.toJson()).toList(), + 'repetitionUnits': _repetitionUnits.map((e) => e.toJson()).toList(), 'weightUnit': _weightUnits.map((e) => e.toJson()).toList(), }; prefs.setString(PREFS_WORKOUT_UNITS, json.encode(cacheData)); @@ -691,7 +697,7 @@ class RoutinesProvider with ChangeNotifier { log.id = newLog.id; log.weightUnit = _weightUnits.firstWhere((e) => e.id == log.weightUnitId); - log.repetitionUnit = _repetitionUnit.firstWhere((e) => e.id == log.weightUnitId); + log.repetitionUnit = _repetitionUnits.firstWhere((e) => e.id == log.weightUnitId); log.exerciseBase = (await _exercises.fetchAndSetExercise(log.exerciseId))!; final plan = findById(log.routineId); diff --git a/lib/screens/add_exercise_screen.dart b/lib/screens/add_exercise_screen.dart index b9970128..40d56230 100644 --- a/lib/screens/add_exercise_screen.dart +++ b/lib/screens/add_exercise_screen.dart @@ -76,7 +76,7 @@ class _AddExerciseStepperState extends State { final exerciseId = await addExerciseProvider.addExercise(); final exercise = await exerciseProvider.fetchAndSetExercise(exerciseId); final name = exercise! - .getExercise(Localizations.localeOf(context).languageCode) + .getTranslation(Localizations.localeOf(context).languageCode) .name; setState(() { diff --git a/lib/screens/exercise_screen.dart b/lib/screens/exercise_screen.dart index d517f799..363ebcf5 100644 --- a/lib/screens/exercise_screen.dart +++ b/lib/screens/exercise_screen.dart @@ -31,7 +31,7 @@ class ExerciseDetailScreen extends StatelessWidget { return Scaffold( appBar: AppBar( - title: Text(exerciseBase.getExercise(Localizations.localeOf(context).languageCode).name), + title: Text(exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name), ), body: Padding( padding: const EdgeInsets.symmetric(horizontal: 10), diff --git a/lib/screens/gym_mode.dart b/lib/screens/gym_mode.dart index 36967035..b2ab02bc 100644 --- a/lib/screens/gym_mode.dart +++ b/lib/screens/gym_mode.dart @@ -40,14 +40,16 @@ class GymModeScreen extends StatelessWidget { final routinesProvider = context.read(); final routine = routinesProvider.findById(args.routineId); - final dayData = routine.dayDataGym + final dayDataDisplay = + routine.dayData.firstWhere((e) => e.iteration == args.iteration && e.day?.id == args.dayId); + final dayDataGym = routine.dayDataGym .where((e) => e.iteration == args.iteration && e.day?.id == args.dayId) .first; return Scaffold( body: SafeArea( child: Consumer( - builder: (context, value, child) => GymMode(dayData), + builder: (context, value, child) => GymMode(dayDataGym, dayDataDisplay), ), ), ); diff --git a/lib/widgets/add_exercise/steps/step2variations.dart b/lib/widgets/add_exercise/steps/step2variations.dart index fb2fb5b7..2474efb8 100644 --- a/lib/widgets/add_exercise/steps/step2variations.dart +++ b/lib/widgets/add_exercise/steps/step2variations.dart @@ -40,7 +40,7 @@ class Step2Variations extends StatelessWidget { ...exerciseProvider.exerciseBasesByVariation[key]!.map( (base) => Text( base - .getExercise( + .getTranslation( Localizations.localeOf(context).languageCode, ) .name, @@ -72,7 +72,7 @@ class Step2Variations extends StatelessWidget { children: [ Text( base - .getExercise( + .getTranslation( Localizations.localeOf(context).languageCode, ) .name, diff --git a/lib/widgets/dashboard/widgets.dart b/lib/widgets/dashboard/widgets.dart index 2f915c26..b0a0fe57 100644 --- a/lib/widgets/dashboard/widgets.dart +++ b/lib/widgets/dashboard/widgets.dart @@ -439,7 +439,7 @@ class _DashboardWorkoutWidgetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(s.exercise - .getExercise(Localizations.localeOf(context).languageCode) + .getTranslation(Localizations.localeOf(context).languageCode) .name), const SizedBox(width: 10), MutedText(s.textRepr), diff --git a/lib/widgets/exercises/autocompleter.dart b/lib/widgets/exercises/autocompleter.dart index 4ba14013..289c09c8 100644 --- a/lib/widgets/exercises/autocompleter.dart +++ b/lib/widgets/exercises/autocompleter.dart @@ -102,7 +102,7 @@ class _ExerciseAutocompleterState extends State { ), ), title: Text( - exerciseSuggestion.getExercise(Localizations.localeOf(context).languageCode).name, + exerciseSuggestion.getTranslation(Localizations.localeOf(context).languageCode).name, ), subtitle: Text( '${exerciseSuggestion.category!.name} / ${exerciseSuggestion.equipment.map((e) => e.name).join(', ')}', diff --git a/lib/widgets/exercises/exercises.dart b/lib/widgets/exercises/exercises.dart index bfd515bf..b784b065 100644 --- a/lib/widgets/exercises/exercises.dart +++ b/lib/widgets/exercises/exercises.dart @@ -42,7 +42,7 @@ class ExerciseDetail extends StatelessWidget { @override Widget build(BuildContext context) { - _exercise = _exerciseBase.getExercise(Localizations.localeOf(context).languageCode); + _exercise = _exerciseBase.getTranslation(Localizations.localeOf(context).languageCode); return SingleChildScrollView( child: Column( diff --git a/lib/widgets/exercises/list_tile.dart b/lib/widgets/exercises/list_tile.dart index f1574b45..163615f7 100644 --- a/lib/widgets/exercises/list_tile.dart +++ b/lib/widgets/exercises/list_tile.dart @@ -49,7 +49,7 @@ class ExerciseListTile extends StatelessWidget { ), ), title: Text( - exerciseBase.getExercise(Localizations.localeOf(context).languageCode).name, + exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name, //style: theme.textTheme.titleLarge, overflow: TextOverflow.ellipsis, maxLines: 2, diff --git a/lib/widgets/routines/day.dart b/lib/widgets/routines/day.dart index 4832a38c..ba4c8b3a 100644 --- a/lib/widgets/routines/day.dart +++ b/lib/widgets/routines/day.dart @@ -46,7 +46,7 @@ class SetConfigDataWidget extends StatelessWidget { context: context, builder: (BuildContext context) { return AlertDialog( - title: Text(setConfigData.exercise.getExercise(languageCode).name), + title: Text(setConfigData.exercise.getTranslation(languageCode).name), content: ExerciseDetail(setConfigData.exercise), actions: [ TextButton( @@ -63,7 +63,7 @@ class SetConfigDataWidget extends StatelessWidget { ); }, ), - title: Text(setConfigData.exercise.getExercise(languageCode).name), + title: Text(setConfigData.exercise.getTranslation(languageCode).name), subtitle: Text(setConfigData.textRepr), ); } diff --git a/lib/widgets/routines/forms/slot.dart b/lib/widgets/routines/forms/slot.dart index acd2645c..98417663 100644 --- a/lib/widgets/routines/forms/slot.dart +++ b/lib/widgets/routines/forms/slot.dart @@ -44,7 +44,7 @@ class ProgressionRulesInfoBox extends StatelessWidget { children: [ ListTile( title: Text( - exercise.getExercise(languageCode).name, + exercise.getTranslation(languageCode).name, style: Theme.of(context).textTheme.titleMedium, ), ), @@ -148,7 +148,7 @@ class _SlotEntryFormState extends State { children: [ ListTile( title: Text( - widget.entry.exerciseObj.getExercise(languageCode).name, + widget.entry.exerciseObj.getTranslation(languageCode).name, style: Theme.of(context).textTheme.titleMedium, // textAlign: TextAlign.center, ), @@ -500,8 +500,8 @@ class _SlotFormWidgetStateNg extends State { : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ...slot.entries - .map((e) => Text(e.exerciseObj.getExercise(languageCode).name)), + ...slot.entries.map( + (e) => Text(e.exerciseObj.getTranslation(languageCode).name)), ], ), trailing: Row( diff --git a/lib/widgets/routines/gym_mode.dart b/lib/widgets/routines/gym_mode.dart index e6dd24d7..730d60b2 100644 --- a/lib/widgets/routines/gym_mode.dart +++ b/lib/widgets/routines/gym_mode.dart @@ -29,7 +29,6 @@ import 'package:wger/helpers/i18n.dart'; import 'package:wger/helpers/json.dart'; import 'package:wger/helpers/ui.dart'; import 'package:wger/models/exercises/exercise.dart'; -import 'package:wger/models/workouts/day.dart'; import 'package:wger/models/workouts/day_data.dart'; import 'package:wger/models/workouts/log.dart'; import 'package:wger/models/workouts/routine.dart'; @@ -48,10 +47,11 @@ import 'package:wger/widgets/routines/forms/rir.dart'; import 'package:wger/widgets/routines/forms/weight_unit.dart'; class GymMode extends StatefulWidget { - final DayData _dayData; + final DayData _dayDataGym; + final DayData _dayDataDisplay; late final TimeOfDay _start; - GymMode(this._dayData) { + GymMode(this._dayDataGym, this._dayDataDisplay) { _start = TimeOfDay.now(); } @@ -77,7 +77,7 @@ class _GymModeState extends State { super.initState(); // Calculate amount of elements for progress indicator - for (final slot in widget._dayData.slots) { + for (final slot in widget._dayDataGym.slots) { _totalElements += slot.setConfigs.length; } // Calculate the pages for the navigation @@ -85,7 +85,7 @@ class _GymModeState extends State { // This duplicates the code below in the getContent method, but it seems to // be the easiest way var currentPage = 1; - for (final slot in widget._dayData.slots) { + for (final slot in widget._dayDataGym.slots) { var firstPage = true; for (final config in slot.setConfigs) { final exercise = Provider.of(context, listen: false) @@ -113,7 +113,7 @@ class _GymModeState extends State { var currentElement = 1; final List out = []; - for (final slotData in widget._dayData.slots) { + for (final slotData in widget._dayDataGym.slots) { var firstPage = true; for (final config in slotData.setConfigs) { final ratioCompleted = currentElement / _totalElements; @@ -134,10 +134,11 @@ class _GymModeState extends State { config, slotData, exercise, - workoutProvider.findById(widget._dayData.day!.routineId), + workoutProvider.findById(widget._dayDataGym.day!.routineId), ratioCompleted, _exercisePages, )); + out.add(TimerWidget(_controller, ratioCompleted, _exercisePages)); firstPage = false; } @@ -151,11 +152,11 @@ class _GymModeState extends State { return PageView( controller: _controller, children: [ - StartPage(_controller, widget._dayData.day!, _exercisePages), + StartPage(_controller, widget._dayDataDisplay, _exercisePages), ...getContent(), SessionPage( Provider.of(context, listen: false) - .findById(widget._dayData.day!.routineId), + .findById(widget._dayDataGym.day!.routineId), _controller, widget._start, _exercisePages, @@ -167,10 +168,10 @@ class _GymModeState extends State { class StartPage extends StatelessWidget { final PageController _controller; - final Day _day; + final DayData _dayData; final Map _exercisePages; - const StartPage(this._controller, this._day, this._exercisePages); + const StartPage(this._controller, this._dayData, this._exercisePages); @override Widget build(BuildContext context) { @@ -185,19 +186,19 @@ class StartPage extends StatelessWidget { Expanded( child: ListView( children: [ - ..._day.slots.map((slot) { + ..._dayData.slots.map((slotData) { return Column( children: [ - ...slot.entries.map((entry) { + ...slotData.setConfigs.map((entry) { return Column( children: [ Text( - entry.exerciseObj - .getExercise(Localizations.localeOf(context).languageCode) + entry.exercise + .getTranslation(Localizations.localeOf(context).languageCode) .name, style: Theme.of(context).textTheme.titleLarge, ), - const Text('TODO'), + Text(entry.textRepr), const SizedBox(height: 15), ], ); @@ -617,7 +618,7 @@ class _LogPageState extends State { return Column( children: [ NavigationHeader( - widget._exercise.getExercise(Localizations.localeOf(context).languageCode).name, + widget._exercise.getTranslation(Localizations.localeOf(context).languageCode).name, widget._controller, exercisePages: widget._exercisePages, ), @@ -667,7 +668,7 @@ class ExerciseOverview extends StatelessWidget { return Column( children: [ NavigationHeader( - _exerciseBase.getExercise(Localizations.localeOf(context).languageCode).name, + _exerciseBase.getTranslation(Localizations.localeOf(context).languageCode).name, _controller, exercisePages: _exercisePages, ), @@ -700,7 +701,7 @@ class ExerciseOverview extends StatelessWidget { ), Html( data: _exerciseBase - .getExercise(Localizations.localeOf(context).languageCode) + .getTranslation(Localizations.localeOf(context).languageCode) .description, ), ], @@ -1078,7 +1079,7 @@ class NavigationHeader extends StatelessWidget { children: [ ...exercisePages.keys.map((e) { return ListTile( - title: Text(e.getExercise(Localizations.localeOf(context).languageCode).name), + title: Text(e.getTranslation(Localizations.localeOf(context).languageCode).name), trailing: const Icon(Icons.chevron_right), onTap: () { _controller.animateToPage( diff --git a/lib/widgets/routines/log.dart b/lib/widgets/routines/log.dart index 74da9309..8ddb3879 100644 --- a/lib/widgets/routines/log.dart +++ b/lib/widgets/routines/log.dart @@ -113,7 +113,7 @@ class _DayLogWidgetState extends State { ), if (widget._session != null) const Text('Session data here'), ...widget._exerciseData.keys.map((base) { - final exercise = base.getExercise(Localizations.localeOf(context).languageCode); + final exercise = base.getTranslation(Localizations.localeOf(context).languageCode); return Column( children: [ if (widget._exerciseData[base]!.isNotEmpty) diff --git a/test/exercises/model_exercise_test.dart b/test/exercises/model_exercise_test.dart index 2d817ba0..f5b9defc 100644 --- a/test/exercises/model_exercise_test.dart +++ b/test/exercises/model_exercise_test.dart @@ -17,13 +17,13 @@ void main() { final base = getTestExercises()[1]; // assert - expect(base.getExercise('en').id, 5); - expect(base.getExercise('en-UK').id, 5); - expect(base.getExercise('de').id, 4); - expect(base.getExercise('de-AT').id, 4); - expect(base.getExercise('fr').id, 3); - expect(base.getExercise('fr-FR').id, 3); - expect(base.getExercise('pt').id, 5); // English again + expect(base.getTranslation('en').id, 5); + expect(base.getTranslation('en-UK').id, 5); + expect(base.getTranslation('de').id, 4); + expect(base.getTranslation('de-AT').id, 4); + expect(base.getTranslation('fr').id, 3); + expect(base.getTranslation('fr-FR').id, 3); + expect(base.getTranslation('pt').id, 5); // English again }); test('Load the readExerciseBaseFromBaseInfo parse method', () { diff --git a/test/workout/gym_mode_screen_test.dart b/test/workout/gym_mode_screen_test.dart index ce9dca51..e4fa9658 100644 --- a/test/workout/gym_mode_screen_test.dart +++ b/test/workout/gym_mode_screen_test.dart @@ -42,15 +42,17 @@ void main() { final key = GlobalKey(); final mockExerciseProvider = MockExercisesProvider(); - final workoutPlan = getRoutine(); - final bases = getTestExercises(); + final testRoutine = getTestRoutine(); + final testExercises = getTestExercises(); - Widget createHomeScreen({locale = 'en'}) { + Widget renderGymMode({locale = 'en'}) { return ChangeNotifierProvider( create: (context) => RoutinesProvider( mockBaseProvider, mockExerciseProvider, - [workoutPlan], + [testRoutine], + repetitionUnits: testRepetitionUnits, + weightUnits: testWeightUnits, ), child: ChangeNotifierProvider( create: (context) => mockExerciseProvider, @@ -62,7 +64,7 @@ void main() { home: TextButton( onPressed: () => key.currentState!.push( MaterialPageRoute( - settings: RouteSettings(arguments: workoutPlan.days.first), + settings: const RouteSettings(arguments: GymModeArguments(1, 1, 1)), builder: (_) => const GymModeScreen(), ), ), @@ -75,10 +77,10 @@ void main() { } testWidgets('Test the widgets on the gym mode screen', (WidgetTester tester) async { - when(mockExerciseProvider.findExerciseById(1)).thenReturn(bases[0]); - when(mockExerciseProvider.findExerciseById(6)).thenReturn(bases[5]); + when(mockExerciseProvider.findExerciseById(1)).thenReturn(testExercises[0]); + when(mockExerciseProvider.findExerciseById(6)).thenReturn(testExercises[5]); - await tester.pumpWidget(createHomeScreen()); + await tester.pumpWidget(renderGymMode()); await tester.tap(find.byType(TextButton)); await tester.pumpAndSettle(); @@ -174,6 +176,7 @@ void main() { // // Side raises - exercise overview page // + debugDumpApp(); expect(find.text('Side raises'), findsOneWidget); expect(find.byType(ExerciseOverview), findsOneWidget); await tester.tap(find.byIcon(Icons.chevron_right)); diff --git a/test/workout/workout_plan_model_test.dart b/test/workout/workout_plan_model_test.dart index 5396b117..72e4811e 100644 --- a/test/workout/workout_plan_model_test.dart +++ b/test/workout/workout_plan_model_test.dart @@ -24,7 +24,7 @@ import '../../test_data/routines.dart'; void main() { group('model tests', () { test('Test the filterLogsByExercise method', () { - final workout = getRoutine(); + final workout = getTestRoutine(); expect(workout.logs.length, 3); final logExercise1 = workout.filterLogsByExercise(getTestExercises()[0]); diff --git a/test/workout/workout_plan_screen_test.dart b/test/workout/workout_plan_screen_test.dart index 339148f0..7cce3eb1 100644 --- a/test/workout/workout_plan_screen_test.dart +++ b/test/workout/workout_plan_screen_test.dart @@ -52,7 +52,7 @@ void main() { home: TextButton( onPressed: () => key.currentState!.push( MaterialPageRoute( - settings: RouteSettings(arguments: getRoutine()), + settings: RouteSettings(arguments: getTestRoutine()), builder: (_) => const RoutineScreen(), ), ), diff --git a/test_data/exercises.dart b/test_data/exercises.dart index f9ea5789..63faa2d3 100644 --- a/test_data/exercises.dart +++ b/test_data/exercises.dart @@ -59,6 +59,7 @@ final benchPress = Exercise( equipment: const [tEquipment1, tEquipment2], muscles: const [tMuscle1, tMuscle2], musclesSecondary: const [tMuscle3], + translations: [benchPressEn, benchPressDe], ); final crunches = Exercise( @@ -70,6 +71,7 @@ final crunches = Exercise( equipment: const [tEquipment2], muscles: const [tMuscle1], musclesSecondary: const [tMuscle2], + translations: [crunchesEn, crunchesDe, crunchesFr], ); final deadLift = Exercise( @@ -81,6 +83,7 @@ final deadLift = Exercise( equipment: const [tEquipment2], muscles: const [tMuscle1], musclesSecondary: const [tMuscle2], + translations: [deadLiftEn], ); final curls = Exercise( @@ -92,7 +95,9 @@ final curls = Exercise( equipment: const [tEquipment2], muscles: const [tMuscle1], musclesSecondary: const [tMuscle2], + translations: [curlsEn], ); + final squats = Exercise( id: 5, uuid: '361f024c-fdf8-4146-b7d7-0c1b67c58141', @@ -102,7 +107,9 @@ final squats = Exercise( equipment: const [tEquipment2], muscles: const [tMuscle1], musclesSecondary: const [tMuscle2], + translations: [squatsEn], ); + final sideRaises = Exercise( id: 6, uuid: '721ff972-c568-41e3-8cf5-cf1e5c5c801c', @@ -112,6 +119,7 @@ final sideRaises = Exercise( equipment: const [tEquipment2], muscles: const [tMuscle1], musclesSecondary: const [tMuscle2], + translations: [sideRaisesEn], ); final benchPressDe = Translation( @@ -120,16 +128,17 @@ final benchPressDe = Translation( created: DateTime(2021, 1, 15), name: 'Bankdrücken', description: 'add clever text', - exerciseId: benchPress.id, + exerciseId: 1, language: tLanguage1, ); + final benchPressEn = Translation( id: 7, uuid: 'f4cc326b-e497-4bd7-a71d-0eb1db522743', created: DateTime(2021, 1, 15), name: 'Bench press', description: 'add clever text', - exerciseId: benchPress.id, + exerciseId: 1, language: tLanguage1, ); @@ -139,7 +148,7 @@ final deadLiftEn = Translation( created: DateTime(2021, 1, 15), name: 'Dead Lift', description: 'Lorem ipsum etc', - exerciseId: crunches.id, + exerciseId: 3, language: tLanguage2, ); @@ -149,7 +158,7 @@ final crunchesFr = Translation( created: DateTime(2021, 4, 1), name: 'Crunches', description: 'The man in black fled across the desert, and the gunslinger followed', - exerciseId: deadLift.id, + exerciseId: 2, language: tLanguage3, ); @@ -159,7 +168,7 @@ final crunchesDe = Translation( created: DateTime(2021, 4, 1), name: 'Crunches', description: 'The story so far: in the beginning, the universe was created', - exerciseId: deadLift.id, + exerciseId: 2, language: tLanguage1, ); @@ -169,7 +178,7 @@ final crunchesEn = Translation( created: DateTime(2021, 4, 1), name: 'test exercise 5', description: 'I am an invisible man', - exerciseId: deadLift.id, + exerciseId: 2, language: tLanguage2, ); @@ -179,7 +188,7 @@ final curlsEn = Translation( created: DateTime(2021, 4, 1), name: 'Curls', description: 'It was a bright cold day in April, and the clocks were striking thirteen', - exerciseId: curls.id, + exerciseId: 4, language: tLanguage2, ); @@ -189,7 +198,7 @@ final squatsEn = Translation( created: DateTime(2021, 4, 1), name: 'Squats', description: 'It was a bright cold day in April, and the clocks were striking thirteen', - exerciseId: curls.id, + exerciseId: 5, language: tLanguage2, ); @@ -199,18 +208,11 @@ final sideRaisesEn = Translation( created: DateTime(2022, 11, 1), name: 'Side raises', description: 'It was a bright cold day in April, and the clocks were striking thirteen', - exerciseId: curls.id, + exerciseId: 6, language: tLanguage2, ); List getTestExercises() { - benchPress.translations = [benchPressEn, benchPressDe]; - crunches.translations = [crunchesEn, crunchesDe, crunchesFr]; - deadLift.translations = [deadLiftEn]; - curls.translations = [curlsEn]; - squats.translations = [squatsEn]; - sideRaises.translations = [sideRaisesEn]; - return [benchPress, crunches, deadLift, curls, squats, sideRaises]; } diff --git a/test_data/routines.dart b/test_data/routines.dart index 8745420a..c79ce51e 100644 --- a/test_data/routines.dart +++ b/test_data/routines.dart @@ -23,6 +23,7 @@ import 'package:wger/models/workouts/day_data.dart'; import 'package:wger/models/workouts/log.dart'; import 'package:wger/models/workouts/repetition_unit.dart'; import 'package:wger/models/workouts/routine.dart'; +import 'package:wger/models/workouts/set_config_data.dart'; import 'package:wger/models/workouts/slot.dart'; import 'package:wger/models/workouts/slot_data.dart'; import 'package:wger/models/workouts/slot_entry.dart'; @@ -32,12 +33,14 @@ import './exercises.dart'; const testWeightUnit1 = WeightUnit(id: 1, name: 'kg'); const testWeightUnit2 = WeightUnit(id: 2, name: 'metric tonnes'); +const testWeightUnits = [testWeightUnit1, testWeightUnit2]; const RepetitionUnit testRepetitionUnit1 = RepetitionUnit(id: 1, name: 'Repetitions'); const RepetitionUnit testRepetitionUnit2 = RepetitionUnit(id: 2, name: 'Hours'); +const testRepetitionUnits = [testRepetitionUnit1, testRepetitionUnit2]; -Routine getRoutine({List? exercises}) { - final testExercise = exercises ?? getTestExercises(); +Routine getTestRoutine({List? exercises}) { + final testExercises = exercises ?? getTestExercises(); final log1 = Log.empty() ..id = 1 @@ -46,7 +49,7 @@ Routine getRoutine({List? exercises}) { ..date = DateTime(2021, 5, 1) ..reps = 10 ..routineId = 1; - log1.exerciseBase = testExercise[0]; + log1.exerciseBase = testExercises[0]; log1.weightUnit = testWeightUnit1; log1.repetitionUnit = testRepetitionUnit1; @@ -57,7 +60,7 @@ Routine getRoutine({List? exercises}) { ..date = DateTime(2021, 5, 1) ..reps = 12 ..routineId = 1; - log2.exerciseBase = testExercise[0]; + log2.exerciseBase = testExercises[0]; log2.weightUnit = testWeightUnit1; log2.repetitionUnit = testRepetitionUnit1; @@ -68,7 +71,7 @@ Routine getRoutine({List? exercises}) { ..date = DateTime(2021, 5, 2) ..reps = 8 ..routineId = 1; - log3.exerciseBase = testExercise[1]; + log3.exerciseBase = testExercises[1]; log3.weightUnit = testWeightUnit1; log3.repetitionUnit = testRepetitionUnit1; @@ -84,7 +87,13 @@ Routine getRoutine({List? exercises}) { comment: 'ddd', repetitionUnit: testRepetitionUnit1, weightUnit: testWeightUnit1, - exercise: testExercise[0], + exercise: testExercises[0], + nrOfSetsConfigs: [ + BaseConfig.firstIteration(4, 1), + ], + repsConfigs: [ + BaseConfig.firstIteration(3, 1), + ], weightConfigs: [ BaseConfig.firstIteration(100, 1), BaseConfig( @@ -99,12 +108,6 @@ Routine getRoutine({List? exercises}) { repeat: true, ), ], - repsConfigs: [ - BaseConfig.firstIteration(3, 1), - ], - nrOfSetsConfigs: [ - BaseConfig.firstIteration(4, 1), - ], ); final slotBenchPress = Slot.withData( @@ -113,7 +116,7 @@ Routine getRoutine({List? exercises}) { order: 1, comment: 'Make sure to warm up', ); - slotBenchPress.addExerciseBase(testExercise[0]); + slotBenchPress.addExerciseBase(testExercises[0]); slotBenchPress.entries.add(slotEntryBenchPress); final slotEntrySquat = SlotEntry( @@ -128,7 +131,7 @@ Routine getRoutine({List? exercises}) { comment: 'ddd', repetitionUnit: testRepetitionUnit1, weightUnit: testWeightUnit1, - exercise: testExercise[4], + exercise: testExercises[4], weightConfigs: [ BaseConfig.firstIteration(80, 1), ], @@ -141,7 +144,7 @@ Routine getRoutine({List? exercises}) { ); final slotSquat = Slot.withData(id: 2, day: 1, order: 1); - slotSquat.addExerciseBase(testExercise[4]); + slotSquat.addExerciseBase(testExercises[4]); slotSquat.entries.add(slotEntrySquat); final slotEntrySideRaises = SlotEntry( @@ -156,21 +159,21 @@ Routine getRoutine({List? exercises}) { comment: 'ddd', repetitionUnit: testRepetitionUnit1, weightUnit: testWeightUnit1, - exercise: testExercise[5], - weightConfigs: [ - BaseConfig.firstIteration(10, 1), + exercise: testExercises[5], + nrOfSetsConfigs: [ + BaseConfig.firstIteration(4, 1), ], repsConfigs: [ BaseConfig.firstIteration(12, 1), ], - nrOfSetsConfigs: [ - BaseConfig.firstIteration(4, 1), + weightConfigs: [ + BaseConfig.firstIteration(10, 1), ], ); // settingSideRaises.weight = 6; final slotSideRaises = Slot.withData(id: 3, day: 1, order: 1); - slotSideRaises.addExerciseBase(testExercise[5]); + slotSideRaises.addExerciseBase(testExercises[5]); slotSideRaises.entries.add(slotEntrySideRaises); final dayChestShoulders = Day( @@ -189,63 +192,309 @@ Routine getRoutine({List? exercises}) { slots: [slotSquat], ); + final List dayDataDisplay = [ + DayData( + iteration: 1, + date: DateTime(2024, 11, 01), + label: '', + day: dayChestShoulders, + slots: [ + SlotData( + comment: 'Bench press', + isSuperset: false, + exerciseIds: [1], + setConfigs: [ + SetConfigData( + exerciseId: 1, + exercise: testExercises[0], + slotEntryId: 1, + nrOfSets: 4, + reps: 3, + repsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '4 sets 3x100kg', + ), + ], + ), + SlotData( + comment: 'Side rises', + isSuperset: false, + exerciseIds: [6], + setConfigs: [ + SetConfigData( + exerciseId: 6, + exercise: testExercises[5], + slotEntryId: 1, + nrOfSets: 4, + reps: 12, + repsUnit: testRepetitionUnit1, + weight: 10, + weightUnit: testWeightUnit1, + restTime: 60, + rir: '', + rpe: '', + textRepr: '4 sets 12x10kg', + ), + ], + ) + ], + ), + DayData( + iteration: 1, + 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: 4, + reps: 3, + repsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '4 sets 3x100kg', + ), + ], + ) + ], + ), + DayData( + iteration: 1, + date: DateTime(2024, 11, 02), + label: 'null day (filled because of fitInWeek flag)', + day: null, + slots: [], + ), + DayData( + iteration: 1, + date: DateTime(2024, 11, 02), + label: 'null day (filled because of fitInWeek flag)', + day: null, + slots: [], + ), + ]; + final routine = Routine( - id: 1, - created: DateTime(2021, 01, 01), - name: '3 day workout', - start: DateTime(2024, 11, 01), - end: DateTime(2024, 12, 01), - days: [ - dayChestShoulders, - dayLegs - ], - logs: [ - log1, - log2, - log3 - ], - dayDataCurrentIteration: [ - DayData( - iteration: 1, - date: DateTime(2024, 11, 01), - label: '', - day: dayChestShoulders, - slots: [ - SlotData( - comment: 'foo', - isSuperset: false, - exerciseIds: [1], - setConfigs: [ - // SetConfigData( - // reps: 10, - // weight: 10, - // rir: '1.5', - // ), - ], - ) - ], - ), - DayData( - iteration: 1, - date: DateTime(2024, 11, 02), - label: '', - day: dayLegs, - slots: [ - SlotData( - comment: 'foo', - isSuperset: false, - exerciseIds: [8], - setConfigs: [ - // SetConfigData( - // reps: 8, - // weight: 50, - // rir: '', - // ), - ], - ) - ], - ), - ]); + id: 1, + created: DateTime(2021, 01, 01), + name: '3 day workout', + start: DateTime(2024, 11, 01), + end: DateTime(2024, 12, 01), + days: [dayChestShoulders, dayLegs], + logs: [log1, log2, log3], + 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, + reps: 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, + reps: 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, + reps: 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, + reps: 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, + reps: 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, + reps: 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, + reps: 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, + reps: 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, + reps: 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, + reps: 3, + repsUnit: testRepetitionUnit1, + weight: 100, + weightUnit: testWeightUnit1, + restTime: 120, + rir: '1.5', + rpe: '8', + textRepr: '3x100kg', + ), + ], + ) + ], + ), + ], + ); return routine; }