From 5597706262ddcd05666bd699cb57b678ff2ec9b2 Mon Sep 17 00:00:00 2001 From: "francois.grand" <francois.grand@irstea.fr> Date: Thu, 7 Jun 2018 09:57:41 +0200 Subject: [PATCH] =?UTF-8?q?=20#45=20impl=C3=A9mentation=20de=20la=20r?= =?UTF-8?q?=C3=A9f=C3=A9rence=20=C3=A0=20un=20r=C3=A9sultat=20compl=C3=A9m?= =?UTF-8?q?entaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spec/value_ref/value_ref_section.spec.ts | 49 ++++++++++++++++++++++++ src/nub.ts | 6 +++ src/param/param-base.ts | 8 ++++ src/param/param-definition.ts | 27 ++++++++----- src/param/param-values.ts | 8 ++++ src/value_ref/object_ref.ts | 32 ++++++++++++++++ 6 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 spec/value_ref/value_ref_section.spec.ts diff --git a/spec/value_ref/value_ref_section.spec.ts b/spec/value_ref/value_ref_section.spec.ts new file mode 100644 index 00000000..58d7479d --- /dev/null +++ b/spec/value_ref/value_ref_section.spec.ts @@ -0,0 +1,49 @@ +import { SectionParametree } from "../../src/section/section_nub"; +import { acSection } from "../../src/section/section_type"; +import { cSnTrapez, ParamsSectionTrapez } from "../../src"; + +/** + * IMPORTANT ! + * Décommenter temporairement la ligne suivante (import { } from "./mock_jasmine") + * Pour exécuter ce code dans le débugger. + * Faire de même avec le fichier test_func.ts + */ +// import { describe, expect, it, xdescribe, xit } from "../mock_jasmine"; + +let nub1: SectionParametree; +let nub2: SectionParametree; +let prm1: ParamsSectionTrapez; +let prm2: ParamsSectionTrapez; + +/** + * crée l'environnement de test. + * répété à chaque test car il manque un mock de beforeEach + */ +function createEnv() { + // Nub maître + nub1 = new SectionParametree(new cSnTrapez(new ParamsSectionTrapez(1, 0.5, 1, 0.01, 1, 0.01, 0.01, 2))); + prm1 = nub1.parameters as ParamsSectionTrapez; + + // Nub esclave + nub2 = new SectionParametree(new cSnTrapez(new ParamsSectionTrapez(1, 0.5, 1, 0.01, 1, 0.01, 0.01, 2))); + prm2 = nub2.parameters as ParamsSectionTrapez; +} + +describe("référence d'un paramètre à un autre : ", () => { + describe("résultat complémentaire/section : ", () => { + it("test 1", () => { + // cas de figure : + // nub2.Y est lié au résultat complémentaire Yf de nub1 + // lecture de nub2.Y + + createEnv(); + + prm2.Y.v = 0; // valeur esclave, doit être masquée par la valeur maître (cad prm1.Yf) + prm2.Y.defineReference(nub1, ".Yf"); + + nub1.CalcSerie(); + + expect(prm2.Y.v).toEqual(1); + }); + }); +}); diff --git a/src/nub.ts b/src/nub.ts index 79696d1d..de4cdbaf 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -160,4 +160,10 @@ export abstract class Nub extends ComputeNode implements IReferencedObject { return this.CalcSerie(0.001, 0.1, desc); } + + public getReferencedExtraResult(desc: string): any { + const tmp: string[] = desc.split("."); + const r: Result = this.getReferencedResult(tmp[0]); + return r.getExtraResult(tmp[1]); + } } diff --git a/src/param/param-base.ts b/src/param/param-base.ts index 6712c7ff..7eaae19a 100644 --- a/src/param/param-base.ts +++ b/src/param/param-base.ts @@ -154,6 +154,10 @@ export class BaseParam extends JalhydObject implements IObjectReference { this._paramValues.defineReference(target, desc); } + public get referenceDesc(): string { + return this._paramValues.referenceDesc; + } + public get isReferenceDefined(): boolean { return this._paramValues.isReferenceDefined; } @@ -165,4 +169,8 @@ export class BaseParam extends JalhydObject implements IObjectReference { public get referencedResult(): Result { return this._paramValues.referencedResult; } + + public get referencedExtraResult(): any { + return this._paramValues.referencedExtraResult; + } } diff --git a/src/param/param-definition.ts b/src/param/param-definition.ts index ef4f2f1b..8a90e7ed 100644 --- a/src/param/param-definition.ts +++ b/src/param/param-definition.ts @@ -45,17 +45,24 @@ export class ParamDefinition extends BaseParam { } get v(): number { - if (this.isReferenceDefined) - switch (this.referencedParamValues.valueMode) { - case ParamValueMode.CALCUL: - const r = this.referencedResult; - if (r.nbResultElements == 1) - return r.resultElement.vCalc; - throw new Error(`il n'y a pas exactement un ResultElement dans le Result "${r.name}"`); - - default: - return this.referencedParamValues.currentValue; + if (this.isReferenceDefined) { + const parts: string[] = this.referenceDesc.split("."); + + if (parts.length === 1) { + switch (this.referencedParamValues.valueMode) { + case ParamValueMode.CALCUL: + const r = this.referencedResult; + if (r.nbResultElements == 1) + return r.resultElement.vCalc; + throw new Error(`il n'y a pas exactement un ResultElement dans le Result "${r.name}"`); + + default: + return this.referencedParamValues.currentValue; + } } + else + return this.referencedExtraResult; + } else switch (this.paramValues.valueMode) { case ParamValueMode.SINGLE: diff --git a/src/param/param-values.ts b/src/param/param-values.ts index 9f6fb677..1b13d34c 100644 --- a/src/param/param-values.ts +++ b/src/param/param-values.ts @@ -286,6 +286,10 @@ export class ParamValues implements IObjectReference { this._valueRef.defineReference(target, desc); } + public get referenceDesc(): string { + return this._valueRef.referenceDesc; + } + public get isReferenceDefined(): boolean { return this._valueRef.isReferenceDefined; } @@ -297,4 +301,8 @@ export class ParamValues implements IObjectReference { public get referencedResult(): Result { return this._valueRef.referencedResult; } + + public get referencedExtraResult(): any { + return this._valueRef.referencedExtraResult; + } } diff --git a/src/value_ref/object_ref.ts b/src/value_ref/object_ref.ts index 1591dff8..39d87bda 100644 --- a/src/value_ref/object_ref.ts +++ b/src/value_ref/object_ref.ts @@ -17,6 +17,12 @@ export interface IReferencedObject { * @param desc : description sous forme symbolique */ getReferencedResult(desc: string): Result; + + /** + * getter du résultat complémentaire + * @param desc : description sous forme symbolique + */ + getReferencedExtraResult(desc: string): any; } /** @@ -30,6 +36,11 @@ export interface IObjectReference { */ defineReference(target: IReferencedObject, desc: string): void; + /** + * description symbolique de la référence + */ + readonly referenceDesc: string; + /** * true si la référence a été définie */ @@ -44,6 +55,11 @@ export interface IObjectReference { * instance de Result référencée */ readonly referencedResult: Result; + + /** + * instance de résultat complémentaire référencée + */ + readonly referencedExtraResult: any; } /** @@ -59,6 +75,13 @@ export class ObjectReference implements IObjectReference { this._refDefinition = desc; } + /** + * description symbolique de la référence + */ + public get referenceDesc(): string { + return this._refDefinition; + } + public get isReferenceDefined(): boolean { return this._referencedObject !== undefined && this._refDefinition !== undefined; } @@ -83,4 +106,13 @@ export class ObjectReference implements IObjectReference { public get referencedResult(): Result { return this._referencedObject.getReferencedResult(this._refDefinition); } + + /** + * instance de résultat complémentaire référencée + */ + public get referencedExtraResult(): any { + const tmp: string[] = this._refDefinition.split("."); + const r: Result = this._referencedObject.getReferencedResult(tmp[0]); + return r.getExtraResult(tmp[1]); + } } -- GitLab