diff --git a/spec/mock_jasmine.ts b/spec/mock_jasmine.ts index e96e1e8ce6dd5e211c9f9172a99634bd29a59663..cfb6a3974fab8933d736c34008a59a540fceb2da 100644 --- a/spec/mock_jasmine.ts +++ b/spec/mock_jasmine.ts @@ -83,7 +83,7 @@ class Expect { public toEqual(expected: any) { const res = this.actual === expected; if (!res) { - console.warn("Test 'to be equal to' failed"); + console.warn(`Test ${this.actual} 'to be equal to' ${expected} failed`); } return res; } diff --git a/spec/value_ref/value_ref.spec.ts b/spec/value_ref/value_ref.spec.ts index c9ba1ddda21ee4ad1f2dc57556e3905f6a3cd454..82ed531ea7af2861f4a8d7cb79e7880a30f29053 100644 --- a/spec/value_ref/value_ref.spec.ts +++ b/spec/value_ref/value_ref.spec.ts @@ -4,7 +4,7 @@ * 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"; +// import { describe, expect, it, xdescribe, xit } from "../mock_jasmine"; import { NubTest, NubTestParams } from "../nubtest"; import { precDigits } from "../test_config"; @@ -121,7 +121,7 @@ describe("référence d'un paramètre à un autre : ", () => { expect(nub1.Calc("C").vCalc).toBeCloseTo(3, precDigits); expect(nub2.Calc("A").vCalc).toBeCloseTo(0, precDigits); - //expect(nub2.Calc("B").vCalc).toBeCloseTo(3, precDigits); // échoue car l'écriture du paramètre esclave n'affecte pas la valeur maître + //expect(nub2.Calc("B").vCalc).toBeCloseTo(3, precDigits); // échoue car l'écriture du paramètre esclave (pendant la dichotomie) n'affecte pas la valeur maître; la relecture du paramètre esclave ne reflète pas la valeur écrite expect(nub2.Calc("C").vCalc).toBeCloseTo(3, precDigits); }); @@ -154,12 +154,12 @@ describe("référence d'un paramètre à un autre : ", () => { createEnv(); - prm1.C.v = 10; // valeur maître bidon + prm1.B.v = 5; prm1.C.paramValues.valueMode = ParamValueMode.CALCUL; prm2.A.v = 0; // valeur esclave (doit être masquée par la valeur maître, cad prm1.C, normalement 3) prm2.A.defineReference(nub1, "C"); - expect(prm2.A.v).toBeCloseTo(3, precDigits); + expect(prm2.A.v).toBeCloseTo(6, precDigits); }); it('test 2', () => { @@ -211,14 +211,10 @@ describe("référence d'un paramètre à un autre : ", () => { createEnv(); - const min = 1; - const max = 5; - const step = 1; - - const input = [1, 2, 3, 4, 5]; + const input = [2, 3, 4, 5, 6]; const pv = prm1.A.paramValues; pv.setValues(input); - prm2.A.v = 0; // valeur esclave bidon, doit être masquée par la valeur maître (cad prm1.A, normalement [1,2,3,4,5]) + prm2.A.v = 0; // valeur esclave bidon, doit être masquée par la valeur maître (cad prm1.A, normalement [2,3,4,5,6]) prm2.A.defineReference(nub1, "A"); const r: Result = nub2.CalcSerie(0.001, 0.1, "C"); diff --git a/src/param/param-base.ts b/src/param/param-base.ts index 7e21c6314a7e3641416519e3a6df4eb37ceef49b..6712c7ffd48d533b9da321b23668bc32b069e498 100644 --- a/src/param/param-base.ts +++ b/src/param/param-base.ts @@ -35,8 +35,6 @@ export class BaseParam extends JalhydObject implements IObjectReference { this._paramValues = new ParamValues(); this._paramValues.setSingleValue(val); - if (val !== undefined) - this._paramValues.valueMode = ParamValueMode.SINGLE; if (d instanceof ParamDomain) { this._domain = d; @@ -80,7 +78,7 @@ export class BaseParam extends JalhydObject implements IObjectReference { throw e; } - return this._paramValues.singleValue; + return this._paramValues.currentValue; } public setValue(val: number) { diff --git a/src/param/param-definition.ts b/src/param/param-definition.ts index 070880604eb042f354d4e9eec4ba7284b5e2278e..ef4f2f1b5518c815049d8a6a4a8db4e3f25f32ec 100644 --- a/src/param/param-definition.ts +++ b/src/param/param-definition.ts @@ -45,7 +45,27 @@ export class ParamDefinition extends BaseParam { } get v(): number { - return super.getValue(); + 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; + } + else + switch (this.paramValues.valueMode) { + case ParamValueMode.SINGLE: + case ParamValueMode.LISTE: + case ParamValueMode.MINMAX: + return super.getValue(); + + default: + throw new Error(`mode de valeur ${ParamValueMode[this.paramValues.valueMode]} incorrect pour le paramètre`); + } } set v(val: number) { diff --git a/src/param/param-values.ts b/src/param/param-values.ts index 8486a6d42d9d9ec4aa1dedc730ddf00ad9351a16..9f6fb677beeec12e7ac742727dad5d0f5e3cc852 100644 --- a/src/param/param-values.ts +++ b/src/param/param-values.ts @@ -36,6 +36,11 @@ export class ParamValues implements IObjectReference { */ private _valueList: number[]; + /** + * valeur courante (éventuellement non définie) indépendemment du mode + */ + private _currentValue: DefinedNumber; + /** * itérateur courant */ @@ -48,6 +53,7 @@ export class ParamValues implements IObjectReference { constructor() { this._singleValue = new DefinedNumber(); + this._currentValue = new DefinedNumber(); this._valueRef = new ObjectReference(); } @@ -56,16 +62,19 @@ export class ParamValues implements IObjectReference { if (max == undefined) { this._valueMode = ParamValueMode.SINGLE; this._singleValue.value = o as number; + this._currentValue.value = o as number; } else { this._valueMode = ParamValueMode.MINMAX; this._minValue = o as number; this._maxValue = max; this._stepValue = step; + this._currentValue.undefine(); } } else if (Array.isArray(o)) { this._valueMode = ParamValueMode.LISTE; this._valueList = o; + this._currentValue.undefine(); } else throw new Error(`ParamValues.setValues() : appel invalide`); @@ -122,6 +131,18 @@ export class ParamValues implements IObjectReference { } } + /** + * valeur courante + */ + public get currentValue(): number { + if (this.isReferenceDefined) + return this._valueRef.referencedParamValues.currentValue; + return this._currentValue.value; + } + + /** + * valeur dans le mode SINGLE + */ public get singleValue(): number { if (this.isReferenceDefined) return this._valueRef.referencedParamValues.singleValue; @@ -135,6 +156,7 @@ export class ParamValues implements IObjectReference { public setSingleValue(v: number) { this._valueMode = ParamValueMode.SINGLE; this._singleValue.value = v; + this._currentValue.value = v; } public get isDefined() { @@ -253,8 +275,8 @@ export class ParamValues implements IObjectReference { * @return prochaine valeur à parcourir par l'itérateur courant */ public get next(): number { - this._singleValue.value = this._iterator.next().value; - return this._singleValue.value; + this._currentValue.value = this._iterator.next().value; + return this._currentValue.value; } // interface IObjectReference