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 0000000000000000000000000000000000000000..58d7479d557aebaf34efefa07b510ee03b17bb7b --- /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 79696d1da912e9f01721d4c34e2d6a3554d31e69..de4cdbaf048ca391f340445808708ae2ec76407d 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 6712c7ffd48d533b9da321b23668bc32b069e498..7eaae19a184d3786f8580ba3d321ce39aeea6317 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 ef4f2f1b5518c815049d8a6a4a8db4e3f25f32ec..8a90e7ed028c43fd0a034071f7cb2a4e65a876b5 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 9f6fb677beeec12e7ac742727dad5d0f5e3cc852..1b13d34cca83a535c940323ad82e7c251b661dd2 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 1591dff85810cefc4437b93d97fb7af0db474fba..39d87bda503fbba82bd4c4537ee082dfe463cd1d 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]); + } }