etm-powersync-app/test/flux_signe_test.dart
Patrick Schurig b3000ca2d5 fix(écran): trois défauts trouvés sur appareil, dont un de forme et un de moi
Passage sur le Redmi contre `.75`. Aucun des trois n'était visible en test.

1. LA PRODUCTION S'AFFICHAIT NÉGATIVE — « -8.9 kW · Solaire » sous 9 kW de
   soleil. `currentPowerProduction` est publié négatif par nymea et le service
   garde les signes bruts par politique ; la carte imprimait la valeur telle
   quelle. Ce qui rend le défaut net plutôt qu'opinable : la même carte
   normalisait DÉJÀ le réseau et la batterie par `.abs()` — la branche solaire
   était la seule oubliée, donc un oubli et non une convention.

2. LE LIBELLÉ SE COUPAIT AU MILIEU DU MOT — « Autoconsommat / ion », alors que
   le commentaire du code disait vouloir l'éviter. La cause n'est pas la
   longueur mais l'ÉCHELLE du texte : police système au-dessus de 100 %, et
   `maxLines: 2` ne protège de rien puisque Flutter coupe un mot long sans
   espace, sans même afficher l'ellipse. `FittedBox(scaleDown)` garde le mot
   entier et ne fait rien quand la place suffit.

3. MA LIGNE DES RATIOS RÉPÉTAIT LES TUILES — « Instantané depuis 09:23 —
   autoconsommation 52 %, autonomie 54 % » sous des tuiles affichant 52 % et
   54 %. Les deux chemins étaient corrects et les valeurs coïncidaient vraiment
   (bilan 51,8/54,1 sur 00:00→16:45, box 51,9/53,7 depuis 09:23). Rien de faux,
   et illisible quand même : je déclenchais sur l'ORIGINE, alors qu'un lecteur
   compare des NOMBRES. La ligne sort désormais quand l'origine diffère ET que
   l'écart dépasse 2 points ; le relevé du jour est devenu un test.

Vérifié à l'écran après correction : le libellé tient sur une ligne, la ligne des
ratios se tait. Le signe, lui, N'A PAS pu être revu — la production du banc était
retombée à 0 W à 17:03, et `abs(0) == 0`. Une correction qu'on ne peut pas voir
demande une garde qui se voit : `flux_signe_test.dart` la pose.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw
2026-09-05 17:07:20 +02:00

49 lines
2.3 KiB
Dart

/// **Une production ne s'affiche pas en négatif.**
///
/// Vu sur appareil le 2026-09-05 à 16:52 : « **-8.9 kW · Solaire** » sous un soleil de
/// 9 kW. `Energy.GetPowerBalance` publiait `currentPowerProduction: -8980.4` — nymea donne
/// la production en négatif, et `NymeaService` garde les signes bruts par politique (§7.1).
/// La carte imprimait donc la valeur telle quelle.
///
/// Ce qui rend le défaut net plutôt qu'opinable : **la même carte normalisait déjà** le
/// réseau et la batterie par `.abs()`. La branche solaire était la seule oubliée — donc ce
/// n'était pas une convention d'affichage assumée, c'était un oubli.
///
/// Ce test existe parce que l'écran ne pouvait plus le montrer : à 17:03 la production du
/// banc était retombée à 0 W, et `abs(0) == 0`. Une correction qu'on ne peut pas voir
/// demande une garde qui, elle, se voit.
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';
Future<void> _poser(WidgetTester tester, EnergyData d) async {
await tester.binding.setSurfaceSize(const Size(1000, 1600));
addTearDown(() => tester.binding.setSurfaceSize(null));
await tester.pumpWidget(
MaterialApp(home: Scaffold(body: EnergyFlowCard(data: d))));
await tester.pump(const Duration(seconds: 2));
}
void main() {
testWidgets('la production publiée NÉGATIVE s\'affiche positive', (tester) async {
// La charge utile réelle du 2026-09-05 16:52.
await _poser(tester, const EnergyData(pvPower: -8980.4, homePower: 3249.4));
// -8 980,4 W -> 8,98 kW -> « 9.0 kW » à une décimale. (Sur appareil la valeur de
// l'instant donnait « -8.9 kW » ; c'est le SIGNE qui est en cause, pas l'arrondi.)
expect(find.text('9.0 kW'), findsOneWidget);
expect(find.text('-9.0 kW'), findsNothing,
reason: 'un client lirait « mes panneaux consomment 9 kW »');
});
testWidgets('zéro reste zéro — et ne prouve rien', (tester) async {
// L'état du banc à 17:03, celui qui a rendu la correction invisible à l'écran.
await _poser(tester,
const EnergyData(pvPower: 0, homePower: 3250, gridPower: 3250));
expect(find.text('0.0 kW'), findsOneWidget);
});
}