diff --git a/lib/models/workouts/log.dart b/lib/models/workouts/log.dart index 8ca7762c..b48f75af 100644 --- a/lib/models/workouts/log.dart +++ b/lib/models/workouts/log.dart @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +import 'dart:ui'; + import 'package:json_annotation/json_annotation.dart'; import 'package:wger/helpers/json.dart'; import 'package:wger/helpers/misc.dart'; @@ -107,4 +109,29 @@ class Log { String get singleLogRepText { return repText(reps, repetitionUnitObj, weight, weightUnitObj, rir); } + + /// Override the equals operator + /// + /// Two logs are considered equal if their content is equal. This is used e.g. + /// in lists where we want to have unique values + bool operator ==(o) { + return o is Log && + exerciseId == o.exerciseId && + weight == o.weight && + weightUnitId == o.weightUnitId && + reps == o.reps && + repetitionUnitId == o.repetitionUnitId && + rir == o.rir; + } + + @override + int get hashCode => hashValues(exerciseId, weight, weightUnitId, reps, repetitionUnitId, rir); + + //@override + //int get hashCode => super.hashCode; + + @override + String toString() { + return 'Log(id: $id, ex: $exerciseId, weightU: $weightUnitId, w: $weight, repU: $repetitionUnitId, rep: $reps, rir: $rir)'; + } } diff --git a/lib/models/workouts/workout_plan.dart b/lib/models/workouts/workout_plan.dart index c5fd8aa8..110989c6 100644 --- a/lib/models/workouts/workout_plan.dart +++ b/lib/models/workouts/workout_plan.dart @@ -69,8 +69,18 @@ class WorkoutPlan { Map toJson() => _$WorkoutPlanToJson(this); /// Filters the workout logs by exercise and sorts them by date - List filterLogsByExercise(Exercise exercise) { + /// + /// Optionally, filters list so that only unique logs are returned. "Unique" + /// means here that the values are the same, i.e. logs with the same weight, + /// reps, etc. are considered equal. Workout ID, Log ID and date are not + /// considered. + List filterLogsByExercise(Exercise exercise, {bool unique = false}) { var out = logs.where((element) => element.exerciseId == exercise.id).toList(); + + if (unique) { + out = out.toSet().toList(); + } + out.sort((a, b) => b.date.compareTo(a.date)); return out; } diff --git a/lib/widgets/workouts/gym_mode.dart b/lib/widgets/workouts/gym_mode.dart index e81347c7..e9974d61 100644 --- a/lib/widgets/workouts/gym_mode.dart +++ b/lib/widgets/workouts/gym_mode.dart @@ -361,17 +361,21 @@ class _LogPageState extends State { ? ListView( children: [ Text( - 'Logs', + AppLocalizations.of(context)!.labelWorkoutLogs, style: Theme.of(context).textTheme.headline6, textAlign: TextAlign.center, ), - ...widget._workoutPlan.filterLogsByExercise(widget._exercise).map((log) { + ...widget._workoutPlan + .filterLogsByExercise(widget._exercise, unique: true) + .map((log) { return ListTile( + //title: Text(log.id.toString()), title: Text(log.singleLogRepText.replaceAll('\n', '')), subtitle: Text( DateFormat.yMd(Localizations.localeOf(context).languageCode) .format(log.date)), - trailing: Icon(Icons.arrow_forward), + + trailing: Icon(Icons.copy), onTap: () { setState(() { // Text field diff --git a/test/gym_mode_screen_test.dart b/test/gym_mode_screen_test.dart index d3d552bf..94f4d1cd 100644 --- a/test/gym_mode_screen_test.dart +++ b/test/gym_mode_screen_test.dart @@ -165,9 +165,9 @@ void main() { expect(find.text('Workout session'), findsOneWidget); expect(find.byType(SessionPage), findsOneWidget); expect(find.byType(Form), findsOneWidget); - expect(find.byIcon(Icons.sentiment_dissatisfied), findsOneWidget); + expect(find.byIcon(Icons.sentiment_very_dissatisfied), findsOneWidget); expect(find.byIcon(Icons.sentiment_neutral), findsOneWidget); - expect(find.byIcon(Icons.sentiment_satisfied), findsOneWidget); + expect(find.byIcon(Icons.sentiment_very_satisfied), findsOneWidget); expect(find.byIcon(Icons.chevron_left), findsOneWidget); expect(find.byIcon(Icons.close), findsOneWidget); expect(find.byIcon(Icons.chevron_right), findsNothing); diff --git a/test/nutritional_plan_form_test.mocks.dart b/test/nutritional_plan_form_test.mocks.dart index 42d4d235..80c72bd7 100644 --- a/test/nutritional_plan_form_test.mocks.dart +++ b/test/nutritional_plan_form_test.mocks.dart @@ -39,57 +39,68 @@ class _FakeResponse extends _i1.Fake implements _i8.Response {} /// A class which mocks [NutritionPlansProvider]. /// /// See the documentation for Mockito's code generation for more information. -class MockNutritionPlansProvider extends _i1.Mock implements _i9.NutritionPlansProvider { +class MockNutritionPlansProvider extends _i1.Mock + implements _i9.NutritionPlansProvider { MockNutritionPlansProvider() { _i1.throwOnMissingStub(this); } @override List<_i4.NutritionalPlan> get items => - (super.noSuchMethod(Invocation.getter(#items), returnValue: <_i4.NutritionalPlan>[]) - as List<_i4.NutritionalPlan>); + (super.noSuchMethod(Invocation.getter(#items), + returnValue: <_i4.NutritionalPlan>[]) as List<_i4.NutritionalPlan>); @override bool get hasListeners => - (super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false) as bool); + (super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false) + as bool); @override - _i2.AuthProvider get auth => - (super.noSuchMethod(Invocation.getter(#auth), returnValue: _FakeAuthProvider()) - as _i2.AuthProvider); + _i2.AuthProvider get auth => (super.noSuchMethod(Invocation.getter(#auth), + returnValue: _FakeAuthProvider()) as _i2.AuthProvider); @override set auth(_i2.AuthProvider? _auth) => - super.noSuchMethod(Invocation.setter(#auth, _auth), returnValueForMissingStub: null); + super.noSuchMethod(Invocation.setter(#auth, _auth), + returnValueForMissingStub: null); @override - _i3.Client get client => - (super.noSuchMethod(Invocation.getter(#client), returnValue: _FakeClient()) as _i3.Client); + _i3.Client get client => (super.noSuchMethod(Invocation.getter(#client), + returnValue: _FakeClient()) as _i3.Client); @override set client(_i3.Client? _client) => - super.noSuchMethod(Invocation.setter(#client, _client), returnValueForMissingStub: null); + super.noSuchMethod(Invocation.setter(#client, _client), + returnValueForMissingStub: null); @override _i4.NutritionalPlan findById(int? id) => - (super.noSuchMethod(Invocation.method(#findById, [id]), returnValue: _FakeNutritionalPlan()) - as _i4.NutritionalPlan); + (super.noSuchMethod(Invocation.method(#findById, [id]), + returnValue: _FakeNutritionalPlan()) as _i4.NutritionalPlan); @override _i5.Meal? findMealById(int? id) => (super.noSuchMethod(Invocation.method(#findMealById, [id])) as _i5.Meal?); @override + _i10.Future fetchAndSetAllPlansSparse() => + (super.noSuchMethod(Invocation.method(#fetchAndSetAllPlansSparse, []), + returnValue: Future.value(null), + returnValueForMissingStub: Future.value()) as _i10.Future); + @override _i10.Future fetchAndSetAllPlansFull() => - (super.noSuchMethod(Invocation.method(#fetchAndSetAllPlans, []), + (super.noSuchMethod(Invocation.method(#fetchAndSetAllPlansFull, []), returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override _i10.Future<_i4.NutritionalPlan> fetchAndSetPlanSparse(int? planId) => (super.noSuchMethod(Invocation.method(#fetchAndSetPlanSparse, [planId]), - returnValue: Future<_i4.NutritionalPlan>.value(_FakeNutritionalPlan())) + returnValue: + Future<_i4.NutritionalPlan>.value(_FakeNutritionalPlan())) as _i10.Future<_i4.NutritionalPlan>); @override _i10.Future<_i4.NutritionalPlan> fetchAndSetPlanFull(int? planId) => - (super.noSuchMethod(Invocation.method(#fetchAndSetPlan, [planId]), - returnValue: Future<_i4.NutritionalPlan>.value(_FakeNutritionalPlan())) + (super.noSuchMethod(Invocation.method(#fetchAndSetPlanFull, [planId]), + returnValue: + Future<_i4.NutritionalPlan>.value(_FakeNutritionalPlan())) as _i10.Future<_i4.NutritionalPlan>); @override _i10.Future<_i4.NutritionalPlan> addPlan(_i4.NutritionalPlan? planData) => (super.noSuchMethod(Invocation.method(#addPlan, [planData]), - returnValue: Future<_i4.NutritionalPlan>.value(_FakeNutritionalPlan())) + returnValue: + Future<_i4.NutritionalPlan>.value(_FakeNutritionalPlan())) as _i10.Future<_i4.NutritionalPlan>); @override _i10.Future editPlan(_i4.NutritionalPlan? plan) => @@ -97,93 +108,105 @@ class MockNutritionPlansProvider extends _i1.Mock implements _i9.NutritionPlansP returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override - _i10.Future deletePlan(int? id) => (super.noSuchMethod(Invocation.method(#deletePlan, [id]), - returnValue: Future.value(null), - returnValueForMissingStub: Future.value()) as _i10.Future); + _i10.Future deletePlan(int? id) => + (super.noSuchMethod(Invocation.method(#deletePlan, [id]), + returnValue: Future.value(null), + returnValueForMissingStub: Future.value()) as _i10.Future); @override _i10.Future<_i5.Meal> addMeal(_i5.Meal? meal, int? planId) => (super.noSuchMethod(Invocation.method(#addMeal, [meal, planId]), - returnValue: Future<_i5.Meal>.value(_FakeMeal())) as _i10.Future<_i5.Meal>); + returnValue: Future<_i5.Meal>.value(_FakeMeal())) + as _i10.Future<_i5.Meal>); @override _i10.Future<_i5.Meal> editMeal(_i5.Meal? meal) => (super.noSuchMethod(Invocation.method(#editMeal, [meal]), - returnValue: Future<_i5.Meal>.value(_FakeMeal())) as _i10.Future<_i5.Meal>); + returnValue: Future<_i5.Meal>.value(_FakeMeal())) + as _i10.Future<_i5.Meal>); @override _i10.Future deleteMeal(_i5.Meal? meal) => (super.noSuchMethod(Invocation.method(#deleteMeal, [meal]), returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override - _i10.Future<_i6.MealItem> addMealItem(_i6.MealItem? mealItem, _i5.Meal? meal) => + _i10.Future<_i6.MealItem> addMealItem( + _i6.MealItem? mealItem, _i5.Meal? meal) => (super.noSuchMethod(Invocation.method(#addMealItem, [mealItem, meal]), - returnValue: Future<_i6.MealItem>.value(_FakeMealItem())) as _i10.Future<_i6.MealItem>); + returnValue: Future<_i6.MealItem>.value(_FakeMealItem())) + as _i10.Future<_i6.MealItem>); @override _i10.Future deleteMealItem(_i6.MealItem? mealItem) => (super.noSuchMethod(Invocation.method(#deleteMealItem, [mealItem]), returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override - _i10.Future<_i7.Ingredient> fetchIngredient(int? ingredientId) => (super.noSuchMethod( - Invocation.method(#fetchIngredient, [ingredientId]), - returnValue: Future<_i7.Ingredient>.value(_FakeIngredient())) as _i10.Future<_i7.Ingredient>); + _i10.Future<_i7.Ingredient> fetchIngredient(int? ingredientId) => + (super.noSuchMethod(Invocation.method(#fetchIngredient, [ingredientId]), + returnValue: Future<_i7.Ingredient>.value(_FakeIngredient())) + as _i10.Future<_i7.Ingredient>); @override _i10.Future fetchIngredientsFromCache() => (super.noSuchMethod(Invocation.method(#fetchIngredientsFromCache, []), returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override - _i10.Future> searchIngredient(String? name, [String? languageCode = r'en']) => - (super.noSuchMethod(Invocation.method(#searchIngredient, [name, languageCode]), - returnValue: Future>.value([])) as _i10.Future>); + _i10.Future> searchIngredient(String? name, + [String? languageCode = r'en']) => + (super.noSuchMethod( + Invocation.method(#searchIngredient, [name, languageCode]), + returnValue: Future>.value([])) + as _i10.Future>); @override _i10.Future logMealToDiary(_i5.Meal? meal) => (super.noSuchMethod(Invocation.method(#logMealToDiary, [meal]), returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override - _i10.Future fetchAndSetAllLogs() => - (super.noSuchMethod(Invocation.method(#fetchAndSetAllLogs, []), - returnValue: Future.value(null), - returnValueForMissingStub: Future.value()) as _i10.Future); - @override _i10.Future fetchAndSetLogs(_i4.NutritionalPlan? plan) => (super.noSuchMethod(Invocation.method(#fetchAndSetLogs, [plan]), returnValue: Future.value(null), returnValueForMissingStub: Future.value()) as _i10.Future); @override - void addListener(_i11.VoidCallback? listener) => super - .noSuchMethod(Invocation.method(#addListener, [listener]), returnValueForMissingStub: null); + void addListener(_i11.VoidCallback? listener) => + super.noSuchMethod(Invocation.method(#addListener, [listener]), + returnValueForMissingStub: null); @override void removeListener(_i11.VoidCallback? listener) => super.noSuchMethod(Invocation.method(#removeListener, [listener]), returnValueForMissingStub: null); @override - void dispose() => - super.noSuchMethod(Invocation.method(#dispose, []), returnValueForMissingStub: null); + void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), + returnValueForMissingStub: null); @override void notifyListeners() => - super.noSuchMethod(Invocation.method(#notifyListeners, []), returnValueForMissingStub: null); + super.noSuchMethod(Invocation.method(#notifyListeners, []), + returnValueForMissingStub: null); @override - dynamic makeUrl(String? path, {int? id, String? objectMethod, Map? query}) => - super.noSuchMethod(Invocation.method( - #makeUrl, [path], {#id: id, #objectMethod: objectMethod, #query: query})); + dynamic makeUrl(String? path, + {int? id, String? objectMethod, Map? query}) => + super.noSuchMethod(Invocation.method(#makeUrl, [path], + {#id: id, #objectMethod: objectMethod, #query: query})); @override - _i10.Future> fetch(Uri? uri) => - (super.noSuchMethod(Invocation.method(#fetch, [uri]), - returnValue: Future>.value({})) - as _i10.Future>); + _i10.Future> fetch(Uri? uri) => (super.noSuchMethod( + Invocation.method(#fetch, [uri]), + returnValue: Future>.value({})) + as _i10.Future>); @override - _i10.Future> post(Map? data, Uri? uri) => + _i10.Future> post( + Map? data, Uri? uri) => (super.noSuchMethod(Invocation.method(#post, [data, uri]), - returnValue: Future>.value({})) + returnValue: + Future>.value({})) as _i10.Future>); @override - _i10.Future> patch(Map? data, Uri? uri) => + _i10.Future> patch( + Map? data, Uri? uri) => (super.noSuchMethod(Invocation.method(#patch, [data, uri]), - returnValue: Future>.value({})) + returnValue: + Future>.value({})) as _i10.Future>); @override _i10.Future<_i8.Response> deleteRequest(String? url, int? id) => (super.noSuchMethod(Invocation.method(#deleteRequest, [url, id]), - returnValue: Future<_i8.Response>.value(_FakeResponse())) as _i10.Future<_i8.Response>); + returnValue: Future<_i8.Response>.value(_FakeResponse())) + as _i10.Future<_i8.Response>); } diff --git a/test/workout_log_model_test.dart b/test/workout_log_model_test.dart new file mode 100644 index 00000000..1eea3db4 --- /dev/null +++ b/test/workout_log_model_test.dart @@ -0,0 +1,81 @@ +/* + * This file is part of wger Workout Manager . + * Copyright (C) 2020, 2021 wger Team + * + * wger Workout Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wger Workout Manager is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'package:flutter_test/flutter_test.dart'; +import 'package:wger/models/workouts/log.dart'; + +void main() { + group('Test the workout log model', () { + late Log log1; + late Log log2; + + setUp(() { + log1 = Log( + id: 123, + workoutPlan: 100, + exerciseId: 1, + reps: 10, + rir: '1.5', + repetitionUnitId: 1, + weight: 20, + weightUnitId: 1, + date: DateTime(2010, 10, 1), + ); + log2 = Log( + id: 9, + workoutPlan: 42, + exerciseId: 1, + reps: 10, + rir: '1.5', + repetitionUnitId: 1, + weight: 20, + weightUnitId: 1, + date: DateTime(2063, 4, 5), + ); + }); + + test('Test equal values (besides Id, workoutPlan and date)', () async { + expect(log1, log2); + }); + + test('Test different rir values', () async { + log1.rir = null; + expect(log1, isNot(log2)); + }); + + test('Test different weight values', () async { + log1.weight = 100; + expect(log1, isNot(log2)); + }); + + test('Test different weight units', () async { + log1.weightUnitId = 2; + expect(log1, isNot(log2)); + }); + + test('Test different reps', () async { + log1.reps = 99; + expect(log1, isNot(log2)); + }); + + test('Test different rep units', () async { + log1.repetitionUnitId = 44; + expect(log1, isNot(log2)); + }); + }); +} diff --git a/test/workout_set_form_test.dart b/test/workout_set_form_test.dart new file mode 100644 index 00000000..78a4f95f --- /dev/null +++ b/test/workout_set_form_test.dart @@ -0,0 +1,105 @@ +/* + * This file is part of wger Workout Manager . + * Copyright (C) 2020, 2021 wger Team + * + * wger Workout Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * wger Workout Manager is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:provider/provider.dart'; +import 'package:wger/helpers/consts.dart'; +import 'package:wger/models/workouts/day.dart'; +import 'package:wger/models/workouts/set.dart'; +import 'package:wger/models/workouts/setting.dart'; +import 'package:wger/models/workouts/workout_plan.dart'; +import 'package:wger/providers/exercises.dart'; +import 'package:wger/providers/workout_plans.dart'; +import 'package:wger/widgets/workouts/forms.dart'; + +import '../test_data/workouts.dart'; +import 'base_provider_test.mocks.dart'; +import 'utils.dart'; +import 'workout_form_test.mocks.dart'; +import 'workout_set_form_test.mocks.dart'; + +@GenerateMocks([ExercisesProvider]) +void main() { + var mockWorkoutPlans = MockWorkoutPlansProvider(); + MockExercisesProvider mockExercises = MockExercisesProvider(); + WorkoutPlan workoutPlan = getWorkout(); + final client = MockClient(); + Day day = Day(); + + setUp(() { + WorkoutPlan workoutPlan = getWorkout(); + day = workoutPlan.days.first; + mockWorkoutPlans = MockWorkoutPlansProvider(); + }); + + Widget createHomeScreen({locale = 'en'}) { + return ChangeNotifierProvider( + create: (context) => WorkoutPlansProvider( + testAuthProvider, + mockExercises, + [workoutPlan], + client, + ), + child: ChangeNotifierProvider( + create: (context) => testExercisesProvider, + child: MaterialApp( + locale: Locale(locale), + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, + navigatorKey: GlobalKey(), + home: Scaffold( + body: SetFormWidget(day), + ), + )), + ); + } + + testWidgets('Test the widgets on the SetFormWidget', (WidgetTester tester) async { + await tester.pumpWidget(createHomeScreen()); + await tester.pumpAndSettle(); + + expect(find.byType(TypeAheadFormField), findsOneWidget); + expect(find.byType(Slider), findsOneWidget); + //expect(find.byType(SwitchListTile), findsOneWidget); + expect(find.byKey(Key(SUBMIT_BUTTON_KEY_NAME)), findsOneWidget); + expect(find.byType(ElevatedButton), findsOneWidget); + }); + + testWidgets('Test creating a new set', (WidgetTester tester) async { + when(mockWorkoutPlans.addSet(any)).thenAnswer((_) => Future.value(Set.empty())); + when(mockWorkoutPlans.addSetting(any)).thenAnswer((_) => Future.value(Setting.empty())); + when(mockWorkoutPlans.fetchSmartText(any, any)).thenAnswer((_) => Future.value('2 x 10')); + + await tester.pumpWidget(createHomeScreen()); + await tester.pumpAndSettle(); + + await tester.enterText(find.byKey(Key('field-typeahead')), 'exercise'); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(Key(SUBMIT_BUTTON_KEY_NAME))); + + //verify(mockWorkoutPlans.addSet(any)); + //verify(mockWorkoutPlans.addSettinbg(any)); + //verify(mockWorkoutPlans.fetchSmartText(any, any)); + }); +} diff --git a/test/workout_set_form_test.mocks.dart b/test/workout_set_form_test.mocks.dart new file mode 100644 index 00000000..37efe6eb --- /dev/null +++ b/test/workout_set_form_test.mocks.dart @@ -0,0 +1,138 @@ +// Mocks generated by Mockito 5.0.7 from annotations +// in wger/test/workout_set_form_test.dart. +// Do not manually edit this file. + +import 'dart:async' as _i7; +import 'dart:ui' as _i8; + +import 'package:http/src/client.dart' as _i3; +import 'package:http/src/response.dart' as _i5; +import 'package:mockito/mockito.dart' as _i1; +import 'package:wger/models/exercises/exercise.dart' as _i4; +import 'package:wger/providers/auth.dart' as _i2; +import 'package:wger/providers/exercises.dart' as _i6; + +// ignore_for_file: comment_references +// ignore_for_file: unnecessary_parenthesis + +// ignore_for_file: prefer_const_constructors + +// ignore_for_file: avoid_redundant_argument_values + +class _FakeAuthProvider extends _i1.Fake implements _i2.AuthProvider {} + +class _FakeClient extends _i1.Fake implements _i3.Client {} + +class _FakeExercise extends _i1.Fake implements _i4.Exercise {} + +class _FakeResponse extends _i1.Fake implements _i5.Response {} + +/// A class which mocks [ExercisesProvider]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockExercisesProvider extends _i1.Mock implements _i6.ExercisesProvider { + MockExercisesProvider() { + _i1.throwOnMissingStub(this); + } + + @override + List<_i4.Exercise> get items => (super.noSuchMethod(Invocation.getter(#items), + returnValue: <_i4.Exercise>[]) as List<_i4.Exercise>); + @override + bool get hasListeners => + (super.noSuchMethod(Invocation.getter(#hasListeners), returnValue: false) + as bool); + @override + _i2.AuthProvider get auth => (super.noSuchMethod(Invocation.getter(#auth), + returnValue: _FakeAuthProvider()) as _i2.AuthProvider); + @override + set auth(_i2.AuthProvider? _auth) => + super.noSuchMethod(Invocation.setter(#auth, _auth), + returnValueForMissingStub: null); + @override + _i3.Client get client => (super.noSuchMethod(Invocation.getter(#client), + returnValue: _FakeClient()) as _i3.Client); + @override + set client(_i3.Client? _client) => + super.noSuchMethod(Invocation.setter(#client, _client), + returnValueForMissingStub: null); + @override + _i4.Exercise findById(int? exerciseId) => + (super.noSuchMethod(Invocation.method(#findById, [exerciseId]), + returnValue: _FakeExercise()) as _i4.Exercise); + @override + _i7.Future fetchAndSetCategories() => + (super.noSuchMethod(Invocation.method(#fetchAndSetCategories, []), + returnValue: Future.value(null), + returnValueForMissingStub: Future.value()) as _i7.Future); + @override + _i7.Future fetchAndSetMuscles() => + (super.noSuchMethod(Invocation.method(#fetchAndSetMuscles, []), + returnValue: Future.value(null), + returnValueForMissingStub: Future.value()) as _i7.Future); + @override + _i7.Future fetchAndSetEquipment() => + (super.noSuchMethod(Invocation.method(#fetchAndSetEquipment, []), + returnValue: Future.value(null), + returnValueForMissingStub: Future.value()) as _i7.Future); + @override + _i7.Future<_i4.Exercise> fetchAndSetExercise(int? exerciseId) => + (super.noSuchMethod(Invocation.method(#fetchAndSetExercise, [exerciseId]), + returnValue: Future<_i4.Exercise>.value(_FakeExercise())) + as _i7.Future<_i4.Exercise>); + @override + _i7.Future fetchAndSetExercises() => + (super.noSuchMethod(Invocation.method(#fetchAndSetExercises, []), + returnValue: Future.value(null), + returnValueForMissingStub: Future.value()) as _i7.Future); + @override + _i7.Future> searchExercise(String? name, + [String? languageCode = r'en']) => + (super.noSuchMethod( + Invocation.method(#searchExercise, [name, languageCode]), + returnValue: Future>.value([])) + as _i7.Future>); + @override + void addListener(_i8.VoidCallback? listener) => + super.noSuchMethod(Invocation.method(#addListener, [listener]), + returnValueForMissingStub: null); + @override + void removeListener(_i8.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); + @override + dynamic makeUrl(String? path, + {int? id, String? objectMethod, Map? query}) => + super.noSuchMethod(Invocation.method(#makeUrl, [path], + {#id: id, #objectMethod: objectMethod, #query: query})); + @override + _i7.Future> fetch(Uri? uri) => (super.noSuchMethod( + Invocation.method(#fetch, [uri]), + returnValue: Future>.value({})) + as _i7.Future>); + @override + _i7.Future> post(Map? data, Uri? uri) => + (super.noSuchMethod(Invocation.method(#post, [data, uri]), + returnValue: + Future>.value({})) + as _i7.Future>); + @override + _i7.Future> patch( + Map? data, Uri? uri) => + (super.noSuchMethod(Invocation.method(#patch, [data, uri]), + returnValue: + Future>.value({})) + as _i7.Future>); + @override + _i7.Future<_i5.Response> deleteRequest(String? url, int? id) => + (super.noSuchMethod(Invocation.method(#deleteRequest, [url, id]), + returnValue: Future<_i5.Response>.value(_FakeResponse())) + as _i7.Future<_i5.Response>); +}