import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/estado/estado_busqueda.dart'; import 'package:pluriwave/estado/estado_ecualizador.dart'; import 'package:pluriwave/estado/estado_grabacion.dart'; import 'package:pluriwave/estado/estado_radio.dart'; import 'package:pluriwave/l10n/gen/app_localizations.dart'; import 'package:pluriwave/modelos/preset_ecualizador.dart'; import 'package:pluriwave/pantallas/pantalla_inicio.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../helpers/fakes.dart'; /// S4-R5-A: changing the EQ preset must NOT rebuild PantallaInicio. void main() { setUp(() { SharedPreferences.setMockInitialValues({}); }); testWidgets('cambiar el preset de EQ no marca PantallaInicio para rebuild', ( tester, ) async { tester.view.physicalSize = const Size(1440, 3200); tester.view.devicePixelRatio = 1.0; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); final radio = FakeServicioRadio( populares: [emisoraDemo(uuid: 'api-1', nombre: 'API Uno')], popularesPorLlamada: [ [emisoraDemo(uuid: 'api-1', nombre: 'API Uno')], [emisoraDemo(uuid: 'api-2', nombre: 'API Dos')], ], ); final estado = EstadoRadio( audio: FakeServicioAudio(), favoritos: FakeServicioFavoritos(), radio: radio, servicioEcualizador: FakeServicioEcualizador(), resolverArchivoCustom: () async => File( '${Directory.current.path}/test/fixtures/emisoras_custom_vacio.json', ), iniciarAutomaticamente: false, ); addTearDown(estado.dispose); await tester.runAsync(estado.inicializar); await tester.pumpWidget( MultiProvider( providers: [ ChangeNotifierProvider.value(value: estado), ListenableProvider.value( value: estado.ecualizador, ), ListenableProvider.value(value: estado.busqueda), ListenableProvider.value(value: estado.grabacion), ], child: MaterialApp( locale: const Locale('es'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: const Scaffold(body: PantallaInicio()), ), ), ); await tester.pumpAndSettle(const Duration(milliseconds: 100)); // Provider defers dependent notification to the next build phase, so a // dirty-flag probe cannot observe it synchronously. Instead, log every // element rebuilt per frame and look for the screen in that log. final registro = []; final debugPrintOriginal = debugPrint; debugPrintRebuildDirtyWidgets = true; debugPrint = (String? message, {int? wrapWidth}) { registro.add(message ?? ''); }; addTearDown(() { debugPrintRebuildDirtyWidgets = false; debugPrint = debugPrintOriginal; }); // EQ preset change: a different notifier — must NOT rebuild the screen. await estado.ecualizador.cambiarPresetPrincipal(PresetEcualizador.rock); await tester.pump(); expect(registro.any((linea) => linea.contains('PantallaInicio')), isFalse); // Probe control: a real data change DOES rebuild the screen. registro.clear(); await tester.runAsync(estado.cargarPopulares); await tester.pump(); expect(registro.any((linea) => linea.contains('PantallaInicio')), isTrue); debugPrintRebuildDirtyWidgets = false; debugPrint = debugPrintOriginal; await tester.pumpAndSettle(const Duration(milliseconds: 100)); }); }