Patrick Schurig d4b7d4dced test(décisions): référence au bit près des scénarios de simulation (brief 4 T0.5)
Preuve « sans endpoint = identique au bit près », posée AVANT tout refactoring.

`nymea-energy-decisions` est la suite `simulation` compilée à l'identique, plus un
enregistreur branché à l'édition de liens (`--wrap`) : aucune ligne de la suite ni du
moteur n'est modifiée. Chaque cycle (`simulationCallUpdate`) écrit une ligne NDJSON :
télémétrie de l'arbitre (actions du créneau dans l'ordre, motifs, niveaux, budget, soutirage,
consigne posée), actions laissées au proxy, état des Things. Les scénarios qui interrogent
un `RuleBasedScheduler` local voient leur `Plan` sérialisé champ par champ.

Exclus : `command.since` et les compteurs `totalEnergy*` du mock (horloge murale), les
ThingId (alias par rang dans le créneau, à chaque ligne : deux bornes identiques
reçoivent leur rang provisionné dans l'ordre d'un QHash). `planId` n'est pas lu.

Référence générée sur 83483cc (1.15.2+etm69) : 66 fonctions, 23 673 cycles + 36 plans
directs, deux exécutions identiques à l'octet. Chaque processus a un /tmp privé : libnymea
range l'état de test sous /tmp/nymea-test, partagé et cumulatif (348 bornes orphelines
trouvées dans energy-load-configuration.json).

  tests/auto/decisions/run-decisions.sh <build> check

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:24:00 +02:00

51 lines
1.9 KiB
Prolog

# Décisions de référence (brief 4 T0.5) — la preuve « sans endpoint = identique au bit près ».
#
# Ce binaire est la suite `simulation`, compilée À L'IDENTIQUE (mêmes sources, même
# ENERGY_SIMULATION), plus un enregistreur. Aucune ligne de la suite n'est modifiée : le point
# d'écoute est posé à l'ÉDITION DE LIENS. `--wrap` redirige chaque appel de
# SmartChargingManager::simulationCallUpdate() fait par les scénarios vers
# decisionrecorder.cpp, qui appelle le vrai cycle puis sérialise ce qu'il a décidé.
#
# Lancer : tests/auto/decisions/run-decisions.sh (voir son en-tête).
include(../common/common.pri)
include(../../../energyplugin/energyplugin.pri)
include(../../mocks/spotmarketprovider/spotmarketdataprovidermock.pri)
CONFIG += testcase
TARGET = nymea-energy-decisions
DEFINES += ENERGY_SIMULATION
SIM = $$PWD/../simulation
INCLUDEPATH += $$SIM
RESOURCES += \
$$SIM/simulationresources.qrc
HEADERS += \
$$SIM/experience/energyexperienceenergymock.h \
$$SIM/experience/energyjsonhandler.h \
$$SIM/experience/energylogger.h \
$$SIM/experience/energymanagermock.h \
$$SIM/simulation.h \
$$SIM/simulationbase.h \
$$SIM/simulationtestpoint.h
SOURCES += \
$$SIM/experience/energyexperienceenergymock.cpp \
$$SIM/experience/energyjsonhandler.cpp \
$$SIM/experience/energylogger.cpp \
$$SIM/experience/energymanagermock.cpp \
$$SIM/simulation.cpp \
$$SIM/simulationbase.cpp \
$$SIM/simulationtestpoint.cpp \
decisionrecorder.cpp
# Noms mangés Itanium : SmartChargingManager::simulationCallUpdate(const QDateTime &) (chaque
# cycle des scénarios) et RuleBasedScheduler::getPlan(const SurplusContext &) (les scénarios qui
# interrogent le planificateur directement, sans arbitre).
QMAKE_LFLAGS += -Wl,--wrap=_ZN20SmartChargingManager20simulationCallUpdateERK9QDateTime
QMAKE_LFLAGS += -Wl,--wrap=_ZN18RuleBasedScheduler7getPlanERK14SurplusContext