/// <reference path="../node_modules/@types/jasmine/index.d.ts" />

import { Result } from "../src/base";
import { precDist, equalEpsilon } from "./nubtest";
import { ParamsSectionRectang, cSnRectang } from "../src/section/section_rectang";
import { cLog } from "../src/util/log";
import { MessageCode } from "../src/util/message";

let paramSection: ParamsSectionRectang;
let sect: cSnRectang;

function check(val1: number, val2: number) {
    expect(equalEpsilon(val1, val2)).toBeTruthy("expected " + val2 + ", got " + val1);
}

describe('Section paramétrée rectangulaire : ', () => {
    beforeEach(() => {
        paramSection = new ParamsSectionRectang(0.8, // tirant d'eau
            2.5, // largeur de fond
            40, //  Ks=Strickler
            10,  //  Q=Débit
            0.001, //  If=pente du fond
            1e-10, // précision
            1 // YB= hauteur de berge
        );

        sect = new cSnRectang(new cLog(), paramSection);
        sect.newtonMaxIter = 5;
    });

    describe('non convergence de la méthode de Newton :', () => {
        it('hauteur critique', () => {
            sect.Calc("Yc");
            expect(sect.log.messages.length).toEqual(1);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
        });

        it('hauteur normale', () => {
            sect.Calc("Yn");
            expect(sect.log.messages.length).toEqual(2);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HNORMALE);
        });

        it('hauteur normale, pente négative', () => {
            sect.prms.If.v = -0.001;
            sect.Calc("Yn");
            expect(sect.log.messages.length).toEqual(1);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_PENTE_NEG_NULLE_HNORMALE_INF);
        });

        it('hauteur fluviale, Y < Yc', () => {
            sect.Calc("Yf");
            expect(sect.log.messages.length).toEqual(3);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU);
        });

        it('hauteur fluviale, Y > Yc', () => {
            sect.prms.Y.v = 2;
            sect.Calc("Yf");
            expect(sect.log.messages.length).toEqual(1);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
        });

        it('hauteur torrentielle, Y < Yc', () => {
            sect.Calc("Yt");
            expect(sect.log.messages.length).toEqual(1);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
        });

        it('hauteur torrentielle, Y > Yc', () => {
            sect.prms.Y.v = 2;
            sect.Calc("Yt");
            expect(sect.log.messages.length).toEqual(2);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR);
        });

        it('hauteur conjuguée, Froude < 1', () => {
            sect.prms.Y.v = 2;
            sect.Calc("Yco");
            console.log(sect.log.toString());
            expect(sect.log.messages.length).toEqual(3);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HTOR);
            expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG);
        });

        it('hauteur conjuguée, Froude > 1', () => {
            sect.Calc("Yco");
            expect(sect.log.messages.length).toEqual(4);
            expect(sect.log.messages[0].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[1].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCRITIQUE);
            expect(sect.log.messages[2].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HFLU);
            expect(sect.log.messages[3].code).toEqual(MessageCode.ERROR_SECTION_NON_CONVERGENCE_NEWTON_HCONJUG);
        });
    });
});