From 24e027ddbebe78e13eca69fdcfbedf93b37a8c7b Mon Sep 17 00:00:00 2001 From: "mathias.chouet" <mathias.chouet@irstea.fr> Date: Thu, 20 Feb 2020 14:42:18 +0100 Subject: [PATCH] Fix #198 - Solveur: stop calculation if Nub chain is variated --- spec/solveur/solveur.spec.ts | 11 +++++++++++ src/solveur/solveur.ts | 14 ++++++++++++++ src/util/message.ts | 3 +++ 3 files changed, 28 insertions(+) diff --git a/spec/solveur/solveur.spec.ts b/spec/solveur/solveur.spec.ts index fe3abc4e..6d3177ab 100644 --- a/spec/solveur/solveur.spec.ts +++ b/spec/solveur/solveur.spec.ts @@ -326,4 +326,15 @@ describe("solveur multi-modules", () => { }); + it("test 12: bug jalhyd#198", () => { + // tslint:disable-next-line:max-line-length + const sess = `{"header":{"source":"jalhyd","format_version":"1.3","created":"2020-02-19T15:58:34.204Z"},"settings":{"precision":1e-7,"maxIterations":100,"displayPrecision":3},"documentation":"","session":[{"uid":"dHczZm","props":{"calcType":"PabDimensions"},"meta":{"title":"PAB : dimensions"},"children":[],"parameters":[{"symbol":"L","mode":"MINMAX","min":1,"max":4,"step":0.15,"extensionStrategy":0},{"symbol":"W","mode":"SINGLE","value":0.6397826086956476},{"symbol":"Y","mode":"SINGLE","value":0.5},{"symbol":"V","mode":"CALCUL"}]},{"uid":"NWtydz","props":{"calcType":"PabPuissance"},"meta":{"title":"PAB : puissance"},"children":[],"parameters":[{"symbol":"DH","mode":"SINGLE","value":0.3},{"symbol":"Q","mode":"SINGLE","value":0.1},{"symbol":"V","mode":"LINK","targetNub":"dHczZm","targetParam":"V"},{"symbol":"PV","mode":"CALCUL"}]},{"uid":"Ympkdj","props":{"calcType":"Solveur","nubToCalculate":"NWtydz","searchedParameter":"dHczZm/W"},"meta":{"title":"Solveur"},"children":[],"parameters":[{"symbol":"Xinit","mode":"SINGLE","value":1},{"symbol":"Ytarget","mode":"SINGLE","value":230}]}]}`; + Session.getInstance().clear(); + Session.getInstance().unserialise(sess); + const s = Session.getInstance().findNubByUid("Ympkdj") as Solveur; + const res = s.CalcSerie(); + expect(res.vCalc).toBeUndefined(); + expect(res.log.messages.length).toBe(1); + expect(res.log.messages[0].code).toBe(MessageCode.ERROR_SOLVEUR_NO_VARIATED_PARAMS_ALLOWED); + }); }); diff --git a/src/solveur/solveur.ts b/src/solveur/solveur.ts index b47ed776..7a1bd6a5 100644 --- a/src/solveur/solveur.ts +++ b/src/solveur/solveur.ts @@ -7,6 +7,7 @@ import { Observer } from "../util/observer"; import { Result } from "../util/result"; import { ResultElement } from "../util/resultelement"; import { SolveurParams } from "./solveur_params"; +import { Message, MessageCode } from "../util/message"; export class Solveur extends Nub implements Observer { @@ -128,6 +129,19 @@ export class Solveur extends Nub implements Observer { this.properties.setPropValue("searchedParameter", sp); } + /** + * Looks for potential errors before calling Nub.Calc() + */ + public Calc(sVarCalc?: string, rInit?: number): Result { + const r: Result = new Result(new ResultElement()); + if (this.nubToCalculate.resultHasMultipleValues()) { + r.resultElement.addMessage(new Message(MessageCode.ERROR_SOLVEUR_NO_VARIATED_PARAMS_ALLOWED)); + this.currentResult = r; + return this.result; + } + return super.Calc(sVarCalc, rInit); + } + public CalcSerie(rInit?: number): Result { // affect initial value of X for Dichotomie search this.prms.X.singleValue = this.prms.Xinit.currentValue; diff --git a/src/util/message.ts b/src/util/message.ts index c0e9f74d..1c18cd4e 100644 --- a/src/util/message.ts +++ b/src/util/message.ts @@ -166,6 +166,9 @@ export enum MessageCode { /** Aucune ligne d'eau ne peut être calculée (aucun tirant d'eau à l'amont ni nà l'aval) */ ERROR_REMOUS_NO_WATER_LINE, + /** Solveur : interdiction de faire varier des paramètres dans le Nub calculé */ + ERROR_SOLVEUR_NO_VARIATED_PARAMS_ALLOWED, + /** * internationalisation : langue non prise en charge */ -- GitLab