import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:yumi/app/config/app_config.dart'; import 'package:yumi/app/constants/sc_screen.dart'; import 'package:yumi/app_localizations.dart'; import 'package:yumi/modules/auth/account/sc_login_with_account_page.dart'; import 'package:yumi/modules/settings/language/language_page.dart'; import 'package:yumi/services/localization/localization_manager.dart'; import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); AppConfig.initialize(); tearDown(() async { DataPersistence.reset(); }); const locales = [ Locale('en'), Locale('ar'), Locale('tr'), Locale('bn'), ]; for (final locale in locales) { group('Locale ${locale.languageCode}', () { testWidgets('LanguagePage renders cleanly', (tester) async { await _pumpLocalizedPage( tester: tester, locale: locale, child: LanguagePage(), ); final exceptions = _drainExceptions(tester); expect(exceptions, isEmpty, reason: exceptions.join('\n\n')); expect( tester .widget(find.byType(MaterialApp)) .locale ?.languageCode, locale.languageCode, ); }); testWidgets('SCLoginWithAccountPage renders cleanly', (tester) async { await _pumpLocalizedPage( tester: tester, locale: locale, child: const SCLoginWithAccountPage(), ); final exceptions = _drainExceptions(tester); expect(exceptions, isEmpty, reason: exceptions.join('\n\n')); expect( tester .widget(find.byType(MaterialApp)) .locale ?.languageCode, locale.languageCode, ); }); }); } } Future _pumpLocalizedPage({ required WidgetTester tester, required Locale locale, required Widget child, }) async { SharedPreferences.setMockInitialValues({'lang': locale.languageCode}); await DataPersistence.initialize(); await tester.binding.setSurfaceSize(const Size(390, 844)); await tester.pumpWidget( ChangeNotifierProvider( create: (_) => LocalizationManager(), child: ScreenUtilInit( designSize: Size(SCScreen.designWidth, SCScreen.designHeight), splitScreenMode: false, minTextAdapt: true, builder: (context, _) { return MaterialApp( debugShowCheckedModeBanner: false, locale: locale, localizationsDelegates: const [ SCAppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], supportedLocales: const [ Locale('en'), Locale('ar'), Locale('tr'), Locale('bn'), ], home: RepaintBoundary( key: const ValueKey('capture_boundary'), child: child, ), ); }, ), ), ); await tester.pump(); await tester.pump(const Duration(milliseconds: 200)); await tester.pump(const Duration(milliseconds: 200)); await tester.pump(const Duration(milliseconds: 200)); } List _drainExceptions(WidgetTester tester) { final exceptions = []; Object? exception; while ((exception = tester.takeException()) != null) { exceptions.add(exception!); } return exceptions; }