import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pluriwave/l10n/gen/app_localizations.dart'; import 'package:pluriwave/modelos/preset_ecualizador.dart'; import 'package:pluriwave/tema/pluriwave_tokens.dart'; import 'package:pluriwave/widgets/ecualizador_widget.dart'; /// WU13 task 13.1 — first-class regression guard (design ADR-5, spec /// `eq-custom-presets` "Five-Band Equalizer"): the equalizer widget must /// always render exactly 5 vertical sliders. Band count is device-reported /// via `just_audio`'s `AndroidEqualizer` (spike, Engram id 2498), not /// app-chosen — any future change rendering 7 sliders is rejected on sight. /// /// **Correction found at apply time**: `tasks.md`'s WU13 Verify command /// names this file as if it already existed ("Modified tests: /// ecualizador_widget_test.dart"). No such file existed before this commit /// (`ecualizador_widget.dart` had zero test coverage) — created new instead. void main() { Widget buildWidget({ PresetEcualizador? preset, bool habilitado = true, void Function(PresetEcualizador)? onCambio, }) { return MaterialApp( locale: const Locale('en'), localizationsDelegates: AppLocalizations.localizationsDelegates, supportedLocales: AppLocalizations.supportedLocales, home: Scaffold( body: EcualizadorWidget( preset: preset ?? PresetEcualizador.flat, habilitado: habilitado, onCambio: onCambio ?? (_) {}, ), ), ); } testWidgets('renders exactly 5 vertical sliders, one per band', ( tester, ) async { await tester.pumpWidget(buildWidget()); expect(find.byType(Slider), findsNWidgets(5)); }); testWidgets('renders exactly 5 sliders regardless of the preset selected', ( tester, ) async { // Regression guard restated: a future change proposing 7 sliders (the // rejected mockup band count) must fail this test regardless of which // fixed preset is active. await tester.pumpWidget(buildWidget(preset: PresetEcualizador.jazz)); expect(find.byType(Slider), findsNWidgets(5)); }); testWidgets('dragging a slider reports the updated band back via onCambio', ( tester, ) async { PresetEcualizador? reportado; await tester.pumpWidget(buildWidget(onCambio: (p) => reportado = p)); final slider = tester.widget(find.byType(Slider).first); slider.onChanged?.call(6.0); await tester.pump(); expect(reportado, isNotNull); expect(reportado!.bandas.length, 5); expect(reportado!.bandas.first, 6.0); }); testWidgets( 'habilitado: false disables every slider (greyed, non-interactive)', (tester) async { await tester.pumpWidget(buildWidget(habilitado: false)); final sliders = tester.widgetList(find.byType(Slider)); expect(sliders, hasLength(5)); for (final slider in sliders) { expect(slider.onChanged, isNull); } }, ); testWidgets('habilitado: true (default) keeps every slider interactive', ( tester, ) async { await tester.pumpWidget(buildWidget()); final sliders = tester.widgetList(find.byType(Slider)); expect(sliders, hasLength(5)); for (final slider in sliders) { expect(slider.onChanged, isNotNull); } }); // Visual-fidelity guards (audit id 2521, items 11.4 and 11.6). These two // values drifted silently once already: the whole point of the fidelity // pass was that behavioural tests ("renders 5 sliders") never noticed the // sliders were 46% too short and painted in the wrong colour family. testWidgets('each band column is 280 tall, as the prototype draws it', ( tester, ) async { await tester.pumpWidget(buildWidget()); final columnas = tester.widgetList( find.descendant( of: find.byType(EcualizadorWidget), matching: find.byType(SizedBox), ), ); expect( columnas.where((c) => c.height == 280), hasLength(5), reason: 'prototype t4 line 581 sizes the band column at 280; 152 left the ' 'sliders 46% short', ); }); testWidgets('band fill uses the brand teal, not the LIVE-badge green', ( tester, ) async { await tester.pumpWidget(buildWidget()); final tema = SliderTheme.of(tester.element(find.byType(Slider).first)); expect(tema.activeTrackColor, PluriWaveTokens.brand); expect(tema.thumbColor, PluriWaveTokens.brand); expect( tema.activeTrackColor, isNot(PluriWaveTokens.dark.liveGreen), reason: 'liveGreen (#7EE4C2) is the LIVE badge colour; the prototype fills ' 'EQ bands with brand teal #21D4D9 (t4 line 585)', ); }); }