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