Marquage, pas refonte. PAC = 38 % de la consommation maison, eau chaude = 18 %, autres
= 22 % : trois ratios posés à la maquette, jamais remplacés, et un seul (« Autres »)
portait le cercle pointillé. Les trois le portent maintenant, leurs flux passent en
pointillé, et une légende sous le schéma nomme ce qui est quoi :
« Répartition estimée : PAC, eau chaude et autres usages sont des parts types, pas des
mesures. Seule la voiture est mesurée à la borne. »
Le trait pointillé seul ne suffisait pas : quatre chiffres en kW se ressemblent tous et se
lisent tous comme des mesures. Nommer les branches évite de faire chercher lesquelles.
Brancher les trois sur GetLoadTelemetry.measuredW reste le vrai lot — la source existe
(chauffe-eau 1500 W, PAC 800 W au relevé du jour), mais c'est une refonte de l'écran
d'accueil et le banc est pris par la campagne V2C.
Quatre tests montés sur la vue, dont deux qui figent ce que la voiture affiche : « non lu »
sans borne — jamais 0,0 kW, qui échangerait une fiction contre une autre — et la mesure
quand il y en a une. Deux pièges de harnais notés dans le fichier : pumpAndSettle est
inutilisable (les particules tournent en boucle, disableAnimations ne change que la valeur
lue), et toucher un nœud à la première trame le rate en silence — les nœuds entrent en
ScaleTransition depuis une échelle nulle.
PREPA_BANC_20260828.md corrigé en parallèle (dépôt plugin) : trois de ses affirmations sont
tombées avec le déploiement du matin.
158 tests, flutter analyze inchangé à 27 remarques.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQbZKrWqsMFP1Lh2jjjd9f
102 lines
4.1 KiB
Dart
102 lines
4.1 KiB
Dart
/// La vue « consommation » du Sankey — ce qui est mesuré, et ce qui ne l'est pas.
|
|
///
|
|
/// Trois de ses quatre branches sont des **ratios en dur** posés à la maquette : PAC = 38 %
|
|
/// de la consommation maison, eau chaude = 18 %, autres = 22 %. Un seul nœud (« Autres »)
|
|
/// portait le cercle pointillé ; les deux autres se lisaient comme des mesures. Et la
|
|
/// voiture affichait 3,6 kW en permanence, véhicule débranché — la valeur par défaut de
|
|
/// `EnergyData.chargingPower`, supprimée le 2026-08-28.
|
|
///
|
|
/// Ces tests figent le marquage. Ils ne valident pas les ratios : les remplacer par
|
|
/// `measuredW` de `GetLoadTelemetry` est un lot à part.
|
|
library;
|
|
|
|
import 'package:etm_powersync_app/features/dashboard/widgets/energy_flow_card.dart';
|
|
import 'package:etm_powersync_app/models/energy_data.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
/// Largeur contrainte : le schéma est un carré, et en pleine largeur de la fenêtre de test
|
|
/// (800 px) il déborde des 600 px de haut — le nœud « Maison » se retrouve hors écran et
|
|
/// aucune touche ne l'atteint.
|
|
Widget _harness({double? evChargerPowerW}) => MediaQuery(
|
|
data: const MediaQueryData(disableAnimations: true),
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: Center(
|
|
child: SizedBox(
|
|
width: 340,
|
|
child: EnergyFlowCard(
|
|
data: const EnergyData(homePower: 4000, pvPower: 5000),
|
|
evChargerPowerW: evChargerPowerW,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
/// `pumpAndSettle` est inutilisable ici : les particules du schéma tournent en boucle
|
|
/// (`repeat()`), et `disableAnimations` ne change que la valeur lue, pas le contrôleur. On
|
|
/// avance donc d'un nombre fini de trames.
|
|
Future<void> _poser(WidgetTester tester) async {
|
|
for (var i = 0; i < 6; i++) {
|
|
await tester.pump(const Duration(milliseconds: 120));
|
|
}
|
|
}
|
|
|
|
/// Ouvre le détail de consommation — il n'est atteignable qu'en touchant « Maison ».
|
|
///
|
|
/// Le `_poser` AVANT la touche n'est pas décoratif : les nœuds entrent en `ScaleTransition`
|
|
/// et, sur la première trame, leur échelle vaut zéro — la touche traverse sans rien
|
|
/// atteindre, silencieusement.
|
|
Future<void> _ouvrirConso(WidgetTester tester) async {
|
|
await _poser(tester);
|
|
await tester.tap(find.text('Maison'));
|
|
await _poser(tester);
|
|
}
|
|
|
|
void main() {
|
|
testWidgets('la vue d\'ensemble ne parle pas d\'estimation — tout y est mesuré',
|
|
(tester) async {
|
|
await tester.pumpWidget(_harness());
|
|
await _poser(tester);
|
|
expect(find.textContaining('Répartition estimée'), findsNothing);
|
|
});
|
|
|
|
testWidgets('la vue consommation ANNONCE que trois branches sont estimées',
|
|
(tester) async {
|
|
await tester.pumpWidget(_harness(evChargerPowerW: 0));
|
|
await _ouvrirConso(tester);
|
|
|
|
final note = find.textContaining('Répartition estimée');
|
|
expect(note, findsOneWidget);
|
|
final texte = tester.widget<Text>(note).data!;
|
|
// Les trois branches sont NOMMÉES : « certaines valeurs sont estimées » laisserait
|
|
// chercher lesquelles, et quatre chiffres en kW se ressemblent tous.
|
|
expect(texte, contains('PAC'));
|
|
expect(texte, contains('eau chaude'));
|
|
expect(texte, contains('autres usages'));
|
|
expect(texte, contains('Seule la voiture est mesurée'));
|
|
});
|
|
|
|
testWidgets('sans borne, la voiture affiche « non lu » — jamais 0,0 kW',
|
|
(tester) async {
|
|
// 3,6 kW en dur vivait ici, voiture débranchée, sur le premier écran de l'app.
|
|
// Le remplacer par un zéro aurait échangé une fiction contre une autre : « rien ne
|
|
// charge » n'est pas « je ne mesure rien ».
|
|
await tester.pumpWidget(_harness());
|
|
await _ouvrirConso(tester);
|
|
|
|
expect(find.text('non lu'), findsOneWidget);
|
|
expect(find.textContaining('3.6'), findsNothing);
|
|
});
|
|
|
|
testWidgets('avec une borne, elle affiche la puissance mesurée', (tester) async {
|
|
await tester.pumpWidget(_harness(evChargerPowerW: 3907));
|
|
await _ouvrirConso(tester);
|
|
|
|
expect(find.text('3.9 kW'), findsOneWidget);
|
|
expect(find.text('non lu'), findsNothing);
|
|
});
|
|
}
|